能否通过CloudFormation新栈(B)引用旧栈(A)的实例ID创建AMI备份?
可以通过CloudFormation栈(B)引用栈(A)的EC2实例ID创建AMI备份
完全可以实现,核心是利用CloudFormation的跨栈引用机制,结合AWS::EC2::Image资源生成AMI,步骤如下:
1. 让栈(A)暴露EC2实例ID作为可导出的输出值
首先修改栈(A)的CloudFormation模板,将5台EC2实例的ID添加到Outputs部分并配置导出,这样栈(B)才能引用这些值。
示例栈(A)的Outputs片段:
Outputs: StackAEC2InstanceIds: Description: 栈(A)中5台EC2实例的ID列表 Value: !Join [",", !Ref EC2Instance1, !Ref EC2Instance2, !Ref EC2Instance3, !Ref EC2Instance4, !Ref EC2Instance5] Export: Name: StackA-EC2-Instance-Ids
注:如果栈(A)是通过Auto Scaling Group创建的EC2实例,需要借助Lambda自定义资源动态获取实例ID列表后再导出,因为ASG的实例会动态变化。
2. 在栈(B)中引用实例ID并创建AMI
在栈(B)的模板中,使用Fn::ImportValue导入栈(A)导出的实例ID列表,通过!Split和!Select拆分获取单个实例ID,再用AWS::EC2::Image资源创建对应AMI。
示例栈(B)的资源片段:
Resources: Instance1AMI: Type: AWS::EC2::Image Properties: Description: 栈(A)中EC2实例1的备份AMI InstanceId: !Select [0, !Split [",", !ImportValue StackA-EC2-Instance-Ids]] Name: StackA-Instance1-Backup-!Ref AWS::StackName Instance2AMI: Type: AWS::EC2::Image Properties: Description: 栈(A)中EC2实例2的备份AMI InstanceId: !Select [1, !Split [",", !ImportValue StackA-EC2-Instance-Ids]] Name: StackA-Instance2-Backup-!Ref AWS::StackName Instance3AMI: Type: AWS::EC2::Image Properties: Description: 栈(A)中EC2实例3的备份AMI InstanceId: !Select [2, !Split [",", !ImportValue StackA-EC2-Instance-Ids]] Name: StackA-Instance3-Backup-!Ref AWS::StackName Instance4AMI: Type: AWS::EC2::Image Properties: Description: 栈(A)中EC2实例4的备份AMI InstanceId: !Select [3, !Split [",", !ImportValue StackA-EC2-Instance-Ids]] Name: StackA-Instance4-Backup-!Ref AWS::StackName Instance5AMI: Type: AWS::EC2::Image Properties: Description: 栈(A)中EC2实例5的备份AMI InstanceId: !Select [4, !Split [",", !ImportValue StackA-EC2-Instance-Ids]] Name: StackA-Instance5-Backup-!Ref AWS::StackName
关键注意事项
- 栈(A)和栈(B)必须处于同一AWS区域,且使用同一AWS账户(跨账户引用需额外配置权限)
- 执行栈(B)的IAM角色需要具备
ec2:CreateImage、ec2:DescribeInstances等权限 - 创建AMI时,对应EC2实例需处于
running或stopped状态(stopped状态创建速度更快) - 若栈(A)的EC2实例有动态变化的可能(如ASG),需用Lambda自定义资源实时获取实例ID,避免引用过时的ID
内容的提问来源于stack exchange,提问作者Shahbaz Malik
相关产品推荐
相关产品推荐

