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
相关产品推荐
相关产品推荐

