본문 바로가기
IaC/Terraform

[Terraform] Terraform으로 EC2 생성하기

by chan10 2025. 8. 4.

테라폼에서는 `.tf` 확장자를 가진 여러 파일에 코드를 나눠 작성합니다. 파일 이름은 반드시 정해진 규칙이 있는 것은 아니며, 작성된 코드의 내용에 따라 동작하게 됩니다. 예를 들어 `resource`, `provider`, `output` 등의 키워드로 코드의 성격이 구분되며, 테라폼은 모든 `.tf` 파일을 하나의 구성으로 인식하여 처리합니다.

 

테라폼 리소스 정의

저는 `Terraform`이라는 폴더를 만들고, 그 안에 `aws/ec2/ `경로를 생성한 후 총 4개의 `.tf `확장자를 가진 테라폼 파일을 작성했습니다.

main.tf 생성할 리소스를 정의합니다.
outputs.tf 리소스를 생성한 후 출력할 값을 정의합니다.
provider.tf AWS, Azure 등과 같은 클라우드 환경 설정 및 인증 정보를 정의합니다.
variables.tf 리소스 생성에 사용할 변수 값을 정의합니다.

 

테라폼에서 사용하는 파일 이름은 크게 중요하지 않습니다. 각 파일에 어떤 코드가 작성되어 있는지는 내용에 포함된 키워드에 따라 동작하기 때문에, `resource`, `provider`와 같은 키워드로 각 파일의 성격이 구분됩니다.

 

📌 `main.tf` - 리소스 정의 파일

이 파일에는 생성할 인프라 리소스를 정의합니다. 예를 들어, 저는 EC2 인스턴스를 생성하는 코드를 `main.tf` 파일에 작성했습니다. 해당 코드는 다음과 같이 `resource` 키워드로 시작합니다.

[main.tf]

resource "aws_instance" "example" {
    ami = "ami-0c76973fbe0ee100c"
    instance_type = var.instance_type
    key_name                    = "ec2_key"          # 미리 생성한 키페어 이름
    vpc_security_group_ids      = ["sg-0c379474877c47488"]          # 보안 그룹 ID (사전에 생성 필요)
    subnet_id                   = var.subnet_id        # 서브넷 ID (사전에 생성 필요)
    associate_public_ip_address = false

}
  • `aws_instance`는 EC2 인스턴스를 생성하기 위한 테라폼 리소스 모듈입니다.
  • `"example"`은 테라폼 내부에서 리소스를 식별하기 위한 논리적 이름으로, 원하는 이름으로 지정 가능합니다.
  • `ami`, `instance_type` 등은 Terraform에서 사전에 정의된 인자로, 정확한 이름으로 사용해야 하며 임의로 변경할 수 없습니다.

각 리소스에 사용할 수 있는 변수 종류는 Terraform Registry 공식 홈페이지에서 확인할 수 있으며, 필수 항목과 필요한 옵션만 골라서 작성하면 됩니다.

 

📌 `provider.tf`- 배포 환경 정의 파일

`provider`키워드는 어떤 클라우드 환경에서 리소스를 배포할 것인지를 지정합니다.

배포 환경인 `aws`를 작성하고 `region`, `access_key`, `secret_key`는 AWS 접근을 위해 필수적으로 요구되는 정보입니다. 실제 프로젝트에서는 민감한 정보는 하드코딩하지 않고 변수 또는 환경변수를 사용해 관리하는 것이 좋습니다.

[provider.tf]

provider "aws" {
  region     = "ap-northeast-2"
  access_key = var.access_key_test
  secret_key = var.secret_key_test
}

variable access_key_test {
    type = string
    default = "xxxxxxxxxxxxxxxxx"
}
variable secret_key_test {
    type = string
    default = "xxxxxxxxxxxxxxxxx"
}

 

📌 `variables.tf` - 변수 정의 파일

자주 사용되거나 공통적으로 쓰이는 값은 변수로 선언해 관리합니다. 예를 들어 EC2 인스턴스 타입을 변수로 지정할 수 있습니다.

[variables.tf]

variable "instance_type" {
    type = string
    default = "t3.micro"
}

variable "subnet_id" {
  type        = string
  default = "subnet-054f2d768a4bb1368"
}

이렇게 정의된 변수는 리소스 파일에서 다음과 같이 사용할 수 있습니다.

instance_type = var.instance_type

변수를 사용하면 코드의 재사용성과 유연성이 높아지며, 환경별로 손쉽게 설정을 바꿀 수 있습니다.

 

📌 `outputs.tf` - 출력 결과 정의 파일

이 파일에는 리소스 생성 후 확인하고 싶은 항목을 작성합니다. `output` 키워드를 사용해 다음과 같이 작성할 수 있습니다:

[outputs.tf]

output "instance_id" {
  description = "EC2 인스턴스 ID"
  value       = aws_instance.example.id
}

output "public_ip" {
  description = "EC2 퍼블릭 IP"
  value       = aws_instance.example.public_ip
}

output "private_ip" {
  description = "EC2 프라이빗 IP"
  value       = aws_instance.example.private_ip
}

output "az" {
  description = "가용 영역"
  value       = aws_instance.example.availability_zone
}

이렇게 파일을 역할별로 분리해서 작성하면 테라폼 프로젝트의 구조가 명확해지고, 유지보수와 협업이 훨씬 수월해집니다. 추가로 `terraform.tfvars` 파일을 만들어 변수 값을 따로 분리할 수도 있습니다.

 

테라폼 명령어 사용 흐름

테라폼 코드를 작성한 후에는 다음과 같은 명령어들을 순차적으로 실행하여 인프라를 구성하고 관리합니다.

[테라폼 환경 설정]

terraform init
  • 현재 작업 디렉토리를 테라폼 프로젝트로 초기화합니다.
  • 필요한 플러그인(예: AWS Provider)을 자동으로 다운로드합니다.
terraform plan
  • 작성한 테라폼 코드가 어떤 리소스를 생성할지 미리 확인할 수 있습니다.
  • 실제 리소스를 생성하지 않고 변경사항을 시뮬레이션하는 단계로, 실행 전 검토 용도로 매우 유용합니다.

[테라폼 코드 적용]

terraform apply
  • 테라폼 코드를 실제 인프라에 반영합니다.
  • `plan`에서 예측한 대로 리소스를 생성, 수정, 삭제하며, 실행 전 사용자에게 한 번 더 확인을 요청합니다.

[테라폼 리소스 제거]

terraform destroy
  • 테라폼으로 생성한 모든 리소스를 제거합니다.
  • 테스트용 인프라나 불필요해진 리소스를 정리할 때 사용합니다.

이와 같은 명령어 흐름은 테라폼을 사용할 때의 기본적인 작업 사이클이며, 실무에서는 백엔드 설정, 워크스페이스 분리 등 고급 기능도 함께 고려하면 좋습니다.

 

 

[참고 사이트]

[Resource: aws_instance]

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance