Terraform AWS EC2 코드 작성 가이드
Terraform은 HCL(HashiCorp Configuration Language)로 인프라를 코드로 관리하는 IaC 도구입니다. AWS Provider는 EC2를 비롯한 거의 모든 AWS 리소스를 다루는 가장 큰 모듈로, 본 빌더는 그중 가장 자주 쓰이는 aws_instance와 짝이 되는 aws_security_group을 폼으로 받아 생성합니다.
핵심 리소스 구조
provider "aws" { region = ... }: 리전 지정.resource "aws_instance" "web": 인스턴스 생성.ami,instance_type,key_name,vpc_security_group_ids,subnet_id,user_data,tags가 핵심.resource "aws_security_group" "web_sg": 인바운드·아웃바운드 규칙을 정의.root_block_device: 루트 볼륨 크기·타입·암호화 등.
AMI 찾기
AMI는 리전별로 다릅니다. AWS 콘솔의 EC2 → AMIs 또는 data "aws_ami" 데이터 소스를 사용해 최신 AMI를 자동으로 가져올 수 있습니다. 본 빌더는 서울 리전의 Amazon Linux 2023 예시를 기본값으로 넣지만, 실제 사용 시에는 사용할 리전의 최신 AMI ID로 교체하세요.
user_data 활용
user_data는 인스턴스 첫 부팅 시 한 번만 실행됩니다. cloud-init 형식 또는 bash 스크립트를 넣을 수 있으며, Terraform이 자동으로 Base64 인코딩해 전송합니다. 본 빌더는 평문을 입력받아 HEREDOC(<<-EOF) 형태로 출력합니다.
적용 명령
terraform init: provider 다운로드.terraform plan: 변경 사항 미리보기.terraform apply: 실제 적용 (확인 입력).terraform destroy: 만든 리소스 삭제.
자주 묻는 질문 (FAQ)
Q. count 대신 for_each를 쓰려면?
A. 인스턴스마다 이름·태그가 달라야 한다면 for_each + map을 권장합니다. 본 빌더는 동일 스펙 다수를 만드는 단순한 경우에 count를 사용합니다.
Q. 시크릿(액세스 키)는 어디에 두나요?
A. 코드에 절대 직접 쓰지 말고 ~/.aws/credentials·IAM 역할·환경변수(AWS_ACCESS_KEY_ID)·AWS SSO 중 하나를 사용합니다. terraform.tfvars는 git에 커밋하지 않습니다.
Q. 상태 파일(tfstate)은 로컬에 둬도 되나요?
A. 팀이라면 안 됩니다. S3 + DynamoDB로 remote backend를 구성해 잠금(lock)과 공유를 확보하세요.