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 group
FAQ
질문 답변 동적 리소스 수 생성 가능? 가능 (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::AccountId123456789012AWS::Regionus-east-1AWS::StackIdarn:aws:cloudformation:...AWS::StackNameMyStackAWS::NotificationARNsSNS 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 : 100
12. Intrinsic Functions (내장 함수)
필수 함수 (시험 필수!)
함수 용도 예시 !Ref파라미터 값 / 리소스 ID 참조 !Ref MyInstance!GetAtt리소스 속성 가져오기 !GetAtt MyInstance.AvailabilityZone!FindInMapMappings에서 값 조회 !FindInMap [RegionMap, !Ref "AWS::Region", AMI]!ImportValue다른 스택 Output 가져오기 !ImportValue MyVPCId!Sub문자열 치환 !Sub "arn:aws:s3:::${BucketName}"!Join문자열 연결 !Join ["-", [a, b, c]] → a-b-c!Base64Base64 인코딩 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-bucket
13. Rollbacks (롤백)
스택 생성 실패 시
동작 설명 기본 모든 리소스 롤백 (삭제) 옵션 롤백 비활성화하고 트러블슈팅 가능
스택 업데이트 실패 시
동작 설명 자동 이전 정상 상태로 자동 롤백 로그 에러 메시지 확인 가능
롤백 실패 시
1. 리소스 수동 수정
2. Console에서 ContinueUpdateRollback 실행
또는
CLI: aws cloudformation continue-update-rollback
14. 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_IAMIAM 리소스 생성/수정 시 CAPABILITY_NAMED_IAM이름 지정된 IAM 리소스 생성/수정 시
기타 Capabilities
Capability 필요 시점 CAPABILITY_AUTO_EXPANDMacros 또는 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 멀티 계정/리전 배포