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

上次更新时间:2019 年 7 月 8 日

我想删除新的或现有的 AWS CloudFormation 堆栈,但不想删除所有堆栈资源。如何保留堆栈中的部分资源?

简短描述

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

删除堆栈时,请指定保留快照删除策略选项:

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

解决方法

以下步骤展示了如何使用保留策略防止在删除 AWS CloudFormation 堆栈期间删除安全组。

在 AWS CloudFormation 模板中指定 DeletionPolicy 属性

在 AWS CloudFormation 模板中,输入 Retain 作为删除堆栈时要保留的资源的 DeletionPolicy。在以下示例 JSON 和 YAML 模板代码段中,为安全组指定了保留策略。

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

上传更新后的 AWS CloudFormation 模板

  1. 打开 AWS CloudFormation 控制台
  2. 选择创建堆栈
  3. 选择模板部分,选择将模板上传到 Amazon S3,然后选择您修改的 AWS CloudFormation 模板以纳入删除策略。
  4. 选择下一步
  5. 堆栈名称部分输入堆栈的名称,然后选择下一步
  6. 选项页面上,为堆栈选择适当的选项,然后选择下一步
  7. 选择创建

测试 DeletionPolicy 属性

  1. 删除 AWS CloudFormation 堆栈
  2. 删除堆栈后,确认采用保留策略的资源是否仍然可用。

对于此解决方案中的示例模板代码段,您可以在删除 AWS CloudFormation 堆栈后,按照以下步骤验证保留策略是否成功。

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格的网络和安全部分,选择安全组
  3. 确认采用保留策略的安全组是否仍然可用。