调用Lambda获取S3对象遇403错误,配置IAM角色与桶策略仍未解决
问题背景
调用Lambda函数检索S3对象时持续出现403错误,已完成以下配置:
- Lambda关联的IAM角色权限:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmtlamda", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::referencedataepiko/*", "arn:aws:s3:::referencedataepiko" ] } ] }
- 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" ] } ] }
- 补充信息: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

