【问题标题】:Access Denied (Service: ; Status Code: 403; Error Code: AccessDenied拒绝访问(服务:;状态代码:403;错误代码:拒绝访问
【发布时间】:2025-12-25 14:45:11
【问题描述】:

我编写了一个 lambda 函数,用于访问和读取同一区域的 S3 存储中的文件。 scala中的代码如下


   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

关于如何解决这个问题的任何线索?

【问题讨论】:

  • 您的 Lambda 函数从 IAM 角色获取其权限。当您在本地运行时,您可能正在使用 IAM 用户凭证。
  • 您认为有什么区别以及如何解决这个问题?
  • 创建 Lambda 函数时,您提供了一个 IAM 角色。确保与角色关联的策略足以让 Lambda 函数运行,特别是 S3。这些都有据可查。

标签: amazon-web-services scala amazon-s3 amazon-ec2 aws-lambda


【解决方案1】:

正如评论中提到的,您必须检查授予 lambda 角色的权限。本页说明如何获得 lambda 角色:https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html

知道角色后,您可以手动检查权限以确保存在s3:GetObject。您也可以在本地假设它并尝试从 CLI 读取对象以确保权限正常:https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html

最后,请注意,如果存储桶已加密,您需要修改 KMS 策略以授予角色使用和解密的权限。同样,您可能需要修改存储桶策略以允许角色执行s3:GetObject 操作。

【讨论】: