Scala编写的AWS Lambda部署后访问S3报403 AccessDenied如何解决?
问题背景
我使用Scala编写了一个Lambda函数,用于访问并读取同区域S3存储中的文件,对应代码如下:
val bucketName = "***myBucketName***" val fileName = "input.log" val s3 = AmazonS3ClientBuilder.defaultClient() val myObject = s3.getObject(new GetObjectRequest(bucketName, fileName)) val inputStream = myObject.getObjectContent() val reader = new BufferedReader(new InputStreamReader(inputStream))
我通过SAM-cli将该函数部署到AWS,本地运行时可正常访问目标文件,但在AWS上运行时抛出如下错误:
Access Denied (Service: ; Status Code: 403; Error Code: AccessDenied
解决方案
本地运行SAM时调用的是你本地配置的AWS账号凭证,该凭证默认持有对应S3资源的访问权限,而部署到AWS环境后,Lambda函数会使用自身绑定的*执行角色(Execution Role)*发起S3请求,403错误基本都和该角色的权限配置、S3桶的访问限制有关,可按以下顺序排查解决:
- 步骤1:给Lambda执行角色添加S3访问权限
这是最高发的问题,你可以直接在SAM项目的template.yaml配置文件中,给对应Lambda函数的执行角色添加s3:GetObject权限,参考配置如下:
Resources: YourLambdaFunction: # 替换为你的Lambda函数逻辑ID Type: AWS::Serverless::Function Properties: CodeUri: your-code-path/ # 替换为你的代码包路径 Handler: your-entry-class::handleRequest # 替换为你的函数入口 Runtime: java11 # Scala运行在JVM上,对应你使用的JDK版本 Policies: - S3ReadPolicy: BucketName: "***myBucketName***" # 替换为你的实际S3桶名
如果你是在IAM控制台手动配置角色权限,需要给Lambda执行角色添加如下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::***myBucketName***/*" } ] }
- 步骤2:排查S3桶的访问限制配置
如果配置完角色权限后仍报错,需要检查S3桶的如下配置:- 桶策略是否限制了允许访问的角色/ARN,需将Lambda执行角色的ARN添加到桶策略的允许列表中
- 如果桶开启了服务端加密(SSE-KMS),需要额外给Lambda执行角色添加对应KMS密钥的
kms:Decrypt权限 - 如果桶配置了IP/VPC访问限制,而你的Lambda部署在VPC内,需要配置S3 VPC端点,且端点策略允许访问该桶
- 步骤3:基础配置校验
- 确认部署时的桶名参数、文件名和实际S3桶中的配置完全一致,大小写错误、拼写错误也可能触发403响应
- 确认Lambda和S3桶确实在同一AWS区域,跨区域访问如果没有额外配置也可能触发权限拦截
- 若使用旧版本AWS SDK,可显式指定S3客户端的所属区域,避免默认区域配置错误触发跨区域访问拦截,示例:
AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build()
内容的提问来源于stack exchange,提问作者andreacappelletti97
相关产品推荐
相关产品推荐

