테라폼에서는 `.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
'IaC > Terraform' 카테고리의 다른 글
| [Terraform] Terraformer로 AWS 리소스 terraform import하기 (0) | 2025.09.07 |
|---|---|
| [Terraform] MacOS에 Terraform 설치 하기 (1) | 2025.07.20 |