AWS CloudFormation 스택을 삭제할 때 리소스 일부를 어떻게 유지할 수 있습니까?

최종 업데이트 날짜: 2022년 3월 24일

신규 또는 기존 AWS CloudFormation 스택을 삭제할 때 스택의 모든 리소스를 삭제하지 않으려고 합니다. 리소스 중 일부를 유지하면서도 스택을 삭제하려면 어떻게 해야 합니까?

간략한 설명

스택을 삭제할 때 특정 리소스를 유지하려면 CloudFormation 템플릿에서 DeletionPolicy 속성을 사용합니다.

스택을 삭제하기 전에 유지할 각 리소스에 대해 보존(Retain), 스냅샷(Snapshot) 또는삭제(Delete ) 정책 옵션을 지정해야 합니다.

  • 보존(Retain) 옵션을 지정하면 스택 삭제 시 리소스가 유지됩니다.
  • 스냅샷(Snapshot) 옵션은 리소스를 삭제하기 전에 해당 리소스의 스냅샷을 생성합니다.
    참고: 이 옵션은 스냅샷을 지원하는 리소스에만 사용할 수 있습니다.
  • [Delete] 옵션을 지정하면 스택과 함께 리소스가 삭제됩니다.
    참고: DeletionPolicy를 설정하지 않으면 이 옵션이 기본 결과입니다.

해결 방법

다음 단계에서는 DeletionPolicy에 대해 유지(Retain) 옵션을 사용하여 CloudFormation 스택 삭제 중 리소스가 삭제되지 않도록 하는 방법을 보여줍니다.

AWS CloudFormation 템플릿에서 DeletionPolicy 속성 지정

CloudFormation 템플릿에서, 유지하려는 리소스에 대한 DeletionPolicy유지(Retain)를 입력합니다. 다음 예제 JSON 및 YAML 템플릿에서는 AWS::EC2::SecurityGroup 리소스에 유지(Retain) 정책이 지정되었습니다.

JSON:

{
  "Description": "AWS CloudFormation DeletionPolicy demo",
  "Resources": {
    "SGroup1": {
      "Type": "AWS::EC2::SecurityGroup",
      "DeletionPolicy": "Retain",
      "Properties": {
        "GroupDescription": "EC2 Instance access"
      }
    },
    "SGroup2": {
      "Type": "AWS::EC2::SecurityGroup",
      "DeletionPolicy": "Retain",
      "Properties": {
        "GroupDescription": "EC2 Instance access"
      }
    },
    "SGroup1Ingress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "DeletionPolicy": "Retain",
      "Properties": {
        "GroupName": {
          "Ref": "SGroup1"
        },
        "IpProtocol": "tcp",
        "ToPort": "80",
        "FromPort": "80",
        "CidrIp": "0.0.0.0/0"
      }
    },
    "SGroup2Ingress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "DeletionPolicy": "Retain",
      "Properties": {
        "GroupName": {
          "Ref": "SGroup2"
        },
        "IpProtocol": "tcp",
        "ToPort": "80",
        "FromPort": "80",
        "CidrIp": "0.0.0.0/0"
      }
    }
  }
}

YAML:

Description: AWS CloudFormation DeletionPolicy demo
Resources:
  SGroup1:
    Type: 'AWS::EC2::SecurityGroup'
    DeletionPolicy: Retain
    Properties:
      GroupDescription: EC2 Instance access
  SGroup2:
    Type: 'AWS::EC2::SecurityGroup'
    DeletionPolicy: Retain
    Properties:
      GroupDescription: EC2 Instance access
  SGroup1Ingress:
    Type: 'AWS::EC2::SecurityGroupIngress'
    DeletionPolicy: Retain
    Properties:
      GroupName: !Ref SGroup1
      IpProtocol: tcp
      ToPort: '80'
      FromPort: '80'
      CidrIp: 0.0.0.0/0
  SGroup2Ingress:
    Type: 'AWS::EC2::SecurityGroupIngress'
    DeletionPolicy: Retain
    Properties:
      GroupName: !Ref SGroup2
      IpProtocol: tcp
      ToPort: '80'
      FromPort: '80'
      CidrIp: 0.0.0.0/0

업데이트된 CloudFormation 템플릿 업로드

  1. AWS CloudFormation 콘솔을 엽니다.
  2. 새 스택의 경우 스택 생성(Create Stack)을 선택합니다. 기존 스택의 경우 업데이트할 스택을 선택한 다음 스택 업데이트(Update Stack)을 선택합니다.
  3. 템플릿 선택(Choose a template)에서 Amazon S3에 템플릿 업로드(Upload a template to Amazon S3)를 선택한 다음 삭제 정책을 포함하도록 수정한 CloudFormation 템플릿을 선택합니다.
  4. 다음(Next)을 선택합니다.
  5. 새 스택을 만드는 경우 스택 이름(Stack name)에 스택의 이름을 입력한 후 다음(Next)을 선택합니다.
  6. 옵션(Options) 페이지에서 스택의 적절한 옵션을 선택한 후 다음(Next)을 선택합니다.
  7. 생성(Create)을 선택합니다.

DeletionPolicy 속성 테스트

  1. AWS CloudFormation 스택을 삭제합니다.
  2. 스택 삭제가 완료된 후 DeletionPolicy유지(Retain) 옵션을 계속 사용할 수 있는지 확인합니다. AWS 관리 콘솔 또는 AWS CLI를 사용하여 해당 서비스의 리소스를 확인할 수 있습니다.

예를 들어 CloudFormation 스택을 삭제한 후 다음 단계를 사용하여 이전 템플릿에 대한 유지(Retain) 정책의 성공을 확인할 수 있습니다.

  1. Amazon EC2 콘솔을 엽니다.
  2. 탐색 창의 네트워크 및 보안(Network & Security) 섹션에서 보안 그룹(Security Groups)을 선택합니다.
  3. 유지(Retain) 정책이 연결된 보안 그룹을 계속 사용할 수 있는지 확인합니다.