본문 바로가기
AWS

AWS Section 18. CloudFormation

by _비니_ 2024. 11. 4.

💡 AWS CloudFormation 개요

  • CloudFormation은 코드로 AWS 인프라를 정의하는 도구
  • 사용자는 CloudFormation 템플릿을 통해 필요한 리소스를 선언하고, 이를 자동으로 생성하고 연결할 수 있다.
  • 예를 들어 보안 그룹, EC2 인스턴스, S3 버킷, 로드 밸런서 등을 선언하여 전체 인프라를 설정할 수 있다.

 

사용 이유

  1. 인프라 코드화
    1. 리소스 생성이 자동화되며, 코드로 인프라를 제어할 수 있어 효율적이다.
    2. 모든 변경사항이 코드로 관리되므로, 버전 제어 시스템을 통해 관리할 수 있다.
  2. 비용 절감
    1. 리소스 비용을 추적할 수 있으며, 자동화된 환경에서는 예산을 절감하기 위한 전략을 세울 수 있다.
    2. 예를 들어, 개발 환경에서 업무 시간이 아닌 경우 리소스를 자동으로 삭제하고 다시 생성할 수 있다.
  3. 생산성 향상
    1. 인프라를 빠르게 생성, 삭제할 수 있어 테스트와 개발에 유리하다.
    2. 필요한 리소스를 즉시 생성하고 사용한 만큼만 비용을 지불할 수 있다.
  4. 관심사 분리
    1. 다양한 애플리케이션 계층에 대해 개별적인 스택을 구성할 수 있어 네트워크, VPC, 애플리케이션 등 여러 계층을 효율적으로 관리할 수 있다.
  5. 재사용 가능성
    1. 기존 템플릿과 웹의 자료를 활용해 템플릿을 신속히 작성할 수 있어 개발 속도가 빨라진다.

 

🦾 CloudFormation의 작동 원리

  1. 템플릿 업로드
    1. CloudFormation 템플릿을 Amazon S3에 업로드하고, 이를 참조하여 스택을 생성한다. 스택은 AWS 리소스 집합으로, 특정 리전에서 고유한 이름으로 식별된다.
  2. 템플릿 업데이트
    1. 템플릿을 수정하려면 새로운 버전을 업로드하고 스택을 업데이트해야 한다.
    2. 스택이 삭제되면 그에 관련된 모든 리소스가 제거된다.

 

📄 템플릿 구성 요소

  1. AWSTemplateFormatVersion: 템플릿 버전
  2. Description: 템플릿에 대한 설명을 작성 가능
  3. Resources: 모든 AWS 리소스를 선언하는 필수 섹션으로, CloudFormation의 핵심
  4. Parameters: 템플릿에 동적 입력을 전달 가능
  5. Mappings: 템플릿 내에서 사용할 정적 변수를 정의
  6. Outputs: 생성된 리소스의 정보를 참조하는 데 사용됨
  7. Conditions: 리소스 생성 여부를 결정하는 조건 목록
  8. 템플릿 도우미: 참조, 함수 등이 포함되어 있으며, 이를 통해 다양한 유틸리티를 활용할 수 있음

 

📤 템플릿 배포 방법

 

템플릿은 Application Composer나 코드 편집기에서 작성할 수 있으며, 수동으로 콘솔을 통해 배포하거나 명령줄 인터페이스(CLI), CI/CD 도구 등을 사용해 자동으로 배포할 수 있다.

 

 

💡 YAML 개요

  • YAML은 CloudFormation 템플릿을 작성할 때 사용할 수 있는 형식으로, JSON과 유사한 데이터 직렬화 언어ㅇㅣ다.
  • 하지만 YAML은 JSON보다 가독성이 좋고, 구성이 쉽기 때문에 CloudFormation 템플릿 작성에 더 적합하다.

 

YAML의 구조

  • 키-값 쌍으로 구성되며, 각 키는 값과 연결되어 있다.
  • 중첩된 객체를 표현할 때 들여쓰기를 사용한다. 예를 들어, bill-to 아래에 이름, 성, 주소 등의 중첩 객체가 들어가며 들여쓰기 형태로 표시된다.
  • 배열은 빼기 기호를 사용하여 나타낸다.
  • **여러 줄 문자열은 수직 막대(|)**를 사용하여 정의 >> 이를 통해 긴 문자열을 여러 줄로 나눠 표현한다.
  • 주석도 지원한다. (문서 가독성 🔺)

 

🆚 JSON과 YAML 비교

  • JSON은 많은 문자열과 중괄호 및 대괄호로 인해 템플릿 작성이 복잡해질 수 있지만,
  • YAML은 간결한 구문 덕분에 작성이 더 쉽고 코드 가독성이 뛰어나다.

 

🧐 YAML 문서 예시

  • YAML에서 invoice: 34843처럼 숫자 값이 들어갈 수 있다.
  • 날짜와 문자열은 그대로 표현되며, 중첩 객체는 들여쓰기를 통해 계층 구조를 나타낸다.
  • 제품 목록은 배열 형식으로 작성하며, 각 제품 항목에는 sku, 수량, 설명, 가격 등이 키-값 쌍으로 나열된다.
YAML을 읽고 작성하는 것은 CloudFormation 템플릿을 다루는 데 필수 기술YAML의 간결함과 구조적 유연성 덕분에 템플릿 작성이 더욱 효율적

 

💡 리소스 개요

  • 리소스는 다양한 AWS 구성 요소를 나타내며, AWS에서 생성, 업데이트, 삭제 과정을 자동으로 처리한다.
  • 현재 700개 이상의 리소스 유형이 존재하며, 그 수는 계속 증가하고 있다.
  • 문서를 통해 각 리소스의 속성과 사용 방법을 쉽게 확인할 수 있다.

 

📄 리소스 문서

  • 리소스 유형 식별자는 서비스 공급자::서비스 이름::데이터 유형의 형식으로 구성된다.
  • AWS의 CloudFormation 리소스 문서는 특정 서비스나 리소스 유형에 대해 상세히 설명되어 있으며, 예시와 구문을 제공한다.
  • 예를 들어, EC2 인스턴스의 경우 AWS::EC2::Instance라는 리소스 유형으로 선언하며, 속성은 이미지 ID(AMI ID), 인스턴스 유형, 가용 영역 등으로 정의된다.

 

✅ 리소스 속성

리소스에는 속성이 있으며, 이 속성들은 키-값 쌍으로 구성된다.

  • 각 리소스의 속성 목록은 문서에서 확인할 수 있으며, 필수 속성과 선택 속성을 명확히 구분한다.
  • 예를 들어, EC2 인스턴스의 경우 IAMInstanceProfile 속성은 선택 사항으로, 인스턴스 프로필이 없을 때에도 인스턴스를 생성할 수 있다.
  • 속성 값은 문자열, 숫자, 배열 등 다양한 유형으로 설정된다.

 

🏹 리소스 참조

  • 리소스 간에는 서로 참조할 수 있는 메커니즘이 있다.
  • 예를 들어, EC2 인스턴스는 SecurityGroups 속성을 통해 보안 그룹을 참조할 수 있다.
  • 보안 그룹은 문자열 배열로 지정되며, 문서에서 이를 참조하는 방법을 쉽게 확인할 수 있다.

 

🚨 리소스 생성 시 주의 사항

  • 동적 리소스 생성 (지금은 몰라도 O)
    • 일반적으로 템플릿에 작성된 리소스가 그대로 생성된다.
    • 그러나 동적인 수의 리소스를 생성하려면 CloudFormation MacrosTransform 기능을 사용해야 한다 (지금은 몰라도 O)
  • 사용자 정의 리소스(Custom Resource)
    • 대부분의 AWS 서비스가 CloudFormation을 통해 지원되지만, 일부 특정 서비스는 지원되지 않을 수 있는데,
      • 이 경우 사용자 정의 리소스(Custom Resource)를 사용하여 해결할 수 있다.

 

💡 파라미터 개요

  • 파라미터는 CloudFormation 템플릿에 동적인 입력값을 제공하는 방법
  • 이를 통해 템플릿을 재사용하고, 사용자로부터 입력을 받을 수 있어 다양한 상황에서 유연하게 사용할 수 있다.
  • 파라미터를 잘 활용하면, 템플릿을 수정하지 않고도 필요한 값만 변경하여 리소스를 생성할 수 있다!!

 

❓ 파라미터 사용 이유

  1. 템플릿 내 리소스 구성이 향후에 변경될 가능성이 있다면 파라미터로 만들어야 한다.
  2. 입력 값이 미리 결정되지 않은 경우, 파라미터로 처리하면 유연성을 확보할 수 있다.

 

✅ 파라미터 속성

  1. 유형(Type)
    1. 파라미터는 문자열(String), 숫자(Number), 쉼표로 구분된 목록, 숫자 목록 등 다양한 형식을 가질 수 있다.
  2. 설명(Description)
    1. 파라미터에 대한 설명을 추가할 수 있다.
  3. 제약 조건(Constraints)
    1. 최소/최대 길이, 최소/최대 값, 허용된 값 목록, 정규 표현식(패턴), 기본값(Default), NoEcho 등이 있다. (입력값을 제어하고, 유효성 검사 가능)

 

🧐 주요 파라미터 예시

  1. 허용된 값(AllowedValues)
    1. 예를 들어, EC2 인스턴스 유형을 선택하기 위한 파라미터 InstanceType을 정의할 수 있으며, t2.micro, t2.small, t2.medium 중 하나만 선택할 수 있도록 제한할 수 있다. (기본값은 t2.micro )
  2. NoEcho
    1. 보안 관련 파라미터
      1. 예를 들어 데이터베이스 비밀번호 같은 경우, NoEcho를 true로 설정하면 로그 등에 비밀번호가 노출되지 않도록 할 수 있다.

 

🎤 파라미터 참조 방법

  • 파라미터는 CloudFormation 템플릿 어디에서나 참조할 수 있다. (Ref 함수를 사용)
    • YAML에서는 !Ref로 간단히 표현되며, 해당 파라미터나 리소스를 참조할 수 있다.
    • EX ) 보안 그룹 설명을 위한 파라미터가 SecurityGroupDescription이라면, 이를 참조하기 위해 Ref 함수를 사용하여 보안 그룹의 설명을 지정할 수 있다.

 

💡 가상 파라미터 (Pseudo Parameters)

  • CloudFormation은 미리 정의된 가상 파라미터를 제공
  • 템플릿 내에서 자동으로 사용 가능하며, 별도로 생성할 필요가 없다.

<대표적인 가상 파라미터>

  1. AWS::AccountId: 현재 계정 ID를 반환
  2. AWS::Region: 현재 AWS 리전을 반환
  3. AWS::StackId: 스택 ID를 반환
  4. AWS::NoValue: 반환할 값이 없음을 나타냄
템플릿에서 계정 ID나 리전 등의 정보를 자동으로 활용할 수 있다.

 

파라미터는 CloudFormation 템플릿에 동적 입력을 제공하며, 유연성을 극대화하는 역할을 한다.

유형과 제약 조건을 통해 파라미터의 유효성을 제어하고, 입력 오류를 방지할 수 있다.

Ref 함수를 사용하여 템플릿 내 파라미터나 리소스를 참조할 수 있으며, 가상 파라미터를 통해 AWS 환경에 대한 정보를 자동으로 참조할 수 있다. 

 

💡 CloudFormation 매핑 개요

  • CloudFormation 템플릿 내에서 고정된 값을 설정하는 방법
  • 이를 통해 개발 / 프로덕션 등 다양한 환경이나 AWS 리전에 따라 값이 달라지도록 할 수 있다. (리전, 아키텍처, AMI ID 등 환경에 따라 다른 값을 자동 제공할 수 있어 편리)
  • 매핑은 템플릿 내에서 가능한 모든 값을 하드 코딩하는 방식으로 구성

 

🧐 매핑 사용법

매핑된 값에 접근하려면 FindInMap 함수를 사용

  1. Map 이름을 지정한다. 예를 들어, RegionMap이라는 매핑을 사용할 수 있다.
  2. 최상위 키는 사용자가 원하는 리전을 참조한다. 가상 파라미터인 AWS::Region을 사용하여 현재 리전을 자동으로 가져올 수 있다.
  3. 마지막으로 하위 키는 아키텍처 유형(예: HVM64)을 나타낸다.
Mappings:
  RegionMap:
    us-east-1:
      HVM64: "ami-12345678"
      HVMG2: "ami-87654321"
    us-west-1:
      HVM64: "ami-87654321"
      HVMG2: "ami-12345678"
  • 이 매핑은 리전과 아키텍처에 따라 다른 AMI ID를 반환
  • 예를 들어, us-east-1 리전에서 HVM64 아키텍처를 사용할 경우, ami-12345678이 반환

 

🆚 매핑 vs 파라미터

매핑파라미터는 서로 다른 용도로 사용된다

  1. 매핑
    1. 미리 정의된 고정 값이 있을 때 적합하다.
    2. 예를 들어, 리전, 가용 영역, AWS 계정, 환경(개발/프로덕션) 등에서 도출되는 값을 미리 알고 있을 때 사용한다.
  2. 파라미터
    1. 런타임에 결정되는 동적 값에 적합히다.
    2. 사용자가 선택한 값에 따라 달라질 수 있으며, 사용자의 입력에 따라 더 많은 자유도를 제공한다.
매핑은 고정된 값을 설정하고 FindInMap 함수를 통해 참조하여, 리전이나 아키텍처별로 다른 값을 제공하는 데 매우 유용하다.

파라미터는 런타임에 사용자가 제공하는 값을 처리하는 데 적합하다.

매핑을 통해 템플릿을 보다 안정적이고 일관되게 유지할 수 있으며, 리전이나 환경에 따라 자동으로 적합한 값을 선택할 수 있다.

 

 

💡 CloudFormation 출력 개요

  • 스택에서 생성된 리소스의 특정 값을 외부로 내보내는 방법을 제공
  • 출력을 사용하면 다른 스택이나 애플리케이션에서 해당 값을 참조할 수 있어, 스택 간의 협업과 리소스 공유가 가능해진다 (출력 값은 AWS 콘솔이나 CLI에서도 확인 가능)

 

😺 CloudFormation 출력의 활용

  • 스택 간 협업
    • 예를 들어, 네트워크 스택에서 생성된 VPC ID서브넷 ID와 같은 값을 출력으로 내보내고, 다른 스택에서 이를 참조할 수 있다.
  • 재사용
    • 하나의 스택에서 출력된 값을 다른 스택에서 가져와서 사용할 수 있으므로, 리소스 중복 생성 없이 재사용할 수 있다.

 

📤 CloudFormation 출력 선언 예시

출력을 선언하면 해당 값을 다른 스택에서 참조할 수 있다. 예를 들어, 보안 그룹을 생성하고, 그 보안 그룹의 ID를 출력할 수 있다.

Outputs:
  SSHSecurityGroup:
    Description: "The SSH Security Group ID"
    Value: !Ref SSHSecurityGroup
    Export:
      Name: SSHSecurityGroupID

SSHSecurityGroup의 ID를 출력. 이를 내보내기(Export)하여 다른 스택에서 사용할 수 있도록 함

 

  • Export된 이름은 리전 내에서 고유해야 하며, 여러 스택에서 이 값을 참조할 수 있음.

 

📏 ImportValue 함수

다른 스택에서 출력된 값을 가져오려면 ImportValue 함수를 사용한다.

  • 내보낸 값을 참조해 리소스 간 연결을 지원
Resources:
  MyEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      SecurityGroupIds:
        - !ImportValue SSHSecurityGroupID

ImportValue를 사용하여 SSHSecurityGroup의 값을 가져와 EC2 인스턴스의 보안 그룹으로 설정하는 방법

 

 

🚨 주의 사항

  • 만약 스택 간에 참조하고 있는 출력 값이 있다면, 해당 출력 값을 참조하는 스택들이 모두 삭제될 때까지 값을 내보낸 스택을 삭제할 수 없다.
출력(Outputs)은 CloudFormation 스택 간에 값을 내보내고 가져오는 중요한 기능

출력을 통해 VPC ID, 보안 그룹 ID 등의 값을 공유하여 스택 간 협업을 효율적으로 할 수 있다.

Export와 ImportValue를 사용하여 다른 스택에서 출력된 값을 재사용할 수 있으며, 이를 통해 리소스를 중복 생성하지 않고 효율적으로 관리할 수 있다.

 

 

💡 CloudFormation 조건 개요

  • 조건은 특정 상황에서 리소스나 출력물을 생성하거나 생략할 수 있도록 제어하는 기능
  • 예를 들어, 개발 환경에서만 생성되는 리소스가 있거나, 운영 환경에서만 필요한 리소스가 있을 때 조건을 사용 (환경별로 다른 리소스 구성을 유연하게 설정 가능)

 

🔍 CloudFormation 조건의 활용

조건을 사용하여 다양한 시나리오에서 리소스 생성 여부를 제어할 수 있다

  • 환경 / 리전 / 파라미터 값 기반

 

조건 선언 예시

Conditions:
  CreateProdResources:
    Fn::Equals:
      - !Ref EnvironmentType
      - "prod"

CreateProdResources라는 조건을 정의하고, EnvironmentType 파라미터가 prod(운영 환경)일 때만 true로 설정

 

 

📏 조건 함수

 

CloudFormation에서는 다양한 조건 함수를 사용할 수 있습니다:

  • Fn::And: 여러 조건이 모두 true일 때 true를 반환.
  • Fn::Equals: 두 값이 같은지 비교하여 true 또는 false를 반환.
  • Fn::If: 조건이 true일 때와 false일 때 각각 다른 값을 반환.
  • Fn::Not: 조건의 반대 값을 반환.
  • Fn::Or: 여러 조건 중 하나라도 true일 때 true를 반환.
Resources:
  MountPoint:
    Type: "AWS::EC2::VolumeAttachment"
    Condition: CreateProdResources
    Properties:
      VolumeId: !Ref MyVolume
      InstanceId: !Ref MyInstance
      Device: "/dev/sdh"

CreateProdResources 조건이 true일 때만 EBS 볼륨을 EC2 인스턴스에 연결하는 예시

 

조건(Conditions)은 특정 상황에 따라 리소스나 출력물 생성을 제어하는 기능

Fn::Equals, Fn::And, Fn::Or 등의 조건 함수를 사용해 조건을 정의할 수 있다.

조건을 사용하면 환경이나 리전에 따라 리소스를 유연하게 관리할 수 있다.

리소스, 출력물, 속성 등에 조건을 적용할 수 있어, 효율적인 인프라 관리가 가능하다.

 

 

💡 내장 함수 개요

CloudFormation에서 내장 함수는 템플릿에서 동적으로 값을 참조하거나 생성하는 데 사용된다.

이 함수들을 활용하여 리소스 간의 참조, 값 변환, 조건 적용 등을 효율적으로 처리할 수 있다.

주요 내장 함수

  • Fn::Ref
    • 참조 함수로, 파라미터 값 또는 생성된 리소스의 ID를 반환
Resources:
  DBSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC

VPC 리소스의 ID를 참조하여 DBSubnet1의 VpcId 속성에 할당

 

  • Fn::GetAtt
    • 리소스의 속성 값을 가져오는 함수. 생성된 리소스에서 특정 속성을 참조할 수 있음
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0742b4e673072066f
      InstanceType: t2.micro
  EBSVolume:
    Type: AWS::EC2::Volume
    Condition: CreateProdResources
    Properties:
      Size: 100
      AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone

Fn::GetAtt는 EC2Instance의 가용 영역(AvailabilityZone)을 참조하여 EBSVolume의 AvailabilityZone 속성에 할당함

 

  • Fn::FindInMap
    • 매핑에서 특정 값을 찾는 함수
Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", HVM64]
      InstanceType: t2.micro

RegionMap 매핑에서 현재 AWS 리전의 AMI ID를 찾아 MyEC2Instance의 ImageId 속성에 할당함

 

  • Fn::ImportValue
    • 다른 스택에서 내보낸 값을 가져오는 함수
Resources:
  MySecureInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0742b4e673072066f
      InstanceType: t2.micro
      AvailabilityZone: us-east-1a
      SecurityGroups:
        - !ImportValue SSHSecurityGroup

Fn::ImportValue는 다른 스택에서 내보낸 SSHSecurityGroup 값을 참조하여 보안 그룹에 할당함

 

 

  • Fn::Base64
Resources:
  WebServer:
    Type: AWS::EC2::Instance
    Properties:
      UserData:
        Fn::Base64: |
          #!/bin/bash
          dnf update -y
          dnf install -y httpd

Fn::Base64는 UserData 스크립트를 Base64로 인코딩하여 EC2 인스턴스에서 실행할 명령어로 전달

 

  • Condition (Fn::Equals)
Resources:
  MountPoint:
    Type: AWS::EC2::VolumeAttachment
    Condition: CreateProdResources

조건을 리소스에 적용하는 예시

Resources:
  MountPoint:
    Type: AWS::EC2::VolumeAttachment
    Condition: CreateProdResources

Condition 속성은 CreateProdResources 조건이 참일 때만 MountPoint 리소스가 생성되도록 설정

 

 

Ref, GetAtt, FindInMap, ImportValue 등 다양한 내장 함수는 동적인 참조와 값 변환을 가능하게 하여, CloudFormation 템플릿을 효율적으로 관리할 수 있게 함

각 함수는 리소스 속성 참조, 문자열 처리, 조건부 생성 등 여러 기능을 수행하여 유연한 템플릿 구성을 지원 

 

 

💡 롤백 개요

  • CloudFormation에서 스택 생성 또는 업데이트가 실패하면, 기본적으로 롤백이 발생
  • 이는 모든 리소스가 삭제되어 이전 상태로 돌아가는 것을 의미
  • 롤백을 통해 문제가 발생한 스택을 복구할 수 있지만, 생성된 리소스는 모두 삭제됨
  • 롤백을 비활성화하여 오류가 발생한 상태에서 문제를 진단하고 리소스를 유지할 수도 있음

 

〰️ 롤백 시나리오

  1. 스택 생성 실패
    • 기본 설정으로 롤백이 발생하며, 모든 리소스가 삭제된다.
    • 생성 로그를 통해 실패 이유를 확인할 수 있지만, 리소스 자체는 유지되지 않는다.
      • 롤백 비활성화 옵션을 선택하면 생성된 리소스를 유지하여 문제를 진단할 수 있다.
  2. 스택 업데이트 실패
    • 업데이트 중 실패하면 이전 상태로 롤백되어 업데이트된 리소스가 삭제되고, 이전 성공 상태로 복구된다.
    • 다시 로그를 통해 실패 원인을 확인할 수 있다.
  3. 롤백 실패
    • 롤백 중 오류가 발생하면, 이는 스택 자체에 문제가 있거나 수동으로 변경된 리소스가 있을 가능성이 있다.
    • 이 경우 업데이트 롤백 계속(ContinueUpdateRollback) 명령을 사용해 롤백을 재시도할 수 있다. >>이 명령은 콘솔, CLI, API에서 실행 가능

 

✅ 롤백 옵션

<2가지 옵션>

  1. 모든 리소스를 롤백: 문제가 발생하면 스택 전체를 롤백하여 모든 리소스를 삭제
  2. 성공한 리소스를 유지: 실패한 리소스를 제외하고 성공적으로 생성된 리소스는 유지

 

💡 CloudFormation의 서비스 역할

  • CloudFormation은 서비스 역할을 사용할 수 있다.
  • 이는 CloudFormation 전용 IAM 역할로, 이 역할을 통해 사용자가 아닌 CloudFormation이 직접 스택 리소스를 생성, 업데이트 및 삭제할 수 있다.
  • 사용자가 리소스를 직접 관리할 권한이 없는 경우, 서비스 역할을 사용하여 CloudFormation에 필요한 권한을 위임할 수 있다.

 

❓ 서비스 역할의 사용 이유

  • 서비스 역할을 사용하면, 최소 권한 원칙을 준수하면서도 CloudFormation이 스택 리소스를 관리할 수 있다.
  • 즉, 사용자는 리소스를 직접 관리할 수 없지만, CloudFormation이 대신 리소스를 관리하게 할 수 있다. (>> 사용자는 CloudFormation이 역할을 호출할 수 있는 권한(iam)만 있으면 됨.)

 

서비스 역할 사용 예시

  1. IAM 역할 생성
    • CloudFormation 전용으로 IAM 역할을 생성하고, 이를 통해 CloudFormation이 S3 버킷을 생성, 업데이트, 삭제할 수 있도록 권한을 부여
  2. iam권한
    • iam권한을 통해 사용자는 CloudFormation에 특정 역할을 전달할 수 있음.
  3. CloudFormation과 역할 지정
    • 스택 생성 시 IAM 역할을 선택하지 않으면, CloudFormation은 사용자의 권한을 사용 하지만 IAM 역할을 선택하면, CloudFormation은 해당 역할에 부여된 권한으로 스택을 관리하게 됨
CloudFormation 서비스 역할을 통해 최소 권한 원칙을 준수하면서, CloudFormation이 스택 리소스를 관리할 수 있다.

iam권한을 통해 사용자는 CloudFormation에 특정 역할을 전달할 수 있으며, CloudFormation은 해당 역할의 권한을 사용해 작업을 수행한다.

스택 생성 시 IAM 역할을 지정하여 CloudFormation이 사용자의 권한이 아닌, 역할에 정의된 권한을 사용할 수 있다.

 

💡 Capabilities 개요

  • CloudFormation은 IAM 리소스를 생성하거나 업데이트할 때 특정 Capabilities를 요구한다.
  • 이는 IAM 사용자, 역할, 그룹, 정책 등을 생성할 때 CloudFormation이 해당 리소스를 관리할 권한이 있음을 명시적으로 인정해야 한다

 

📌 주요 Capabilities

  1. CAPABILITY_IAM
    • IAM 리소스를 생성하거나 업데이트할 때 필요
    • 이름 없는 IAM 리소스를 생성할 경우 사용됨. 예를 들어, CloudFormation 템플릿을 통해 IAM 역할, 사용자, 정책을 만들 때 사용자가 이를 명시적으로 승인해야 함
  2. CAPABILITY_NAMED_IAM
    • 사용자 지정 이름이 있는 IAM 리소스를 생성할 때 필요
    • 예를 들어, RoleName이 지정된 IAM 역할을 생성할 때 사용됨
    • CloudFormation이 지정된 이름으로 IAM 리소스를 생성할 수 있음을 명시적으로 인정하는 의미
  3. CAPABILITY_AUTO_EXPAND
    • 동적 템플릿 변환에 필요
    • 매크로, 중첩된 스택 또는 스택 내 스택이 포함된 템플릿을 사용할 때 이 Capabilities가 필요
    • 템플릿이 배포되기 전에 매크로 등에 의해 변환될 수 있는 경우 반드시 사용해야 함

 

⚠️ InsufficientCapabilitiesException ⚠️

  • 이 예외는 CloudFormation 템플릿에 필요한 Capabilities를 확인하지 않은 경우 발생
  • 스택 생성 또는 업데이트 중 IAM 리소스를 생성해야 할 때 Capabilities를 제공하지 않으면 이 오류가 발생
  • 해결 방법은 템플릿을 다시 실행할 때, 콘솔에서 확인 박스를 체크하거나, API 또는 CLI에서 Capabilities를 명시적으로 제공

 

 

💡 DeletionPolicy (삭제 정책) 개요

  • DeletionPolicy(삭제 정책)은 CloudFormation 스택이 삭제될 때 리소스를 어떻게 처리할지 제어하는 방법
  • 이 정책은 데이터 손실을 방지하고 특정 리소스를 보존하거나 백업할 때 유용’

 

 

📌 DeletionPolicy 옵션

  1. Retain
    • 리소스를 삭제하지 않고 유지한다.
    • 리소스가 스택에서 삭제되지 않으며, 수동으로 리소스를 삭제해야 한다
      • 예를 들어, 보안 그룹, S3 버킷 등에서 사용하여 스택이 삭제되더라도 해당 리소스는 그대로 남아있게 되는 것
  2. Snapshot
    • 리소스를 삭제하기 전에 스냅샷을 생성한다
    • 이 옵션은 EBS 볼륨, ElastiCache Cluster, RDS DBInstance와 같은 스냅샷을 지원하는 리소스에서 사용된다
    • 데이터를 보존하고 싶을 때 유용하며, 스택을 삭제하더라도 스냅샷을 통해 데이터를 나중에 복구할 수 있다.
  3. Delete (기본 값)
    • 리소스를 완전히 삭제한다
    • 특별히 DeletionPolicy가 설정되지 않으면 기본적으로 이 옵션이 적용되며, 리소스는 삭제된다.

 

DeletionPolicy 예시

Resources:
  MySecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "Allow SSH access"
    DeletionPolicy: Retain

  MyVolume:
    Type: "AWS::EC2::Volume"
    Properties:
      AvailabilityZone: "us-east-1a"
      Size: 1
      VolumeType: "gp2"
    DeletionPolicy: Snapshot
  • MySecurityGroup: 스택이 삭제되더라도 보안 그룹이 유지된다.
  • MyVolume: 스택이 삭제될 때 EBS 볼륨은 삭제되지만 스냅샷이 생성된다.

 

🚨 S3 버킷 삭제 시 주의 사항

  • S3 버킷을 삭제하려면, 먼저 버킷 내 모든 객체를 삭제해야 한다. 버킷이 비워지지 않으면 삭제가 불가능!!

 

 

💡 스택 정책(Stack Policy)

  • 스택 정책은 CloudFormation 스택에서 특정 리소스를 업데이트로부터 보호하는 역할
  • 스택 업데이트 시, 의도하지 않은 변경으로부터 중요한 리소스를 보호할 수 있다.
  • 스택 정책은 JSON 문서로 작성되며, 특정 리소스에 대한 업데이트 작업을 허용하거나 차단하는 규칙을 정의한다

 

스택 정책 예시

//모든 리소스에서 업데이트를 허용
{
  "Statement": [
    {
      "Effect": "Allow", 
      "Action": "Update:*",
      "Resource": "*"
    },
    
    // ProductionDatabase라는 리소스에 대한 모든 업데이트를 차단
    {
      "Effect": "Deny", 
      "Action": "Update:*",
      "Resource": "LogicalResourceId/ProductionDatabase"
    }
  ]
}

 

 

📌 스택 정책의 목적

  • 중요한 리소스를 의도치 않은 업데이트로부터 보호
  • 특정 리소스를 업데이트할 수 없도록 정책을 통해 제어
DeletionPolicy는 스택이 삭제될 때 리소스를 유지(Retain), 스냅샷(Snapshot), 또는 삭제(Delete)할지 결정한다

Retain은 리소스를 유지하고, Snapshot은 스냅샷을 생성하며, Delete는 리소스를 완전히 삭제한다.

스택 정책(Stack Policy)은 스택 업데이트 시 특정 리소스를 보호하여, 의도치 않은 변경으로부터 리소스를 지킬 수 있다.

 

 

 

💡 Termination Protection (종료 방지) 개요

  • Termination Protection(종료 방지)는 우발적인 스택 삭제로부터 보호하는 기능
  • EC2 인스턴스의 종료 방지와 유사하게, CloudFormation 스택에도 종료 방지 기능을 설정할 수 있다.
  • 스택을 실수로 삭제하지 않도록 보호 가능

종료 방지를 비활성화한 후에는 스택을 삭제할 수 있다. 실수로 스택을 삭제하지 않도록 보호하려면 종료 방지를 계속 활성화 상태로 유지하는 것이 좋다.

 

 

💡 CloudFormation Custom Resources (사용자 지정 리소스) 개요

  • CloudFormation 사용자 지정 리소스는 CloudFormation에서 지원하지 않는 리소스를 정의하거나 타사 서비스, 온프레미스 리소스 또는 특수한 사용자 지정 프로비저닝 로직을 사용해야 할 때 유용
  • Lambda 함수 또는 SNS 토픽을 통해 스택 생성, 업데이트, 삭제 시 사용자 지정 작업을 수행할 수 있다.

 

 

🧐 사용자 지정 리소스 사용 사례

  1. CloudFormation에서 지원하지 않는 리소스 정의
    • 아직 CloudFormation에서 직접 지원하지 않는 리소스를 생성하거나 관리할 수 있다.
  2. 타사 리소스 또는 온프레미스 리소스와의 연동
    • 자체 데이터 센터나 외부 서비스와 연동하는 사용자 지정 리소스를 정의할 수 있다.
  3. 삭제 전에 Lambda 함수를 통한 작업
    • EX) S3 버킷 삭제 전Lambda 함수를 실행하여 S3 버킷의 모든 콘텐츠를 비우는 작업을 수행할 수 있다. CloudFormation 자체로는 비어 있지 않은 S3 버킷을 삭제할 수 없기 때문에, 이러한 사용자 지정 리소스를 통해 문제를 해결할 수 있따.

 

🔍 사용자 지정 리소스 정의 방법

사용자 지정 리소스는 템플릿에서 Custom::MyCustomResourceTypeName으로 정의되며, Lambda 함수 또는 SNS 토픽과 연동된다.

Resources:
  MyCustomLambdaResource:
    Type: Custom::MyLambdaResource
    Properties:
      ServiceToken: !GetAtt MyLambdaFunction.Arn

Lambda 함수 기반 사용자 지정 리소스 예시

  • Type: 사용자 지정 리소스의 유형은 Custom::MyLambdaResource로 지정
  • ServiceToken: Lambda 함수의 ARN 또는 SNS ARN이 필요
  • Lambda 함수는 리소스를 생성하거나 삭제하기 전에 필요한 작업을 수행

 

🧐 S3 버킷 삭제 예시

사용자 지정 리소스를 통해 S3 버킷 삭제 시 Lambda 함수를 사용

  1. Lambda 함수가 호출되어 S3 버킷 내부의 모든 객체를 삭제
  2. 이후 CloudFormation은 비워진 S3 버킷을 삭제
  3. 이러한 방식으로 S3 버킷의 내용물을 안전하게 처리한 후 삭제 가능

 

 

💡 CloudFormation StackSets 개요

  • StackSets여러 계정과 리전에 걸쳐 스택을 배포, 업데이트, 삭제할 수 있는 기능.
  • 이를 통해 단일 작업으로 여러 계정과 리전에서 동시에 스택을 관리 가능

 

 

🧐 StackSets 사용 사례

  1. 여러 계정에 스택 배포
    • StackSets를 사용하면 AWS 조직의 모든 계정이나 특정 계정 그룹에 동일한 스택을 배포할 수 있다.
  2. 여러 리전에서 스택 관리
    • 단일 작업으로 여러 리전에 스택을 배포하거나 업데이트할 수 있다.
  3. 일괄 업데이트
    • 스택 업데이트 시 모든 대상 계정과 리전의 스택 인스턴스를 동시에 업데이트할 수 있다.

 

AWS 조직 내에서 사용되는 일반적인 시나리오는 모든 계정에 스택을 배포하는 것.

StackSets를 통해 각 계정과 리전의 스택 인스턴스를 일괄 관리할 수 있다.

 

CloudFormation 사용자 지정 리소스는 지원되지 않는 리소스를 정의하거나, Lambda 함수 등을 통해 사용자 지정 작업을 수행하는 데 유용하다.

Lambda 함수를 활용해 S3 버킷 삭제 전 콘텐츠를 비우는 등의 작업을 처리할 수 있다.

StackSets는 여러 계정과 리전에서 스택을 관리할 수 있는 기능으로, AWS 조직 내에서 스택을 일괄적으로 배포하고 관리할 때 유용하다.

 

반응형