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

Terraform通过S3元数据触发AWS Lambda新版本发布时自定义元数据引用失败问题

解决Terraform读取S3自定义元数据触发Lambda更新的问题

问题原因分析

你遇到的Missing map element错误,核心是Terraform对S3自定义元数据的键名有自动转换规则:

  • 所有自定义元数据的键名会被转为全小写
  • 自动移除前缀x-amz-meta-

所以你在S3上设置的x-amz-meta-sha256,在Terraform的aws_s3_bucket_object数据源的metadata map里,对应的键名是sha256,而非你写的完整前缀名,这就是Terraform找不到该键的原因。

另外你关心的metadata类型,从报错信息里的map of string with 1 element可以确认,它确实是Terraform原生的map(string)类型,类型本身没有问题。

修正后的Terraform配置

把source_code_hash的引用改成转换后的键名即可,同时我还修正了vpc_config里的小问题(列表类型需要用方括号包裹):

data "aws_s3_bucket_object" "lambda" {
 bucket = "bucket"
 key = "lambda/lambda.zip"
}

resource "aws_lambda_function" "lambda" {
 function_name = "lambda_name"
 s3_bucket = "bucket"
 s3_key = "lambda/lambda.zip"
 # 改为转换后的小写键名,去掉x-amz-meta-前缀
 source_code_hash = data.aws_s3_bucket_object.lambda.metadata.sha256
 handler = "index.handler"
 runtime = "nodejs14.x"
 publish = true
 role = aws_iam_role.lambda_exec.arn
 vpc_config {
 subnet_ids = ["subnet_ids"]
 security_group_ids = ["security_group_ids"]
 }
}

验证元数据的小技巧

如果不确定转换后的键名,可通过AWS CLI命令查看S3对象的元数据:

aws s3api head-object --bucket bucket --key lambda/lambda.zip

返回结果里的Metadata字段会显示转换后的键名,示例如下:

{
  ...
  "Metadata": {
    "sha256": "241461f66ba6bec6418679888f9c8b5210c1f183aabfe86d1cc2ab71cdffdcfc"
  }
}

内容的提问来源于stack exchange,提问作者superflux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:48:15