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

Terraform配置问题:Lambda无法获取S3访问权限

解决Lambda函数无S3访问权限的问题

问题分析

你的Terraform代码逻辑上已为Lambda执行角色附加了S3权限策略,但控制台仅显示日志权限,可能的原因包括:IAM策略附加未生效、S3桶策略拦截、控制台资源摘要延迟,或ARN配置错误。

解决步骤

1. 验证IAM角色的策略附加状态

首先确认lambda_execution_role是否已成功附加lambda_s3_access_policy:

  • 登录AWS IAM控制台,找到lambda_execution_role,查看「权限」标签下的附加策略。
  • 或使用AWS CLI执行:
    aws iam list-attached-role-policies --role-name lambda_execution_role
    

如果未看到lambda_s3_access_policy,重新执行terraform apply并检查输出,确认aws_iam_role_policy_attachment.lambda_s3_access_attachment资源已被创建。

2. 检查S3桶策略

确保目标S3桶mys3bucketname的桶策略未拒绝Lambda角色的访问:

  • 登录S3控制台,进入桶的「权限」标签,查看「桶策略」。
  • 确认没有Effect: Deny的语句针对lambda_execution_role的ARN,或全局拒绝相关S3操作。

3. 修正Terraform依赖(可选)

虽然Terraform自动处理依赖,但显式添加依赖可确保策略附加完成后再创建Lambda:
在module "lambda_proxy"块中添加依赖声明:

module "lambda_proxy" {
  source         = "terraform-aws-modules/lambda/aws"
  count          = var.num_proxies
  function_name  = "proxy-${count.index}"
  create_package = false
  image_uri      = module.docker_image.image_uri
  package_type   = "Image"
  architectures  = ["x86_64"]
  timeout        = 30
  hash_extra     = count.index
  lambda_role    = aws_iam_role.lambda_execution_role.arn
  # 显式依赖策略附加资源
  depends_on     = [aws_iam_role_policy_attachment.lambda_s3_access_attachment]
}

4. 测试实际权限(关键)

Lambda控制台的「资源摘要」仅展示部分直观权限,不代表实际生效状态。直接在Lambda函数中编写测试代码验证:

import boto3

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    try:
        # 测试S3写入
        s3_client.put_object(
            Bucket='mys3bucketname',
            Key='test_permission.txt',
            Body='Test content'
        )
        return {"statusCode": 200, "message": "S3 access successful"}
    except Exception as e:
        return {"statusCode": 500, "error": str(e)}

执行测试后,根据错误信息定位问题:

  • 若返回AccessDenied,说明权限仍未生效,需重新检查IAM角色和桶策略。
  • 若返回NoSuchBucket,说明桶名或ARN配置错误。

5. 确认S3 ARN正确性

检查aws_iam_policy.lambda_s3_access中的资源ARN:

Resource = [
  "arn:aws:s3:::mys3bucketname/*"
]

确保桶名完全匹配,且/*后缀正确(针对桶内对象操作)。若需操作桶本身(如ListBucket),需添加桶的ARN:

Resource = [
  "arn:aws:s3:::mys3bucketname",
  "arn:aws:s3:::mys3bucketname/*"
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:54:50