如何在AWS Lambda部署的template.yaml中读取config.json的版本号作为环境变量?
从外部JSON文件加载配置到AWS SAM模板的Lambda环境变量
问题背景
你尝试用本地config.json中的版本号作为Lambda函数的环境变量,直接在template.yaml中使用${file(config.json):version_number}的方式无效,因为AWS SAM/CloudFormation不支持这种语法(这是Terraform专属语法),导致环境变量值被原样解析为字符串。
可行解决方案
方案一:通过参数覆盖传递配置
- 在
template.yaml中定义参数
先在模板顶部声明参数,用于接收外部传入的版本号:
Parameters: LambdaVersion: Type: String Description: 从config.json读取的Lambda版本号 Resources: my_lambda: Type: AWS::Serverless::Function Properties: Handler: my_package.my_source_code.lambda_handler # 其他必要配置(Runtime、CodeUri等) Environment: Variables: VERSION: !Ref LambdaVersion
- 脚本读取JSON并传递参数
使用jq工具读取config.json的值,再通过sam deploy的--parameter-overrides参数传递:
# 读取config.json中的version_number字段值 VERSION=$(jq -r '.version_number' config.json) # 执行部署并传入参数 sam deploy --no-confirm-changeset --parameter-overrides ParameterKey=LambdaVersion,ParameterValue=$VERSION
方案二:使用SAM Build变量注入
- 修改
template.yaml使用Build变量占位符
在模板中用${BUILD::VERSION}作为环境变量的占位符:
Resources: my_lambda: Type: AWS::Serverless::Function Properties: Handler: my_package.my_source_code.lambda_handler # 其他必要配置(Runtime、CodeUri等) Environment: Variables: VERSION: ${BUILD::VERSION}
- 构建时传递版本号
读取config.json的值,在sam build时通过--build-args传递:
VERSION=$(jq -r '.version_number' config.json) sam build --use-container --manifest <path/to/requirements.txt> --build-args VERSION=$VERSION sam deploy --no-confirm-changeset
补充说明
- 你之前看到的
Fn::GetParam是用于读取部署包内的JSON文件内容,而非本地的config.json,所以不适用当前场景。 - 若需要跨多环境复用配置,可将
config.json拆分为环境对应版本(如config.dev.json、config.prod.json),在脚本中根据环境变量切换读取的文件。
内容的提问来源于stack exchange,提问作者tobyvd
相关产品推荐
相关产品推荐

