TIL/개념정리

테라폼 ec2 튜토리얼

초집중 2023. 12. 15. 20:16

테라폼 ec2 튜토리얼

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.16"
    }
  }

  required_version = ">= 1.2.0"
}

provider "aws" {
  region  = "ap-northeast-2"
}

# 리소스 유형, 이름
resource "aws_instance" "app_server" { # 고유 아이디로 생서됨
  ami           = "ami-05e02e6210658716f" # 우분투
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleAppServerInstance"
  }
}

 

리전마다 ami는 다르다

resource "aws_instance" "app_server" { # terraform에서 생성되는 고유아이디
  ami           = "ami-05e02e6210658716f" # 우분투
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleAppServerInstance" # 실제 ec2가 만들어질 때 생성되는 ec2명
  }
}

 

terraform init # 공급자 플러그인 설치, 백엔드 구성, 작업 디렉토리 초기화, 필수 모듈 설치
terraform plan
terraform apply # 변경사항 적용하고 로컬에서 리소스를 생성, 업데이트 혹은 삭제

테라폼 구성이 변경될 때마다 init과 apply 워크플로우가 반복된다

apply는 인프라 리소스가 변경되므로 init 후 plan을 확인해보면 좋다

 

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_s3_bucket" "terraform_bucket" { # 로컬 테라폼에서만 사용되는 id
    bucket = "bjc-s3-terraform-test"
}

적용된 resource는 state 파일에 저장된다.

 

따로 설정하지 않아 로컬에 terraform.tfstate가 만들어졌지만 여러 사람이 작업해야하므로 state 파일은 따로 두지 않는다고 합니다. s3에 저장하는게 일반적이고 backend라고 합니다.

 

이때 주의해야할 점이 terraform.tfstate 파일은 리소스 정보를 저장하고 있기 때문에 유출에 주의해야합니다.

이 외에도 테라폼에 반영되지않은 수정사항이 있는데 테라폼으로 리소스를 다시 올리게 된다면 해당 수정사항이 삭제되기 때문에 주의해야합니다

 

에러

stsPlan: 6 to add, 0 to change, 0 to destroy.
╷
│ Error: Invalid function argument
│ 
│   on main.tf line 108, in resource "aws_key_pair" "auth":
│  108:   public_key = file(var.public_key_path)
│     ├────────────────
│     │ while calling file(path)
│     │ var.public_key_path is "~/.ssh"
│ 
│ Invalid value for "path" parameter: failed to read file: read /Users/byeongjuchoi/.ssh: is a directory

 

인증관련 문제. 다시 엑세스키를 발급받아 해결

 

╷
│ Error: creating EC2 Instance: Unsupported: Your requested instance type (t2.micro) is not supported in your requested Availability Zone (ap-northeast-2b). Please retry your request by not specifying an Availability Zone or choosing ap-northeast-2a, ap-northeast-2c.
│       status code: 400, request id: f
│ 
│   with aws_instance.web,
│   on main.tf line 111, in resource "aws_instance" "web":
│  111: resource "aws_instance" "web" {
│ 
╵
╷
│ Error: remote-exec provisioner error
│ 
│   with aws_instance.web,
│   on main.tf line 149, in resource "aws_instance" "web":
│  149:   provisioner "remote-exec" {
│ 
│ host for provisioner cannot be empty

 

실행 중 실패하게 되면 트랜잭션처럼 취소되는게 아니라 실행된 부분까지 남아있게 되므로 destroy를 실행시켜야합니다