如何在删除 AWS CloudFormation 堆栈时保留部分资源?
上次更新日期:2022 年 3 月 24 日
我想删除新的或现有的 AWS CloudFormation 堆栈,但不想删除堆栈的所有资源。我怎样才能保留部分资源并仍然删除堆栈?
简短描述
要在删除堆栈时保留某些资源,请使用 CloudFormation 模板中的 DeletionPolicy 属性。
在删除堆栈之前,请确保为要保留的每个资源指定了 Retain(保留)、Snapshot(快照)或 Delete(删除)策略选项:
- Retain(保留)选项可在删除堆栈时保留资源。
- Snapshot(快照)选项可在删除资源之前创建资源快照。
注意:此选项仅适用于支持快照的资源。 - 删除选项可同时删除资源和堆栈。
注意:如果未设置 DeletionPolicy,则此选项是默认结果。
解决方法
以下步骤向您展示了如何使用 DeletionPolicy 的 Retain(保留)选项来防止在 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 模板
- 打开 AWS CloudFormation 控制台。
- 对于新堆栈,选择 Create Stack(创建堆栈)。对于现有堆栈,选择要更新的堆栈,然后选择 Update Stack(更新堆栈)。
- 在 Choose a template(选择模板)部分,选择 Upload a template to Amazon S3(将模板上载到 Amazon S3),然后选择您修改的 CloudFormation 模板以纳入删除策略。
- 选择 Next(下一步)。
- 如果要创建新堆栈,在 Stack name(堆栈名称)中输入堆栈的名称,然后选择 Next(下一步)。
- 在 Options(选项)页面上,为堆栈选择适当的选项,然后选择 Next(下一步)。
- 选择 Create(创建)。
测试 DeletionPolicy 属性
- 删除 AWS CloudFormation 堆栈。
- 删除堆栈后,确认DeletionPolicy 为 Retain(保留)选项的资源仍然可用。您可以使用 AWS 管理控制台或 AWS CLI 检查各自服务中的资源。
例如,在删除 CloudFormation 堆栈后,您可以使用以下步骤验证上述模板的 Retain(保留)策略是否成功。
- 打开 Amazon EC2 控制台。
- 在导航窗格的 Network & Security(网络和安全)部分,选择 Security Groups(安全组)。
- 确认附上 Retain(保留)策略的安全组仍然可用。