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

2 分钟阅读
0

我想删除新的或现有的 AWS CloudFormation 堆栈,但不想删除堆栈的所有资源。

简短描述

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

在删除堆栈之前,请确保为要保留的每项资源指定保留快照删除策略选项:

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

解决方法

以下步骤向您展示如何使用 DeletionPolicy保留选项来防止在删除 CloudFormation 堆栈时删除资源。

在 AWS CloudFormation 模板中指定 DeletionPolicy 属性

在 CloudFormation 模板中,输入 Retain 作为要保留资源的 DeletionPolicy。在以下 JSON 和 YAML 模板示例中,为 AWS::EC2::SecurityGroup 资源指定了保留策略。

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. 对于新堆栈,选择创建堆栈。对于现有堆栈,选择要更新的堆栈,然后选择更新堆栈
  3. 选择模板中,选择将模板上传到 Amazon S3,然后选择经过修改包含删除策略的 CloudFormation 模板。
  4. 选择下一步
  5. 如果您要创建新堆栈,请在堆栈名称中输入堆栈的名称,然后选择下一步
  6. 选项页面上,为您的堆栈选择相应的选项,然后选择下一步
  7. 选择创建

测试 DeletionPolicy 属性

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

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

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

相关信息

在 AWS CloudFormation 控制台上创建堆栈

如何防止 CloudFormation 堆栈中的资源被删除或更新?

AWS 官方
AWS 官方已更新 2 年前