You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:12:02