
해당 내용 실습 전에 제가 작성한 코드를 다운로드하여서 진행하면 조금 더 수월할 것 같아서 github 주소 남깁니다.
파일 다운받아서 진행하시면 수월할 거예요.
https://github.com/hosose/tf_project/
GitHub - hosose/tf_project
Contribute to hosose/tf_project development by creating an account on GitHub.
github.com
1. 아키텍처 개요 및 파일 구조
최종 인프라 아키텍처
기본 VPC 환경 내에 보안 그룹을 생성하고, Amazon Linux 2 AMI를 기반으로 EC2 인스턴스를 올려 Elastic IP(고정 퍼블릭 IP)를 연결하는 구조입니다.
Internet
│
Elastic IP (EIP) <- 리소스 생성 후 외부 접속 및 주소 확인용
│
┌──────────────┐
│ EC2 │
│ Amazon Linux 2│ <- 기본 계정: ec2-user, Key Pair(pem) 적용
└──────────────┘
│
Security Group <- 인바운드: SSH(22포트/전체개방), 아웃바운드: 전체 허용
│
VPC (Default) <- ap-northeast-2(서울) 기본 VPC 활용
파일 구성 규칙
테라폼 프로젝트 내의 *.tf 파일은 단일 파일(main.tf)에 작성해도 작동하며, 목적에 따라 여러 파일로 분할해도 상관없습니다. 여러 개로 분할하더라도 테라폼은 리소스 간 의존성을 분석하여 생성 순서를 자동으로 조정합니다. (필요 시 terraform graph 명령으로 의존성 그래프를 시각화할 수 있습니다.)
- key.pem: AWS 콘솔에서 사전 생성하여 안전하게 보관하는 SSH 인증 키 pair
- variables.tf: 리전, 인스턴스 유형, 키 이름 등 재사용되거나 변경될 수 있는 설정값 관리
- provider.tf: AWS 프로바이더 정보 및 요구되는 테라폼 버전 정의
- main.tf: 실제 AWS 리소스(VPC Data, Security Group, AMI Data, EC2, EIP 등)의 선언
- outputs.tf: 생성 완료 후 화면에 출력할 정보(EIP 주소, 인스턴스 ID 등) 선언
2. 주요 문법 및 리소스 선언 방식
💡 data 블록과 resource 블록의 차이
- data: 이미 AWS 클라우드에 존재하는 리소스의 정보를 조회할 때 사용 (예: 기본 VPC, AMI 이미지 ID)
- resource: AWS에 신규로 생성할 리소스를 정의할 때 사용
# 기본 구문 형식
data|resource "리소스_유형" "테라폼_내부_식별자" {
# 리소스 속성 설정
}
- 리소스 유형 Naming 규칙: <프로바이더>_<서비스명> 또는 <프로바이더>_<서비스명>_<상세리소스>
- 예: aws_vpc, aws_security_group, aws_instance, aws_eip
- 테라폼 내부 식별자: 코드 내부에서 해당 리소스를 참조하기 위해 사용자가 지정하는 고유 이름 (자유롭게 지정 가능)
서울 리전(ap-northeast-2) 기본 VPC 특성
서울 리전의 기본 VPC는 별도의 가상 네트워크 구축 없이도 서브넷 4개, 라우팅 테이블 1개, 인터넷 게이트웨이(IGW) 1개가 사전에 연결되어 있습니다. 따라서 기본 VPC 내의 어떤 서브넷을 선택하더라도 EC2 인스턴스는 외부 인터넷 통신이 가능한 상태로 배포됩니다.
3. 리소스 생성 및 관리 워크플로우
Step 1. 코드 정렬 및 유효성 검사
코드 작성 후 표준 포맷팅 및 문법 오류 검사를 수행합니다.
# 코드 자동 정렬 (= 기준 좌우 정렬 진행)
terraform fmt
# 문법 및 유효성 검사 (init 완료 상태 필수)
terraform validate
Success! The configuration is valid.
Step 2. 실행 계획 확인 (plan)
실제 리소스를 생성하기 전, 테라폼이 어떤 작업을 수행할지 시뮬레이션합니다.
terraform plan
Terraform will perform the following actions:
# aws_instance.DE-AI-25-IaC-TF will be created
+ resource "aws_instance" "DE-AI-25-IaC-TF" {
+ ami = "ami-0f93dc65265863858"
+ arn = (known after apply) # 생성 완료 후 확정되는 값
+ instance_type = "t2.micro"
...
}
Plan: 2 to add, 0 to change, 0 to destroy.
- + create: 생성될 리소스 앞에 표시됩니다.
- (known after apply): 인스턴스 ID, ARN 등 실제 AWS API 호출 완료 후 할당되는 값입니다.
Step 3. 적용 및 실제 리소스 생성 (apply)
정의된 스펙대로 실제 AWS 클라우드에 리소스를 배포합니다.
terraform apply
명령어 치고 'yes'를 작성해야 apply 해줍니다.
aws_security_group.DE-AI-25-IaC-TF-GROUP: Creating...
aws_security_group.DE-AI-25-IaC-TF-GROUP: Creation complete after 3s [id=sg-0e9ec5a5dca9c8f29]
aws_instance.DE-AI-25-IaC-TF: Creating...
aws_instance.DE-AI-25-IaC-TF: Still creating... [10s elapsed]
aws_instance.DE-AI-25-IaC-TF: Creation complete after 12s [id=i-08491f3c0f269a12e]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
- 리소스별 생성 소요 시간: EC2 단일 인스턴스는 대략 15초~2분 내외, EKS(쿠버네티스) 같은 복합 cluster 서비스는 10분 이상 소요될 수 있습니다.
Step 4. 리소스 삭제 (destroy)
테라폼 상태 파일(.tfstate)에 기록된 리소스를 전량 추적하여 안전하게 제거합니다.
terraform destroy
위의 명령어도 동일하게 'yes'를 작성해야 destroy 해줍니다.
aws_instance.DE-AI-25-IaC-TF: Destroying... [id=i-08491f3c0f269a12e]
aws_instance.DE-AI-25-IaC-TF: Destruction complete after 1m0s
aws_security_group.DE-AI-25-IaC-TF-GROUP: Destroying... [id=sg-0e9ec5a5dca9c8f29]
aws_security_group.DE-AI-25-IaC-TF-GROUP: Destruction complete after 1s
Destroy complete! Resources: 2 destroyed.
- - destroy: 삭제 대상 리소스는 - 기호로 표기됩니다.
- 상태 매칭 확인: 생성된 인프라가 없거나 이미 콘솔 등 외부에서 삭제된 경우, No changes. No objects need to be destroyed. 메시지가 출력됩니다.
4. 테라폼 핵심 개념 및 명령어 요약
구성 요소 요약
| 구성 요소 | 설명 |
| data | 기존 AWS 환경에 존재하는 리소스 정보를 조회 |
| resource | 실제로 프로비저닝하여 생성할 신규 리소스 선언 |
| provider | AWS, GCP, Azure 등 연동할 클라우드 플랫폼 및 버전 정보 설정 |
| variable | 반복 사용되거나 가변적인 설정값을 변수화하여 분리 관리 |
| output | 배포 완료 후 IP 주소, ID 등 필요한 주요 결과값을 콘솔에 출력 |
필수 명령어 요약
- terraform init: 플러그인(프로바이더) 다운로드 및 작업 공간 초기화 (최초 1회 필수)
- terraform fmt: .tf 코드의 들여 쓰기 및 표준 구문 정렬
- terraform validate: 디렉터리 내 코드의 문법적 오류 및 타입 검증
- terraform plan: 실제 반영 전 변경 사항 사전 검토 (시뮬레이션)
- terraform apply: 코드를 실행하여 실제 인프라 생성/수정
- terraform destroy: 테라폼으로 관리 중인 모든 인프라 자원 삭제
AWS 인스턴스를 코드로 관리한다는 것이 매우 흥미롭습니다. 매번 AWS 홈페이지를 통해 버튼 클릭으로 생성했는데... 이제야 좀 개발을 하는 느낌이군요. 이제 인스턴스 생성, 컨테이너 올리기 등등을 하면서 인프라 구축의 맛을 느껴야겠습니다.