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

Terraform创建Lambda报错及S3区域不匹配问题求助

解决Terraform配置AWS Lambda的S3相关问题

问题场景

使用Terraform创建AWS Lambda函数时,遇到两个核心问题:

  1. 注释s3_*相关属性后,抛出错误:Error: filename, s3_* or image_uri attributes must be set
  2. 取消注释s3_*属性后,因Terraform默认区域为us-east-2,而S3桶位于us-east-1,出现区域不匹配的PermanentRedirect错误;同时不清楚s3_object_version的来源和配置方式。

错误分析

  1. 代码来源必填错误:AWS Lambda要求必须指定代码包来源,可选方式包括本地文件路径(filename)、S3存储(s3_*)或容器镜像(image_uri),三者必须选其一。
  2. 跨区域S3访问错误:Terraform使用us-east-2区域的AWS API调用Lambda创建接口时,会默认用该区域的S3端点访问桶,但桶实际在us-east-1,触发S3的永久重定向错误。
  3. 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
      
    • 若桶未开启版本控制:直接注释或删除该属性即可

修正后的完整代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:50:32