Lab 1: VPC 하나만 ← 템플릿 기본 구조 ← 이번 글
Lab 2: VPC + Subnet ← Parameters, !Ref ← 이번 글
Lab 3: 환경별 분기 ← Mappings, !FindInMap ← 이번 글
Lab 4: 결과 출력 ← Outputs, Export ← 이번 글
Lab 5: 전체 네트워크 ← Intrinsic Functions, DependsOn
Lab 6: EC2 + 웹서버 ← Cross Stack, User Data
이전 글에서 AWS CLI로 VPC를 만들어봤다. 20개가 넘는 명령어를 순서대로 치고, 삭제할 때는 역순으로 9단계를 거쳤다.
CloudFormation을 사용하면 이 모든 것을 YAML 파일 하나로 정의하고, 한 번에 만들고, 한 번에 삭제할 수 있다.
이 시리즈에서는 CLI로 만들었던 VPC 아키텍처를 CloudFormation으로 다시 만들면서, 핵심 개념을 하나씩 익힌다.
CLI vs CloudFormation
| CLI | CloudFormation | |
| 생성 | 명령어 하나씩 순서대로 | YAML 파일 하나로 전부 |
| ID 관리 | 직접 복사해서 붙여넣기 | !Ref로 자동 참조 |
| 삭제 | 역순으로 하나씩 | delete-stack 한 방 |
| 실수 | 직접 찾아서 수습 | 자동 롤백 |
| 재현 | 명령어 다시 치기 | 같은 파일로 몇 번이든 생성 |
Lab 1: Template and Stack
CLI에서는? → 1. VPC 생성
가장 간단한 CloudFormation 템플릿을 만들고 배포해본다.
개념
CloudFormation 템플릿은 YAML(또는 JSON) 파일이다. 최소 구조는 이렇다:
AWSTemplateFormatVersion: "2010-09-09"
Description: 템플릿 설명
Resources:
리소스이름:
Type: AWS::서비스::리소스타입
Properties:
# 리소스 설정
AWSTemplateFormatVersion— 항상 "2010-09-09" (유일한 버전)Description— 템플릿 설명 (선택)Resources— 만들 리소스 정의 (유일한 필수 섹션)
실습: VPC 하나 만들기
lab01-vpc.yaml 파일을 만들자:
AWSTemplateFormatVersion: "2010-09-09"
Description: Lab 1 - VPC 하나만 생성하기
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: TutorialVPC
CLI에서는 이렇게 했었다:
aws ec2 create-vpc --cidr-block 10.0.0.0/16 ...
aws ec2 modify-vpc-attribute --enable-dns-support ...
aws ec2 modify-vpc-attribute --enable-dns-hostnames ...
→ 3개의 명령어가 YAML 하나로 합쳐졌다.
배포
aws cloudformation create-stack \
--stack-name lab01 \
--template-body file://lab01-vpc.yaml \
--profile qa
상태 확인
aws cloudformation describe-stacks \
--stack-name lab01 \
--query 'Stacks[0].StackStatus' \
--output text \
--profile qa
CREATE_COMPLETE가 나오면 성공이다.
삭제
aws cloudformation delete-stack \
--stack-name lab01 \
--profile qa
VPC가 자동으로 삭제된다. CLI에서는 delete-vpc를 직접 쳐야 했다.
배운 것
템플릿 기본 구조 (AWSTemplateFormatVersion, Description, Resources), create-stack, delete-stack
Lab 2: Parameters
CLI에서는? → 1. VPC 생성 + 2. Subnet 생성
값을 외부에서 주입받아 유연한 템플릿을 만든다.
개념
Lab 1에서 CIDR 블록을 10.0.0.0/16으로 하드코딩했다. 만약 다른 프로젝트에서 172.16.0.0/16을 쓰고 싶다면? 템플릿을 수정해야 한다.
Parameters를 사용하면 배포할 때 값을 주입할 수 있다.
Parameters:
VpcCidr:
Type: String
Default: 10.0.0.0/16 # 기본값
Description: VPC CIDR block # 설명
정의한 파라미터는 !Ref로 참조한다:
CidrBlock: !Ref VpcCidr # ← 파라미터 값이 들어감
실습: VPC + Subnet
lab02-parameters.yaml:
AWSTemplateFormatVersion: "2010-09-09"
Description: Lab 2 - Parameters로 VPC + Subnet
Parameters:
VpcCidr:
Type: String
Default: 10.0.0.0/16
Description: VPC CIDR block
PublicSubnet1Cidr:
Type: String
Default: 10.0.0.0/24
Description: Public Subnet 1 CIDR block
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCidr
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: TutorialVPC
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Ref PublicSubnet1Cidr
AvailabilityZone: ap-northeast-2a
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: PublicSubnet1
!Ref의 두 가지 용도
!Ref VpcCidr→ Parameter의 값을 가져옴 (문자열)!Ref VPC→ 리소스의 ID를 가져옴 (vpc-xxx)
배포
# 기본값으로 배포
aws cloudformation create-stack \
--stack-name lab02 \
--template-body file://lab02-parameters.yaml \
--profile qa
# 또는 값을 직접 지정
aws cloudformation create-stack \
--stack-name lab02 \
--template-body file://lab02-parameters.yaml \
--parameters ParameterKey=VpcCidr,ParameterValue=172.16.0.0/16 \
ParameterKey=PublicSubnet1Cidr,ParameterValue=172.16.0.0/24 \
--profile qa
CLI에서는 이렇게 했었다:
aws ec2 create-subnet --vpc-id vpc-0711c10b0d00d74aa --cidr-block 10.0.0.0/24
→ VPC ID를 직접 복사해서 붙여넣었다. CloudFormation에서는
!Ref VPC로 자동 참조한다.
aws cloudformation delete-stack --stack-name lab02 --profile qa
배운 것
Parameters, !Ref (파라미터 참조 + 리소스 참조), 배포 시 값 주입
Lab 3: Mappings
CLI에는 없는 개념 — CloudFormation에서 환경별 분기를 처리하는 방법이다.
환경(Dev/Prod)에 따라 다른 설정값을 적용한다.
개념
실무에서는 Dev, Staging, Prod 환경마다 인스턴스 타입이나 설정이 다르다. Mappings는 환경별 값을 미리 정의해두는 조회 테이블이다.
Mappings:
EnvironmentToInstanceType: # 맵 이름
Dev: # 첫 번째 키
InstanceType: t2.nano # 값
Prod:
InstanceType: t2.small
!FindInMap으로 값을 가져온다:
!FindInMap [EnvironmentToInstanceType, !Ref EnvironmentType, InstanceType]
# 맵 이름 첫 번째 키 두 번째 키
실습: 환경별 VPC 이름
lab03-mappings.yaml:
AWSTemplateFormatVersion: "2010-09-09"
Description: Lab 3 - Mappings
Parameters:
EnvironmentType:
Type: String
Default: Dev
AllowedValues:
- Dev
- Prod
Mappings:
SubnetConfig:
Dev:
PublicCidr: 10.0.0.0/24
PrivateCidr: 10.0.2.0/24
Prod:
PublicCidr: 10.0.0.0/24
PrivateCidr: 10.0.2.0/24
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub ${EnvironmentType}-VPC
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !FindInMap [SubnetConfig, !Ref EnvironmentType, PublicCidr]
AvailabilityZone: ap-northeast-2a
Tags:
- Key: Name
Value: !Sub ${EnvironmentType}-PublicSubnet1
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !FindInMap [SubnetConfig, !Ref EnvironmentType, PrivateCidr]
AvailabilityZone: ap-northeast-2a
Tags:
- Key: Name
Value: !Sub ${EnvironmentType}-PrivateSubnet1
배포
aws cloudformation create-stack \
--stack-name lab03 \
--template-body file://lab03-mappings.yaml \
--parameters ParameterKey=EnvironmentType,ParameterValue=Dev \
--profile qa
!Sub vs !Join
!Sub ${EnvironmentType}-VPC→ 문자열 안에 변수 삽입 (간결)!Join ['-', [!Ref EnvironmentType, VPC]]→ 배열을 이어붙이기 (명시적)둘 다 같은 결과.
!Sub이 더 읽기 편하다.
aws cloudformation delete-stack --stack-name lab03 --profile qa
배운 것
Mappings, !FindInMap, !Sub, AllowedValues로 입력값 제한
Lab 4: Outputs
CLI에는 없는 개념 — CLI에서는 응답 JSON에서 ID를 직접 복사했다. CloudFormation에서는 스택 간 값을 공유하는 방법이 있다.
생성된 리소스의 정보를 출력하고 다른 스택에서 참조할 수 있게 한다.
개념
CLI에서는 VPC를 만들면 응답 JSON에서 VpcId를 직접 복사했다. CloudFormation에서는 Outputs으로 필요한 값을 명시적으로 출력한다.
Outputs:
VpcId: # Output 이름
Description: VPC ID # 설명
Value: !Ref VPC # 출력할 값
Export: # 다른 스택에서 참조 가능하게
Name: !Sub ${AWS::StackName}-VpcId
Export하면 다른 스택에서 Fn::ImportValue로 가져올 수 있다. Lab 6에서 사용한다.
실습: Lab 2에 Outputs 추가
lab04-outputs.yaml — Lab 2 템플릿 끝에 Outputs를 추가한다:
AWSTemplateFormatVersion: "2010-09-09"
Description: Lab 4 - Outputs
Parameters:
VpcCidr:
Type: String
Default: 10.0.0.0/16
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCidr
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: TutorialVPC
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.0.0/24
AvailabilityZone: ap-northeast-2a
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: PublicSubnet1
Outputs:
VpcId:
Description: VPC ID
Value: !Ref VPC
Export:
Name: !Sub ${AWS::StackName}-VpcId
PublicSubnet1Id:
Description: Public Subnet 1 ID
Value: !Ref PublicSubnet1
Export:
Name: !Sub ${AWS::StackName}-PublicSubnet1Id
배포 및 Output 확인
aws cloudformation create-stack \
--stack-name lab04 \
--template-body file://lab04-outputs.yaml \
--profile qa
# Output 확인
aws cloudformation describe-stacks \
--stack-name lab04 \
--query 'Stacks[0].Outputs' \
--profile qa
${AWS::StackName}은 뭐야?
Pseudo Parameter라고 한다. AWS가 자동으로 제공하는 값이다.
${AWS::StackName}→ 스택 이름 (lab04)${AWS::Region}→ 리전 (ap-northeast-2)${AWS::AccountId}→ 계정 ID
aws cloudformation delete-stack --stack-name lab04 --profile qa
배운 것
Outputs, Export, Pseudo Parameters (${AWS::StackName}), describe-stacks로 Output 확인
'Infrastructure' 카테고리의 다른 글
| CLI로 만든 VPC를 CloudFormation으로 다시 만들기 (3) — EC2 배포와 삭제 (0) | 2026.03.31 |
|---|---|
| CLI로 만든 VPC를 CloudFormation으로 다시 만들기 (2) — 전체 네트워크 (0) | 2026.03.27 |
| AWS CLI로 AWS VPC 기본 아키텍처 구성하기 (0) | 2026.03.17 |
| AWS ECS 키워드 (0) | 2025.10.27 |
| 쉘 파일 이용하여 AWS Parameter store에 .env 파일 한번에 업로드 하기 (0) | 2025.08.22 |