如何在SAM框架template.yaml中添加自定义值并在Lambda handler中获取
SAM框架向Lambda传递自定义值的实现方案
可以实现,但你设想的直接在Api资源的Metadata字段配置后自动注入到event/context的方式行不通,Metadata是CloudFormation/SAM用于存储工具层面元数据的字段,不会主动传递到Lambda运行时环境。有两种常用的实现方式可以满足需求:
方案一:通过Lambda环境变量传递(单API对应单Lambda场景推荐)
如果该自定义值是固定对应某个Lambda的,直接配置为Lambda的环境变量即可,配置成本最低:
- template.yaml 配置示例:
# Lambda 资源配置 PostExperimentFunction: Type: AWS::Serverless::Function Properties: Runtime: nodejs18.x Handler: index.lambdaHandler # 自定义环境变量 Environment: Variables: value1: "software" # 对应API配置 PostExperiment: Type: AWS::Serverless::Api Properties: Path: /my-path Method: post Integration: Type: AWS_PROXY Uri: !GetAtt PostExperimentFunction.Arn
- Lambda 中读取方式:
export async function lambdaHandler(event, context) { // 直接读取环境变量 const value1 = process.env.value1 }
方案二:通过API Gateway参数映射传递(多API共用同一个Lambda场景推荐)
如果多个API路径共用同一个Lambda,需要区分不同请求的自定义值,可以通过API Gateway的请求参数映射,把自定义值注入到请求头或者请求上下文里:
- template.yaml 配置示例:
PostExperiment: Type: AWS::Serverless::Api Properties: StageName: prod DefinitionBody: paths: /my-path: post: x-amazon-apigateway-integration: type: aws_proxy uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${PostExperimentFunction.Arn}/invocations # 注入自定义头,注意固定值需要用单引号包裹 requestParameters: integration.request.header.x-custom-value1: "'software'"
- Lambda 中读取方式:
export async function lambdaHandler(event, context) { // 从请求头读取自定义值 const value1 = event.headers['x-custom-value1'] }
内容的提问来源于stack exchange,提问作者John Grayson
相关产品推荐
相关产品推荐

