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

调用Lambda获取S3对象遇403错误,配置IAM角色与桶策略仍未解决

Lambda调用S3对象报403 Access Denied排查

问题背景

调用Lambda函数检索S3对象时持续出现403错误,已完成以下配置:

  1. Lambda关联的IAM角色权限:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmtlamda",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::referencedataepiko/*",
                "arn:aws:s3:::referencedataepiko"
            ]
        }
    ]
}
  1. S3桶级策略:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::************:role/$role_name_lamda"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::referencedataepiko/*",
                "arn:aws:s3:::referencedataepiko"
            ]
        }
    ]
}
  1. 补充信息:S3桶未启用服务器端加密,使用Java AWS SDK编写Lambda,客户端创建代码如下:
//com.amazonaws.services.s3.model.Region region = com.amazonaws.services.s3.model.Region.US_East_2;
//AmazonS3 client = AmazonS3ClientBuilder.standard().build();
//AmazonS3 client = AmazonS3ClientBuilder.standard().withRegion(Regions.AP_SOUTH_1).build();
Creds creds = new Creds();
AmazonS3 client = new AmazonS3Client(new BasicAWSCredentials(creds.getAWSAccessKeyId(), creds.getAWSSecretKey()))
                    .withRegion(Region.getRegion(Regions.US_EAST_1));

排查方向及解决方案

1. 硬编码凭证与Lambda角色权限冲突

当前代码使用硬编码的AccessKey/SecretKey创建S3客户端,而非Lambda执行时自动注入的IAM角色临时凭证。这会导致请求使用硬编码凭证的权限,而非你配置的Lambda角色权限——如果硬编码凭证没有对应S3桶的访问权限,直接触发403错误。

解决方法:删除硬编码凭证逻辑,使用默认方式构建客户端,让Lambda自动使用分配的IAM角色:

AmazonS3 client = AmazonS3ClientBuilder.standard()
                    .withRegion(Regions.US_EAST_1) // 需与S3桶所在区域一致
                    .build();

或更简洁的写法(AWS SDK会自动加载Lambda角色凭证):

AmazonS3 client = AmazonS3ClientBuilder.defaultClient();

2. 区域配置不匹配

确认S3桶实际所在区域与代码中指定的Regions.US_EAST_1是否一致。如果桶在其他区域(比如你注释掉的AP_SOUTH_1),客户端区域配置错误会导致请求路由到错误端点,间接引发权限校验失败。

解决方法:登录S3控制台查看桶的实际区域,修改代码中的区域配置为对应值。

3. 桶级策略的角色ARN存在错误

检查桶级策略里的Principal.AWS值,确保$role_name_lamda已替换为Lambda角色的实际名称,ARN格式完全正确(无占位符或拼写错误)。

同时需确认Lambda角色的信任策略是否允许lambda.amazonaws.com作为服务主体,否则角色无法被Lambda正常Assume:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

4. 对象级ACL限制

如果目标S3对象单独设置了ACL,即使桶和角色权限全开,对象ACL拒绝访问也会导致403。可通过S3控制台查看对象的权限设置,确认是否允许Lambda角色访问。

5. 权限边界或组织SCP限制

如果AWS账号属于某个组织,检查是否有服务控制策略(SCP)限制了Lambda或S3的权限;同时查看Lambda角色是否设置了权限边界,边界策略可能覆盖你配置的允许权限。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:55:25