能否强制AWS::EC2::Instance的Metadata变更触发Replace更新行为?
问题解答
默认情况下,仅修改AWS::EC2::Instance的Metadata内容不会触发CloudFormation堆栈更新时的实例替换。因为CloudFormation将资源的Metadata视为附属描述信息,不属于实例核心属性(Properties字段内的配置),所以不会因为Metadata变更而触发Replace类型的更新行为。
要实现修改AWS::CloudFormation::Init配置时自动删除并重建实例的需求,你需要将Metadata的内容与实例的某个可检测变更的属性绑定,让CloudFormation能感知到配置变化并触发替换。常用的实现方式有两种:
方式一:将Init配置的哈希值作为实例标签
通过计算AWS::CloudFormation::Init内容的哈希值,将其作为实例的一个标签。当Init配置修改时,哈希值会变化,CloudFormation检测到标签变更后会触发实例替换。
修改后的配置示例:
GatewayInstance: Type: 'AWS::EC2::Instance' DeletionPolicy: Delete UpdateReplacePolicy: Delete Properties: # 其他原有Properties配置... Tags: - Key: CFInitConfigHash # 生成Init配置的SHA256哈希值作为标签值 Value: !Fn::Sha256 - !Sub | ${AWS::CloudFormation::Init} Metadata: AWS::CloudFormation::Init: # 你的Init脚本及文件配置...
方式二:将Init配置嵌入UserData
将AWS::CloudFormation::Init的配置内容(或其哈希值)嵌入到实例的UserData中。由于UserData是EC2实例的核心属性,修改后CloudFormation会默认触发实例替换(因为运行中的EC2实例无法修改UserData)。
示例配置:
GatewayInstance: Type: 'AWS::EC2::Instance' DeletionPolicy: Delete UpdateReplacePolicy: Delete Properties: # 其他原有Properties配置... UserData: !Base64 !Sub | #cloud-config write_files: - path: /tmp/cfinit-config.json content: ${AWS::CloudFormation::Init} # 其他UserData初始化脚本... Metadata: AWS::CloudFormation::Init: # 你的Init脚本及文件配置...
以上两种方式都能让CloudFormation感知到AWS::CloudFormation::Init的变化,从而触发实例的删除与重建,满足你的需求。
内容的提问来源于stack exchange,提问作者Joe Crivello
相关产品推荐
相关产品推荐

