如何在删除 AWS CloudFormation 堆栈时保留部分资源?

上次更新日期:2022 年 3 月 24 日

我想删除新的或现有的 AWS CloudFormation 堆栈,但不想删除堆栈的所有资源。我怎样才能保留部分资源并仍然删除堆栈?

简短描述

要在删除堆栈时保留某些资源,请使用 CloudFormation 模板中的 DeletionPolicy 属性

在删除堆栈之前,请确保为要保留的每个资源指定了 Retain(保留)、Snapshot(快照)或 Delete(删除)策略选项:

  • Retain(保留)选项可在删除堆栈时保留资源。
  • Snapshot(快照)选项可在删除资源之前创建资源快照。
    注意:此选项仅适用于支持快照的资源。
  • 删除选项可同时删除资源和堆栈。
    注意:如果未设置 DeletionPolicy,则此选项是默认结果。

解决方法

以下步骤向您展示了如何使用 DeletionPolicyRetain(保留)选项来防止在 CloudFormation 堆栈删除期间删除资源。

在 AWS CloudFormation 模板中指定 DeletionPolicy 属性

在 CloudFormation 模板中,输入 Retain(保留)作为要保留的资源的 DeletionPolicy。在以下示例 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(选择模板)部分,选择 Upload a template to Amazon S3(将模板上载到 Amazon S3),然后选择您修改的 CloudFormation 模板以纳入删除策略。
  4. 选择 Next(下一步)。
  5. 如果要创建新堆栈,在 Stack name(堆栈名称)中输入堆栈的名称,然后选择 Next(下一步)。
  6. Options(选项)页面上,为堆栈选择适当的选项,然后选择 Next(下一步)。
  7. 选择 Create(创建)。

测试 DeletionPolicy 属性

  1. 删除 AWS CloudFormation 堆栈
  2. 删除堆栈后,确认DeletionPolicyRetain(保留)选项的资源仍然可用。您可以使用 AWS 管理控制台或 AWS CLI 检查各自服务中的资源。

例如,在删除 CloudFormation 堆栈后,您可以使用以下步骤验证上述模板的 Retain(保留)策略是否成功。

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格的 Network & Security(网络和安全)部分,选择 Security Groups(安全组)。
  3. 确认附上 Retain(保留)策略的安全组仍然可用。