Terraform创建Lambda报错及S3区域不匹配问题求助
解决Terraform配置AWS Lambda的S3相关问题
问题场景
使用Terraform创建AWS Lambda函数时,遇到两个核心问题:
- 注释
s3_*相关属性后,抛出错误:Error: filename, s3_* or image_uri attributes must be set - 取消注释
s3_*属性后,因Terraform默认区域为us-east-2,而S3桶位于us-east-1,出现区域不匹配的PermanentRedirect错误;同时不清楚s3_object_version的来源和配置方式。
错误分析
- 代码来源必填错误:AWS Lambda要求必须指定代码包来源,可选方式包括本地文件路径(
filename)、S3存储(s3_*)或容器镜像(image_uri),三者必须选其一。 - 跨区域S3访问错误:Terraform使用
us-east-2区域的AWS API调用Lambda创建接口时,会默认用该区域的S3端点访问桶,但桶实际在us-east-1,触发S3的永久重定向错误。 - s3_object_version说明:该属性仅在S3桶开启版本控制时需要填写,对应S3对象的版本ID;若桶未开启版本控制,可直接省略该属性。
解决方案
1. 对齐Terraform与S3桶的区域
将Terraform的AWS provider区域设置为S3桶所在的us-east-1,确保API调用与桶区域一致:
provider "aws" { region = "us-east-1" }
2. 正确配置s3_*属性
s3_bucket:填写S3桶的名称,注意不要添加任何前缀路径s3_key:填写Lambda代码包在S3中的对象路径,移除开头的斜杠(原代码中的/snapshots/...需改为snapshots/...)s3_object_version:- 若桶开启版本控制:通过AWS控制台进入S3对象详情页查看版本ID,或使用AWS CLI命令获取:
aws s3api list-object-versions --bucket prod-04-2014-tasks --prefix snapshots/025416187662/voting-f2684d7f-4abb-4265-add7-edf4860adb28 - 若桶未开启版本控制:直接注释或删除该属性即可
- 若桶开启版本控制:通过AWS控制台进入S3对象详情页查看版本ID,或使用AWS CLI命令获取:
修正后的完整代码示例
provider "aws" { region = "us-east-1" } resource "aws_lambda_function" "lambda_voting_backend" { description = "" function_name = "voting" handler = "lambda_function.lambda_handler" architectures = ["x86_64"] s3_bucket = "prod-04-2014-tasks" s3_key = "snapshots/025416187662/voting-f2684d7f-4abb-4265-add7-edf4860adb28" # 仅当S3桶开启版本控制时保留此行,替换为实际版本ID # s3_object_version = "ZmtZwWWuw5iTqOyFk6YakhAeTTowkj5E" memory_size = 128 role = aws_iam_role.voting_iam_lambda_role.arn runtime = "python3.9" timeout = 3 tracing_config { mode = "PassThrough" } }
备选方案:使用Provider别名(保留原默认区域)
如果需要保留Terraform默认区域为us-east-2,可通过Provider别名指定S3相关资源的区域:
# 默认provider(us-east-2) provider "aws" { region = "us-east-2" } # us-east-1的provider别名 provider "aws" { alias = "us_east_1" region = "us-east-1" } # 若S3桶由Terraform管理,绑定到us_east_1 provider resource "aws_s3_bucket" "lambda_code" { provider = aws.us_east_1 bucket = "prod-04-2014-tasks" # 其他桶配置... } # Lambda函数需部署到us-east-1才能避免跨区域S3访问错误 resource "aws_lambda_function" "lambda_voting_backend" { provider = aws.us_east_1 description = "" function_name = "voting" handler = "lambda_function.lambda_handler" architectures = ["x86_64"] s3_bucket = aws_s3_bucket.lambda_code.bucket s3_key = "snapshots/025416187662/voting-f2684d7f-4abb-4265-add7-edf4860adb28" # s3_object_version = "ZmtZwWWuw5iTqOyFk6YakhAeTTowkj5E" memory_size = 128 role = aws_iam_role.voting_iam_lambda_role.arn runtime = "python3.9" timeout = 3 tracing_config { mode = "PassThrough" } }
内容的提问来源于stack exchange,提问作者ERJAN
相关产品推荐
相关产品推荐

