com.amazonaws.services.s3.model.AmazonS3Exception:禁止(服务:Amazon S3;状态代码:403;错误代码:403 Forbidden;请求 ID:

Posted

技术标签:

【中文标题】com.amazonaws.services.s3.model.AmazonS3Exception:禁止(服务:Amazon S3;状态代码:403;错误代码:403 Forbidden;请求 ID:XXXXXXXX)【英文标题】:com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden (Service: Amazon S3; Status Code: 403; Error Code: 403 Forbidden; Request ID: XXXXXXXX) 【发布时间】:2016-01-18 01:02:32 【问题描述】:

几天前,当我尝试将文件推送到我的 S3Bucket 时,我收到了这个异常。更早的一切似乎都可以正常工作,我确信我这边没有代码更改。

com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden
(Service: Amazon S3; Status Code: 403; Error Code: 403 Forbidden;
Request ID: XXXXXXXXXXXX),
S3 Extended Request ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1077)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:725)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:460)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:295)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3699)
at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:999)
at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:977)

.... ....

我遇到了许多与 com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden following these相关的问题

    我已经在我的服务器上安装了 NTP 来解决任何与时间相关的问题。 我还在代码中添加了“AmazonS3Client”对象的 endPointUrl,我认为这可以解决我的问题。

还有什么办法可以解决这个问题

我正在使用 aws-java-sdk:1.9.10 将文件推送到 S3 存储桶。

【问题讨论】:

您是否已验证您的访问密钥仍然可以访问 S3 资源,尤其是该存储桶? 是的,我确定我的密钥和秘密是有效的 您是否通过使用 AWS CLI 尝试相同的操作来验证这一点? 未尝试 CLI,但点正在从本地机器工作执行相同的代码 正确,但您的本地计算机正在使用本地计算机上的密钥。您是否以有权访问 S3 的 IAM 配置文件角色启动了您的 AWS 实例? 【参考方案1】:

您的实例很可能未使用有权访问 S3 的 IAM 实例配置文件角色启动。

对 AWS 服务的所有访问都必须使用访问密钥和密钥进行签名。当您从本地计算机执行此操作时,DefaultCredentialsProviderChain 使用在您的 .aws/credentials 文件中定义的访问密钥和秘密。

当您在 AWS 中启动 EC2 实例时,它还需要签署对服务的请求,例如 s3。但是,它通过从内部元数据服务检索它的凭据来做到这一点。

因此,您要做的是创建一个 IAM 实例配置文件,您的实例在启动时将采用该配置文件。此 IAM 实例配置文件与其他用户的 IAM 配置文件一样,定义了实例有权访问的内容。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html

【讨论】:

我在尝试从 pyspark 访问 S3 时遇到了类似的问题。背景:我的目标是使用 Python 学习 Spark。还不想跳入 EMR 或 HDSF 等。因此,我创建了一个 S3 存储桶,将一些文件放入其中,然后创建了简单的 Ubuntu EC2 实例,但忘记附加 IAM 角色。我让 pyspark 工作,但我正在尝试使用 Spark 访问 S3 文件并收到上述错误。我还得到了 hadoop-aws-2.7.1.jar 和 aws-java-sdk-1.7.4.jar 文件,因为我没有安装 Hadoop。我创建了没有权限的 IAM 角色并分配给我仍在运行的 EC2 实例。仍然出现错误。有什么想法吗?【参考方案2】:

在我的情况下,android 端的存储桶名称不同(存储桶名称在 S3 为“a”,我在 android 端输入“ab”),通过更改存储桶名称,反之亦然,我解决了问题。

【讨论】:

以上是关于com.amazonaws.services.s3.model.AmazonS3Exception:禁止(服务:Amazon S3;状态代码:403;错误代码:403 Forbidden;请求 ID:的主要内容,如果未能解决你的问题,请参考以下文章

使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及解决方案

EMR 上 Spark 中的 S3 减速错误

Pyspark 不使用 TemporaryAWSCredentialsProvider

Amazon S3 存储桶大文件上传

尝试从 Spark 访问 S3 时出现 400 Bad Request

将文件从 HDFS 放入 S3 存储桶时访问被拒绝