1. CloudFormation 개요
CloudFormation이란?
- AWS 인프라를 선언적으로 정의하는 방법
- 대부분의 AWS 리소스 지원 (700개 이상)
- Infrastructure as Code (IaC)
템플릿 예시
# CloudFormation 템플릿으로 정의하면:
- Security Group 생성
- EC2 인스턴스 2개 생성 (Security Group 연결)
- Elastic IP 2개 할당
- S3 버킷 생성
- ELB 생성 (EC2 앞단에)
→ CloudFormation이 올바른 순서로 자동 생성!2. CloudFormation 장점
Infrastructure as Code
| 장점 | 설명 |
|---|---|
| 수동 작업 없음 | 리소스 수동 생성 불필요 |
| 버전 관리 | Git으로 코드 버전 관리 |
| 코드 리뷰 | 인프라 변경 사항 코드 리뷰 가능 |
비용 관리
| 장점 | 설명 |
|---|---|
| 태깅 | 스택 내 리소스 자동 태깅 → 비용 추적 용이 |
| 비용 추정 | 템플릿으로 리소스 비용 추정 가능 |
| 절약 전략 | 개발 환경: 오후 5시 삭제 → 오전 8시 재생성 자동화 |
생산성
| 장점 | 설명 |
|---|---|
| 빠른 재생성 | 인프라 파괴/재생성 즉시 가능 |
| 다이어그램 자동 생성 | 템플릿에서 인프라 다이어그램 생성 |
| 선언적 프로그래밍 | 순서/오케스트레이션 고민 불필요 |
| 관심사 분리 | VPC/네트워크/앱 스택 분리 가능 |
| 템플릿 재사용 | 웹에서 기존 템플릿 활용 |
3. CloudFormation 동작 방식
워크플로우
Template (YAML/JSON)
↓
S3에 업로드
↓
CloudFormation에서 참조
↓
Stack 생성
↓
AWS 리소스 생성쉽게 이해하기: Stack(스택)이란?
Stack = 템플릿으로 생성된 AWS 리소스들의 묶음
비유 CloudFormation 개념 설계도 (Blueprint) Template - 어떤 리소스를 만들지 정의 완성된 건물 Stack - 템플릿으로 실제 생성된 리소스 집합 Template (설계도) Stack (완성된 건물) ┌─────────────────┐ ┌─────────────────┐ │ - EC2 정의 │ │ - EC2 인스턴스 │ │ - RDS 정의 │ → │ - RDS 데이터베이스│ │ - S3 정의 │ 생성 │ - S3 버킷 │ └─────────────────┘ └─────────────────┘핵심 포인트:
- 하나의 템플릿으로 여러 스택 생성 가능 (dev-stack, prod-stack)
- 스택 삭제 시 → 포함된 모든 리소스 함께 삭제
- 스택 단위로 리소스 생명주기 관리
핵심 규칙
| 규칙 | 설명 |
|---|---|
| 템플릿 업로드 | S3에 업로드 후 CloudFormation에서 참조 |
| 템플릿 수정 | 기존 템플릿 수정 불가 → 새 버전 업로드 |
| 스택 식별 | 이름으로 식별 |
| 스택 삭제 | 생성된 모든 리소스 함께 삭제 |
4. 템플릿 배포 방법
수동 배포 (학습용)
Infrastructure Composer / Code Editor
↓
템플릿 작성
↓
CloudFormation Console
↓
파라미터 입력 → Stack 생성자동화 배포 (권장)
YAML 템플릿 작성
↓
AWS CLI: aws cloudformation create-stack
↓
또는 CD 도구 사용5. 템플릿 구성 요소 (Building Blocks)
Template Components
| 섹션 | 필수 여부 | 설명 |
|---|---|---|
| AWSTemplateFormatVersion | 선택 | 템플릿 버전 (2010-09-09) |
| Description | 선택 | 템플릿 설명 |
| Resources | 필수 ⭐ | AWS 리소스 정의 |
| Parameters | 선택 | 동적 입력값 |
| Mappings | 선택 | 정적 변수 (하드코딩) |
| Outputs | 선택 | 생성된 값 출력/내보내기 |
| Conditions | 선택 | 조건부 리소스 생성 |
Template Helpers
- References (
!Ref) - Functions (
Fn::*)
6. Resources (리소스)
개요
- 템플릿의 핵심 (유일한 필수 섹션)
- AWS 컴포넌트 생성 및 구성
- 리소스 간 참조 가능
- 700개 이상 리소스 타입 지원
리소스 타입 형식
service-provider::service-name::data-type-name
예: AWS::EC2::Instance
AWS::S3::Bucket
AWS::RDS::DBInstance예시
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0123456789abcdef0
InstanceType: t2.micro
SecurityGroups:
- !Ref MySecurityGroup
MySecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: My security groupFAQ
| 질문 | 답변 |
|---|---|
| 동적 리소스 수 생성 가능? | 가능 (Macros, Transform 사용) |
| 모든 AWS 서비스 지원? | 거의 대부분. 미지원 시 Custom Resources 사용 |
7. Parameters (파라미터)
개요
- 템플릿에 동적 입력값 제공
- 템플릿 재사용성 향상
- 타입 검증으로 오류 방지
언제 파라미터 사용?
💡 "이 설정이 나중에 변경될 가능성이 있는가?"
→ 있다면 파라미터로!
→ 템플릿 재업로드 없이 값 변경 가능
파라미터 설정 옵션
| 설정 | 설명 |
|---|---|
| Type | String, Number, List, AWS-Specific, SSM Parameter 등 |
| Default | 기본값 |
| AllowedValues | 허용 값 목록 |
| AllowedPattern | 정규식 패턴 |
| Min/MaxLength | 문자열 길이 제한 |
| Min/MaxValue | 숫자 범위 제한 |
| NoEcho | 민감 정보 마스킹 (비밀번호 등) |
| Description | 설명 |
예시
Parameters:
InstanceType:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t2.small
- t2.medium
Description: EC2 instance type
DBPassword:
Type: String
NoEcho: true # 콘솔에서 마스킹파라미터 참조
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType # 파라미터 참조8. Pseudo Parameters (의사 파라미터)
기본 제공 파라미터
| 파라미터 | 반환 값 예시 |
|---|---|
AWS::AccountId | 123456789012 |
AWS::Region | us-east-1 |
AWS::StackId | arn:aws:cloudformation:... |
AWS::StackName | MyStack |
AWS::NotificationARNs | SNS ARN 목록 |
AWS::NoValue | 값 없음 (조건부 속성 제거용) |
사용 예시
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "${AWS::StackName}-${AWS::Region}-bucket"9. Mappings (매핑)
개요
- 템플릿 내 정적 변수 (하드코딩)
- 환경, 리전, AMI 타입 등에 따른 값 구분에 유용
예시
Mappings:
RegionMap:
us-east-1:
AMI: ami-0123456789abcdef0
InstanceType: t2.micro
ap-northeast-2:
AMI: ami-0987654321fedcba0
InstanceType: t3.micro값 조회: Fn::FindInMap
!FindInMap [MapName, TopLevelKey, SecondLevelKey]
# 예시
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI]Mappings vs Parameters
| 구분 | Mappings | Parameters |
|---|---|---|
| 값 | 미리 알고 있음 | 사용자가 입력 |
| 변경 | 리전/환경 등에서 유추 | 매번 다름 |
| 예시 | 리전별 AMI ID | 인스턴스 이름 |
| 제어 | 더 안전 | 유연함 |
10. Outputs (출력)
개요
- 생성된 값을 출력하고 다른 스택에서 가져오기 가능
- AWS Console, CLI에서 확인 가능
- Cross-Stack 협업에 유용
사용 사례
Network Stack (VPC, Subnet 생성)
↓ Export
VPC ID: vpc-2f09a348
↓ Import
Application Stack (EC2, ALB 생성)출력 정의
Outputs:
VPCId:
Description: VPC ID
Value: !Ref MyVPC
Export:
Name: MyVPCId # 다른 스택에서 참조할 이름다른 스택에서 가져오기: Fn::ImportValue
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
SubnetId: !ImportValue MySubnetId⚠️ Export된 Output을 참조하는 스택이 있으면 원본 스택 삭제 불가
11. Conditions (조건)
개요
- 조건부로 리소스/출력 생성
- 환경(dev/prod), 리전, 파라미터 값 등에 따라 분기
조건 정의
Conditions:
CreateProdResources: !Equals [!Ref Environment, prod]
IsUSEast1: !Equals [!Ref "AWS::Region", us-east-1]조건 함수
| 함수 | 설명 |
|---|---|
Fn::And | 모두 참 |
Fn::Or | 하나라도 참 |
Fn::Not | 부정 |
Fn::Equals | 같음 |
Fn::If | 조건부 값 |
조건 적용
Resources:
ProdEBSVolume:
Type: AWS::EC2::Volume
Condition: CreateProdResources # 조건 적용
Properties:
Size: 10012. Intrinsic Functions (내장 함수)
필수 함수 (시험 필수!)
| 함수 | 용도 | 예시 |
|---|---|---|
!Ref | 파라미터 값 / 리소스 ID 참조 | !Ref MyInstance |
!GetAtt | 리소스 속성 가져오기 | !GetAtt MyInstance.AvailabilityZone |
!FindInMap | Mappings에서 값 조회 | !FindInMap [RegionMap, !Ref "AWS::Region", AMI] |
!ImportValue | 다른 스택 Output 가져오기 | !ImportValue MyVPCId |
!Sub | 문자열 치환 | !Sub "arn:aws:s3:::${BucketName}" |
!Join | 문자열 연결 | !Join ["-", [a, b, c]] → a-b-c |
!Base64 | Base64 인코딩 | EC2 UserData에 사용 |
| Condition Functions | 조건 처리 | !If, !Equals, !And, !Or, !Not |
!Ref 예시
# 파라미터 참조 → 값 반환
InstanceType: !Ref InstanceTypeParam
# 리소스 참조 → Physical ID 반환
SecurityGroups:
- !Ref MySecurityGroup!GetAtt 예시
# EC2 인스턴스의 AZ 가져오기
Value: !GetAtt MyInstance.AvailabilityZone
# ELB의 DNS 이름 가져오기
Value: !GetAtt MyLoadBalancer.DNSName!Sub 예시
# 변수 치환
BucketName: !Sub "${AWS::StackName}-${AWS::Region}-bucket"
# 결과: MyStack-us-east-1-bucket13. Rollbacks (롤백)
스택 생성 실패 시
| 동작 | 설명 |
|---|---|
| 기본 | 모든 리소스 롤백 (삭제) |
| 옵션 | 롤백 비활성화하고 트러블슈팅 가능 |
스택 업데이트 실패 시
| 동작 | 설명 |
|---|---|
| 자동 | 이전 정상 상태로 자동 롤백 |
| 로그 | 에러 메시지 확인 가능 |
롤백 실패 시
1. 리소스 수동 수정
2. Console에서 ContinueUpdateRollback 실행
또는
CLI: aws cloudformation continue-update-rollback14. Service Role
개요
- CloudFormation이 리소스를 생성/수정/삭제할 때 사용하는 IAM Role
- 사용자가 직접 리소스 권한 없어도 스택 관리 가능
사용 사례
┌─────────────────────────────────────────────┐
│ User │
│ Permissions: │
│ - cloudformation:* │
│ - iam:PassRole │
└─────────────────┬───────────────────────────┘
│ PassRole
↓
┌─────────────────────────────────────────────┐
│ CloudFormation │
│ │ │
│ Service Role │
│ Permissions: │
│ - s3:*Bucket │
└─────────────────┬───────────────────────────┘
│
↓
┌──────────┐
│ S3 Bucket│
└──────────┘- 최소 권한 원칙 달성
- 사용자에게 모든 권한 부여 없이 스택 관리 가능
15. Capabilities (기능)
IAM 관련 Capabilities
| Capability | 필요 시점 |
|---|---|
CAPABILITY_IAM | IAM 리소스 생성/수정 시 |
CAPABILITY_NAMED_IAM | 이름 지정된 IAM 리소스 생성/수정 시 |
기타 Capabilities
| Capability | 필요 시점 |
|---|---|
CAPABILITY_AUTO_EXPAND | Macros 또는 Nested Stacks 포함 시 |
예외
InsufficientCapabilitiesException
→ 필요한 Capability를 명시하지 않으면 발생 (보안 조치)16. DeletionPolicy (삭제 정책)
개요
- 스택/리소스 삭제 시 동작 제어
- 리소스 보존 및 백업을 위한 안전 장치
정책 유형
| 정책 | 동작 | 사용 사례 |
|---|---|---|
| Delete (기본) | 리소스 삭제 | 일반 |
| Retain | 리소스 보존 | 중요 데이터 |
| Snapshot | 스냅샷 생성 후 삭제 | DB, EBS |
예시
Resources:
MyDBInstance:
Type: AWS::RDS::DBInstance
DeletionPolicy: Snapshot # 삭제 전 스냅샷 생성
Properties: ...
MyS3Bucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain # 스택 삭제해도 버킷 보존Snapshot 지원 리소스
- EBS Volume
- ElastiCache Cluster / ReplicationGroup
- RDS DBInstance / DBCluster
- Redshift Cluster
- Neptune / DocumentDB DBCluster
⚠️ S3 버킷: 비어있지 않으면 Delete 실패!
17. Stack Policy (스택 정책)
개요
- 스택 업데이트 시 허용되는 작업 제어
- 의도치 않은 업데이트로부터 리소스 보호
기본 동작
- Stack Policy 미설정: 모든 업데이트 허용
- Stack Policy 설정: 모든 리소스 보호됨 → 명시적 Allow 필요
예시
{
"Statement": [
{
"Effect": "Allow",
"Action": "Update:*",
"Principal": "*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "Update:*",
"Principal": "*",
"Resource": "LogicalResourceId/ProductionDatabase"
}
]
}→ ProductionDatabase를 제외한 모든 리소스 업데이트 허용
18. Termination Protection
개요
- 스택 실수 삭제 방지
- 활성화 시 스택 삭제 불가 (비활성화해야 삭제 가능)
19. Custom Resources
용도
- CloudFormation이 지원하지 않는 리소스 정의
- 커스텀 프로비저닝 로직 (온프레미스, 3rd party)
- 생성/수정/삭제 시 Lambda 함수 실행
백엔드
- Lambda 함수 (가장 일반적)
- SNS Topic
정의 방법
Resources:
MyCustomResource:
Type: Custom::MyCustomResourceType
Properties:
ServiceToken: !GetAtt MyLambdaFunction.Arn # 필수
CustomProperty1: Value1
CustomProperty2: Value2사용 사례: S3 버킷 비우기
문제: 비어있지 않은 S3 버킷은 삭제 불가
해결:
1. Custom Resource 정의
2. Lambda 함수가 버킷 내 객체 삭제
3. CloudFormation이 버킷 삭제
┌─────────────────────────────────────────────┐
│ CloudFormation │
│ │ │
│ delete stack │
│ ↓ │
│ Custom Resource │
│ │ │
│ Lambda 호출 │
│ ↓ │
│ S3 버킷 비우기 │
│ ↓ │
│ S3 버킷 삭제 │
└─────────────────────────────────────────────┘20. StackSets
개요
- 여러 계정/리전에 스택을 한 번에 생성/수정/삭제
- AWS Organizations 전체 계정에 적용 가능
특징
| 항목 | 설명 |
|---|---|
| 생성 권한 | Administrator 계정 (또는 Delegated Admin) |
| 업데이트 | 모든 계정/리전의 스택 인스턴스 동시 업데이트 |
| 범위 | Organization 전체 적용 가능 |
구조
Administrator Account
│
StackSet (Template)
│
├─→ Region 1
│ ├─→ Account A: Stack Instance
│ └─→ Account B: Stack Instance
│
└─→ Region 2
├─→ Account A: Stack Instance
└─→ Account C: Stack Instance핵심 요약
| 개념 | 설명 |
|---|---|
| CloudFormation | AWS IaC 서비스, 선언적 인프라 정의 |
| Resources | 유일한 필수 섹션, AWS 리소스 정의 |
| Parameters | 동적 입력값, 재사용성 향상 |
| Mappings | 정적 변수 (리전별 AMI 등) |
| Outputs | 값 출력/내보내기, Cross-Stack 협업 |
| Conditions | 조건부 리소스 생성 |
| !Ref | 파라미터 값 / 리소스 ID 참조 |
| !GetAtt | 리소스 속성 가져오기 |
| DeletionPolicy | Delete / Retain / Snapshot |
| Custom Resources | 미지원 리소스, Lambda 연동 |
| StackSets | 멀티 계정/리전 배포 |