💡 AWS CloudFormation 개요
- CloudFormation은 코드로 AWS 인프라를 정의하는 도구
- 사용자는 CloudFormation 템플릿을 통해 필요한 리소스를 선언하고, 이를 자동으로 생성하고 연결할 수 있다.
- 예를 들어 보안 그룹, EC2 인스턴스, S3 버킷, 로드 밸런서 등을 선언하여 전체 인프라를 설정할 수 있다.
❓ 사용 이유
- 인프라 코드화
- 리소스 생성이 자동화되며, 코드로 인프라를 제어할 수 있어 효율적이다.
- 모든 변경사항이 코드로 관리되므로, 버전 제어 시스템을 통해 관리할 수 있다.
- 비용 절감
- 리소스 비용을 추적할 수 있으며, 자동화된 환경에서는 예산을 절감하기 위한 전략을 세울 수 있다.
- 예를 들어, 개발 환경에서 업무 시간이 아닌 경우 리소스를 자동으로 삭제하고 다시 생성할 수 있다.
- 생산성 향상
- 인프라를 빠르게 생성, 삭제할 수 있어 테스트와 개발에 유리하다.
- 필요한 리소스를 즉시 생성하고 사용한 만큼만 비용을 지불할 수 있다.
- 관심사 분리
- 다양한 애플리케이션 계층에 대해 개별적인 스택을 구성할 수 있어 네트워크, VPC, 애플리케이션 등 여러 계층을 효율적으로 관리할 수 있다.
- 재사용 가능성
- 기존 템플릿과 웹의 자료를 활용해 템플릿을 신속히 작성할 수 있어 개발 속도가 빨라진다.
🦾 CloudFormation의 작동 원리
- 템플릿 업로드
- CloudFormation 템플릿을 Amazon S3에 업로드하고, 이를 참조하여 스택을 생성한다. 스택은 AWS 리소스 집합으로, 특정 리전에서 고유한 이름으로 식별된다.
- 템플릿 업데이트
- 템플릿을 수정하려면 새로운 버전을 업로드하고 스택을 업데이트해야 한다.
- 스택이 삭제되면 그에 관련된 모든 리소스가 제거된다.
📄 템플릿 구성 요소
- AWSTemplateFormatVersion: 템플릿 버전
- Description: 템플릿에 대한 설명을 작성 가능
- Resources: 모든 AWS 리소스를 선언하는 필수 섹션으로, CloudFormation의 핵심
- Parameters: 템플릿에 동적 입력을 전달 가능
- Mappings: 템플릿 내에서 사용할 정적 변수를 정의
- Outputs: 생성된 리소스의 정보를 참조하는 데 사용됨
- Conditions: 리소스 생성 여부를 결정하는 조건 목록
- 템플릿 도우미: 참조, 함수 등이 포함되어 있으며, 이를 통해 다양한 유틸리티를 활용할 수 있음
📤 템플릿 배포 방법
템플릿은 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 Macros와 Transform 기능을 사용해야 한다 (지금은 몰라도 O)
- 사용자 정의 리소스(Custom Resource)
- 대부분의 AWS 서비스가 CloudFormation을 통해 지원되지만, 일부 특정 서비스는 지원되지 않을 수 있는데,
- 이 경우 사용자 정의 리소스(Custom Resource)를 사용하여 해결할 수 있다.
- 대부분의 AWS 서비스가 CloudFormation을 통해 지원되지만, 일부 특정 서비스는 지원되지 않을 수 있는데,
💡 파라미터 개요
- 파라미터는 CloudFormation 템플릿에 동적인 입력값을 제공하는 방법
- 이를 통해 템플릿을 재사용하고, 사용자로부터 입력을 받을 수 있어 다양한 상황에서 유연하게 사용할 수 있다.
- 파라미터를 잘 활용하면, 템플릿을 수정하지 않고도 필요한 값만 변경하여 리소스를 생성할 수 있다!!
❓ 파라미터 사용 이유
- 템플릿 내 리소스 구성이 향후에 변경될 가능성이 있다면 파라미터로 만들어야 한다.
- 입력 값이 미리 결정되지 않은 경우, 파라미터로 처리하면 유연성을 확보할 수 있다.
✅ 파라미터 속성
- 유형(Type)
- 파라미터는 문자열(String), 숫자(Number), 쉼표로 구분된 목록, 숫자 목록 등 다양한 형식을 가질 수 있다.
- 설명(Description)
- 파라미터에 대한 설명을 추가할 수 있다.
- 제약 조건(Constraints)
- 최소/최대 길이, 최소/최대 값, 허용된 값 목록, 정규 표현식(패턴), 기본값(Default), NoEcho 등이 있다. (입력값을 제어하고, 유효성 검사 가능)
🧐 주요 파라미터 예시
- 허용된 값(AllowedValues)
- 예를 들어, EC2 인스턴스 유형을 선택하기 위한 파라미터 InstanceType을 정의할 수 있으며, t2.micro, t2.small, t2.medium 중 하나만 선택할 수 있도록 제한할 수 있다. (기본값은 t2.micro )
- NoEcho
- 보안 관련 파라미터
- 예를 들어 데이터베이스 비밀번호 같은 경우, NoEcho를 true로 설정하면 로그 등에 비밀번호가 노출되지 않도록 할 수 있다.
- 보안 관련 파라미터
🎤 파라미터 참조 방법
- 파라미터는 CloudFormation 템플릿 어디에서나 참조할 수 있다. (Ref 함수를 사용)
- YAML에서는 !Ref로 간단히 표현되며, 해당 파라미터나 리소스를 참조할 수 있다.
- EX ) 보안 그룹 설명을 위한 파라미터가 SecurityGroupDescription이라면, 이를 참조하기 위해 Ref 함수를 사용하여 보안 그룹의 설명을 지정할 수 있다.
💡 가상 파라미터 (Pseudo Parameters)
- CloudFormation은 미리 정의된 가상 파라미터를 제공
- 템플릿 내에서 자동으로 사용 가능하며, 별도로 생성할 필요가 없다.
<대표적인 가상 파라미터>
- AWS::AccountId: 현재 계정 ID를 반환
- AWS::Region: 현재 AWS 리전을 반환
- AWS::StackId: 스택 ID를 반환
- AWS::NoValue: 반환할 값이 없음을 나타냄
템플릿에서 계정 ID나 리전 등의 정보를 자동으로 활용할 수 있다.
파라미터는 CloudFormation 템플릿에 동적 입력을 제공하며, 유연성을 극대화하는 역할을 한다.
유형과 제약 조건을 통해 파라미터의 유효성을 제어하고, 입력 오류를 방지할 수 있다.
Ref 함수를 사용하여 템플릿 내 파라미터나 리소스를 참조할 수 있으며, 가상 파라미터를 통해 AWS 환경에 대한 정보를 자동으로 참조할 수 있다.
💡 CloudFormation 매핑 개요
- CloudFormation 템플릿 내에서 고정된 값을 설정하는 방법
- 이를 통해 개발 / 프로덕션 등 다양한 환경이나 AWS 리전에 따라 값이 달라지도록 할 수 있다. (리전, 아키텍처, AMI ID 등 환경에 따라 다른 값을 자동 제공할 수 있어 편리)
- 매핑은 템플릿 내에서 가능한 모든 값을 하드 코딩하는 방식으로 구성
🧐 매핑 사용법
매핑된 값에 접근하려면 FindInMap 함수를 사용
- Map 이름을 지정한다. 예를 들어, RegionMap이라는 매핑을 사용할 수 있다.
- 최상위 키는 사용자가 원하는 리전을 참조한다. 가상 파라미터인 AWS::Region을 사용하여 현재 리전을 자동으로 가져올 수 있다.
- 마지막으로 하위 키는 아키텍처 유형(예: 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 파라미터
매핑과 파라미터는 서로 다른 용도로 사용된다
- 매핑
- 미리 정의된 고정 값이 있을 때 적합하다.
- 예를 들어, 리전, 가용 영역, AWS 계정, 환경(개발/프로덕션) 등에서 도출되는 값을 미리 알고 있을 때 사용한다.
- 파라미터
- 런타임에 결정되는 동적 값에 적합히다.
- 사용자가 선택한 값에 따라 달라질 수 있으며, 사용자의 입력에 따라 더 많은 자유도를 제공한다.
매핑은 고정된 값을 설정하고 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에서 스택 생성 또는 업데이트가 실패하면, 기본적으로 롤백이 발생
- 이는 모든 리소스가 삭제되어 이전 상태로 돌아가는 것을 의미
- 롤백을 통해 문제가 발생한 스택을 복구할 수 있지만, 생성된 리소스는 모두 삭제됨
- 롤백을 비활성화하여 오류가 발생한 상태에서 문제를 진단하고 리소스를 유지할 수도 있음
〰️ 롤백 시나리오
- 스택 생성 실패
- 기본 설정으로 롤백이 발생하며, 모든 리소스가 삭제된다.
- 생성 로그를 통해 실패 이유를 확인할 수 있지만, 리소스 자체는 유지되지 않는다.
- 롤백 비활성화 옵션을 선택하면 생성된 리소스를 유지하여 문제를 진단할 수 있다.
- 스택 업데이트 실패
- 업데이트 중 실패하면 이전 상태로 롤백되어 업데이트된 리소스가 삭제되고, 이전 성공 상태로 복구된다.
- 다시 로그를 통해 실패 원인을 확인할 수 있다.
- 롤백 실패
- 롤백 중 오류가 발생하면, 이는 스택 자체에 문제가 있거나 수동으로 변경된 리소스가 있을 가능성이 있다.
- 이 경우 업데이트 롤백 계속(ContinueUpdateRollback) 명령을 사용해 롤백을 재시도할 수 있다. >>이 명령은 콘솔, CLI, API에서 실행 가능
✅ 롤백 옵션
<2가지 옵션>
- 모든 리소스를 롤백: 문제가 발생하면 스택 전체를 롤백하여 모든 리소스를 삭제
- 성공한 리소스를 유지: 실패한 리소스를 제외하고 성공적으로 생성된 리소스는 유지
💡 CloudFormation의 서비스 역할
- CloudFormation은 서비스 역할을 사용할 수 있다.
- 이는 CloudFormation 전용 IAM 역할로, 이 역할을 통해 사용자가 아닌 CloudFormation이 직접 스택 리소스를 생성, 업데이트 및 삭제할 수 있다.
- 사용자가 리소스를 직접 관리할 권한이 없는 경우, 서비스 역할을 사용하여 CloudFormation에 필요한 권한을 위임할 수 있다.
❓ 서비스 역할의 사용 이유
- 서비스 역할을 사용하면, 최소 권한 원칙을 준수하면서도 CloudFormation이 스택 리소스를 관리할 수 있다.
- 즉, 사용자는 리소스를 직접 관리할 수 없지만, CloudFormation이 대신 리소스를 관리하게 할 수 있다. (>> 사용자는 CloudFormation이 역할을 호출할 수 있는 권한(iam)만 있으면 됨.)
서비스 역할 사용 예시
- IAM 역할 생성
- CloudFormation 전용으로 IAM 역할을 생성하고, 이를 통해 CloudFormation이 S3 버킷을 생성, 업데이트, 삭제할 수 있도록 권한을 부여
- iam권한
- iam권한을 통해 사용자는 CloudFormation에 특정 역할을 전달할 수 있음.
- CloudFormation과 역할 지정
- 스택 생성 시 IAM 역할을 선택하지 않으면, CloudFormation은 사용자의 권한을 사용 하지만 IAM 역할을 선택하면, CloudFormation은 해당 역할에 부여된 권한으로 스택을 관리하게 됨
CloudFormation 서비스 역할을 통해 최소 권한 원칙을 준수하면서, CloudFormation이 스택 리소스를 관리할 수 있다.
iam권한을 통해 사용자는 CloudFormation에 특정 역할을 전달할 수 있으며, CloudFormation은 해당 역할의 권한을 사용해 작업을 수행한다.
스택 생성 시 IAM 역할을 지정하여 CloudFormation이 사용자의 권한이 아닌, 역할에 정의된 권한을 사용할 수 있다.
💡 Capabilities 개요
- CloudFormation은 IAM 리소스를 생성하거나 업데이트할 때 특정 Capabilities를 요구한다.
- 이는 IAM 사용자, 역할, 그룹, 정책 등을 생성할 때 CloudFormation이 해당 리소스를 관리할 권한이 있음을 명시적으로 인정해야 한다
📌 주요 Capabilities
- CAPABILITY_IAM
- IAM 리소스를 생성하거나 업데이트할 때 필요
- 이름 없는 IAM 리소스를 생성할 경우 사용됨. 예를 들어, CloudFormation 템플릿을 통해 IAM 역할, 사용자, 정책을 만들 때 사용자가 이를 명시적으로 승인해야 함
- CAPABILITY_NAMED_IAM
- 사용자 지정 이름이 있는 IAM 리소스를 생성할 때 필요
- 예를 들어, RoleName이 지정된 IAM 역할을 생성할 때 사용됨
- CloudFormation이 지정된 이름으로 IAM 리소스를 생성할 수 있음을 명시적으로 인정하는 의미
- CAPABILITY_AUTO_EXPAND
- 동적 템플릿 변환에 필요
- 매크로, 중첩된 스택 또는 스택 내 스택이 포함된 템플릿을 사용할 때 이 Capabilities가 필요
- 템플릿이 배포되기 전에 매크로 등에 의해 변환될 수 있는 경우 반드시 사용해야 함
⚠️ InsufficientCapabilitiesException ⚠️
- 이 예외는 CloudFormation 템플릿에 필요한 Capabilities를 확인하지 않은 경우 발생
- 스택 생성 또는 업데이트 중 IAM 리소스를 생성해야 할 때 Capabilities를 제공하지 않으면 이 오류가 발생
- 해결 방법은 템플릿을 다시 실행할 때, 콘솔에서 확인 박스를 체크하거나, API 또는 CLI에서 Capabilities를 명시적으로 제공
💡 DeletionPolicy (삭제 정책) 개요
- DeletionPolicy(삭제 정책)은 CloudFormation 스택이 삭제될 때 리소스를 어떻게 처리할지 제어하는 방법
- 이 정책은 데이터 손실을 방지하고 특정 리소스를 보존하거나 백업할 때 유용’
📌 DeletionPolicy 옵션
- Retain
- 리소스를 삭제하지 않고 유지한다.
- 리소스가 스택에서 삭제되지 않으며, 수동으로 리소스를 삭제해야 한다
- 예를 들어, 보안 그룹, S3 버킷 등에서 사용하여 스택이 삭제되더라도 해당 리소스는 그대로 남아있게 되는 것
- Snapshot
- 리소스를 삭제하기 전에 스냅샷을 생성한다
- 이 옵션은 EBS 볼륨, ElastiCache Cluster, RDS DBInstance와 같은 스냅샷을 지원하는 리소스에서 사용된다
- 데이터를 보존하고 싶을 때 유용하며, 스택을 삭제하더라도 스냅샷을 통해 데이터를 나중에 복구할 수 있다.
- 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 토픽을 통해 스택 생성, 업데이트, 삭제 시 사용자 지정 작업을 수행할 수 있다.
🧐 사용자 지정 리소스 사용 사례
- CloudFormation에서 지원하지 않는 리소스 정의
- 아직 CloudFormation에서 직접 지원하지 않는 리소스를 생성하거나 관리할 수 있다.
- 타사 리소스 또는 온프레미스 리소스와의 연동
- 자체 데이터 센터나 외부 서비스와 연동하는 사용자 지정 리소스를 정의할 수 있다.
- 삭제 전에 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 함수를 사용
- Lambda 함수가 호출되어 S3 버킷 내부의 모든 객체를 삭제
- 이후 CloudFormation은 비워진 S3 버킷을 삭제
- 이러한 방식으로 S3 버킷의 내용물을 안전하게 처리한 후 삭제 가능
💡 CloudFormation StackSets 개요
- StackSets는 여러 계정과 리전에 걸쳐 스택을 배포, 업데이트, 삭제할 수 있는 기능.
- 이를 통해 단일 작업으로 여러 계정과 리전에서 동시에 스택을 관리 가능
🧐 StackSets 사용 사례
- 여러 계정에 스택 배포
- StackSets를 사용하면 AWS 조직의 모든 계정이나 특정 계정 그룹에 동일한 스택을 배포할 수 있다.
- 여러 리전에서 스택 관리
- 단일 작업으로 여러 리전에 스택을 배포하거나 업데이트할 수 있다.
- 일괄 업데이트
- 스택 업데이트 시 모든 대상 계정과 리전의 스택 인스턴스를 동시에 업데이트할 수 있다.
AWS 조직 내에서 사용되는 일반적인 시나리오는 모든 계정에 스택을 배포하는 것.
StackSets를 통해 각 계정과 리전의 스택 인스턴스를 일괄 관리할 수 있다.
CloudFormation 사용자 지정 리소스는 지원되지 않는 리소스를 정의하거나, Lambda 함수 등을 통해 사용자 지정 작업을 수행하는 데 유용하다.
Lambda 함수를 활용해 S3 버킷 삭제 전 콘텐츠를 비우는 등의 작업을 처리할 수 있다.
StackSets는 여러 계정과 리전에서 스택을 관리할 수 있는 기능으로, AWS 조직 내에서 스택을 일괄적으로 배포하고 관리할 때 유용하다.
'AWS' 카테고리의 다른 글
AWS Section 19-2. AWS 통합 및 메시징 : SQS, SNS 및 Kinesis (1) | 2024.11.04 |
---|---|
AWS Section 19-1. AWS 통합 및 메시징 : SQS, SNS 및 Kinesis (0) | 2024.11.04 |
AWS Section 16. ECS, ECR 및 Fargate - AWS의 도커 (0) | 2024.10.26 |
AWS Section 15. CloudFront (0) | 2024.10.26 |
AWS Section 14. Amazon S3 보안 (0) | 2024.09.27 |