$ yh.log
AWS CloudFormation 정리

AWS CloudFormation 정리

AWSCloudFormationIaCDVA-C02

작성자 : 오예환 | 작성일 : 2026-01-11 | 수정일 : 2026-01-11

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 (파라미터)

개요

  • 템플릿에 동적 입력값 제공
  • 템플릿 재사용성 향상
  • 타입 검증으로 오류 방지

언제 파라미터 사용?

💡 "이 설정이 나중에 변경될 가능성이 있는가?"
→ 있다면 파라미터로!
→ 템플릿 재업로드 없이 값 변경 가능

파라미터 설정 옵션

설정설명
TypeString, 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::AccountId123456789012
AWS::Regionus-east-1
AWS::StackIdarn:aws:cloudformation:...
AWS::StackNameMyStack
AWS::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

구분MappingsParameters
미리 알고 있음사용자가 입력
변경리전/환경 등에서 유추매번 다름
예시리전별 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

핵심 요약

개념설명
CloudFormationAWS IaC 서비스, 선언적 인프라 정의
Resources유일한 필수 섹션, AWS 리소스 정의
Parameters동적 입력값, 재사용성 향상
Mappings정적 변수 (리전별 AMI 등)
Outputs값 출력/내보내기, Cross-Stack 협업
Conditions조건부 리소스 생성
!Ref파라미터 값 / 리소스 ID 참조
!GetAtt리소스 속성 가져오기
DeletionPolicyDelete / Retain / Snapshot
Custom Resources미지원 리소스, Lambda 연동
StackSets멀티 계정/리전 배포