如何在AWS CDK中将部署时token值传入EC2启动模板的user-data脚本
实现方案
你可以通过两种方式实现需求,两种方案最终生成的CloudFormation模板都会和你手写的原生模板逻辑一致,不会在合成阶段硬编码参数值,SSM参数和Base64编码都在部署阶段执行:
方案1:使用EC2 UserData工具类(推荐)
CDK的aws_ec2模块内置了UserData封装类,会自动处理脚本拼接、Base64编码的逻辑,无需手动调用CloudFormation函数:
from aws_cdk import aws_ec2 as ec2, aws_ssm as ssm # 获取部署阶段才解析的SSM参数令牌 product_version = ssm.StringParameter.value_for_string_parameter( self, "my-plain-parameter-name", 1 ) # 初始化Linux实例的UserData对象 user_data = ec2.UserData.for_linux() # 向脚本中添加命令,直接引用SSM参数令牌即可 user_data.add_commands(f"echo {product_version}") # 可连续添加多行命令,示例: # user_data.add_commands("yum install -y nginx", "systemctl enable --now nginx") # 传入启动模板配置 launch_template = ec2.CfnLaunchTemplate(self, 'My-LT', launch_template_data={ 'imageId': my_ami, 'userData': user_data.render() } )
方案2:直接调用CloudFormation原生函数
如果你需要完全对齐你之前手写的CloudFormation模板结构,可以直接调用CDK封装的Fn系列方法:
from aws_cdk import core, aws_ec2 as ec2, aws_ssm as ssm latest_string_token = ssm.StringParameter.value_for_string_parameter( self, "my-plain-parameter-name", 1) # 对应你原模板的Fn::Base64 + Fn::Sub逻辑 user_data = core.Fn.base64( core.Fn.sub( "#!/bin/bash -xe\necho ${product_version}", { "product_version": latest_string_token } ) ) # 传入启动模板配置 launch_template = ec2.CfnLaunchTemplate(self, 'My-LT', launch_template_data={ 'imageId': my_ami, 'userData': user_data } )
原代码问题说明
你之前的写法用了Python标准库的base64.b64encode,这部分逻辑会在cdk synth合成阶段直接在本地执行,只能硬编码当时拿到的实际值,无法生成CloudFormation层面的动态函数结构。上面两种方案返回的都是CloudFormation可识别的动态令牌结构,你可以执行cdk synth查看生成的模板,确认和你手写的原生模板结构完全一致。
内容的提问来源于stack exchange,提问作者aufziehvogel
相关产品推荐
相关产品推荐

