AWS SAM CLI模板中能否用!Sub引用拼接同块其他环境变量?
不可以在Environment.Variables声明块内使用!Sub引用同一块中声明的其他环境变量,具体原因和解决方法如下:
根本原因
CloudFormation(SAM底层基于CloudFormation实现)的内置函数(如!Sub、!Ref等)的解析执行时机是模板部署阶段,而你在Environment.Variables下定义的所有环境变量,是部署完成后才会注入到Lambda运行时的配置项,两者的生效阶段完全错开。
你在!Sub中写的${ENV}会被CloudFormation判定为引用模板级的ENV参数/资源/导出值,找不到对应模板资源的情况下就会原样保留ENV字符串,最终拼接出/ENV/type/app1/的错误结果。
推荐解决方案
方案1:将环境标识提取为模板级参数
把环境名定义为模板参数,部署阶段!Sub就能直接读取到对应值,写法参考:
# 模板开头定义参数 Parameters: Env: Type: String Default: DEV AllowedValues: ["DEV", "PROD"] # Lambda函数的环境变量配置 Environment: Variables: ENV: !Ref Env SSM_PS_APP1_PATH: !Sub "/${Env}/type/app1/"
如果是多环境部署,你可以在samconfig.toml中给不同环境配置对应的Env参数值,部署时自动传入不需要手动修改模板。
方案2:运行时在Lambda代码中拼接路径
如果不想调整模板结构,可以直接在Lambda代码里读取运行时的ENV环境变量,自行拼接Parameter Store的路径,这种方式不需要修改模板逻辑,灵活性更高。
内容的提问来源于stack exchange,提问作者AhDev
相关产品推荐
相关产品推荐

