AWS CLI s3复制失败,出现403错误,尝试管理用户上载的对象

时间:2017-05-18 14:49:52

标签: amazon-web-services amazon-s3 aws-cli

尝试将文件从S3存储桶复制到本地计算机:

aws s3 cp s3://my-bucket-name/audio-0b7ea3d0-13ab-4c7c-ac66-1bec2e572c14.wav ./

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden 

我确认的事情:

  • 我正在使用版本aws-cli/1.11.13 Python/3.5.2 Linux/4.4.0-75-generic botocore/1.4.70
  • S3对象键是正确的。我已经直接从S3网络界面复制了它。
  • AWS CLI配置了有效凭据。我生成了一个新的密钥/密钥对。我在重新配置aws cli之前删除了〜/ .aws文件夹。 IAM Web界面在线确认arn特定的用户实际上是通过CLI使用S3。
  • 根据this SO post,IAM用户被授予S3完全访问管理策略。我删除了所有这些用户的策略,然后仅添加了名为AdministratorAccess的AWS托管策略,其中包括“S3,完全访问权限,所有资源”。 是否有通过CLI授予访问权限的不同方法?我不相信。

存储分区策略旨在授予广泛的开放访问权限:

    {
        "Sid": "AdminAccess",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket-name",
            "arn:aws:s3:::my-bucket-name/*"
        ]
    }

我是如何上传此对象的?

我使用AWS Signature v4签名上传策略将此对象从客户端浏览器中的Web应用程序直接上传到AWS。

5 个答案:

答案 0 :(得分:2)

事实证明,看着对象属性,我可以看到OBJECT的所有者是" Anonymous,"还有" Anonymous"用户拥有此对象的完全权限。

我相信这就是我无法访问此对象的原因(我已通过身份验证)。示例:自" Anonymous"用户拥有完全权限,我可以使用Web浏览器通过GET访问。这是按设计运作的。 S3存储桶用于上传文件,然后可供公众使用。

因此,当文件使用上传政策进行POST时,结果所有者就是#34; Anonymous"。

在这种情况下,上传对象时应使用acl=bucket-owner-full-control,以便存储桶拥有者可以控制对象。 这样做,所有者仍然是#34; Anonymous"但是,它会给桶主(我)提供完全权限,之后我应该可以通过AWS CLI访问该对象。

请注意,acl=ec2-bundle-read是默认情况下,实际上已硬编码到最新的AWS开发工具包中。见https://github.com/aws/aws-sdk-java/blob/7844c64cf248aed889811bf2e871ad6b276a89ca/aws-java-sdk-ec2/src/main/java/com/amazonaws/services/ec2/util/S3UploadPolicy.java#L77

有必要将 S3UploadPolicy.java 复制到我自己的代码库中(事实证明,这是一个完全可移植的小实用程序类)并修改它以便使用{{1} }。我已经验证这可以通过AWS CLI管理上传的对象。

答案 1 :(得分:0)

即使出于安全原因文件不存在,AWS S3也会返回Forbidden(403)。 请确保您在下载时给出了正确的s3路径。

您可以阅读更多相关信息here

答案 2 :(得分:0)

我尝试从先前上传的s3下载时遇到了类似的权限问题。事实证明,它与存储桶政策无关,而且与您上传时如何设置凭据以及如何在上传时授予访问权限有关。有关解决问题的几种方法的详细信息,请参阅this

答案 3 :(得分:0)

在我的情况下,当尝试联系S3的计算机的系统时间与当前时间相距很远时,就会出现上述错误。设置正确的时间有帮助。

答案 4 :(得分:0)

对于我来说,我有3个帐户(A1A2A3)和3个规范用户(canonical_user_account_A1canonical_user_account_A2,{{1} })和1个canonical_user_account_A3中的IAM角色(R1)。

文件位于A3中的存储桶中,文件所有者为A2这是有意的)。当我尝试列出文件时没有任何错误,但是当我尝试下载其中一个文件时

canonical_user_account_A1

我在存储区策略和角色权限中为fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden 添加了ListGet权限,在这种情况下,如果帐户是存储区,则这还不够不是所有者,它不允许其他帐户的用户访问R1(下载)文件。因此,我需要确保在上传文件时使用的是

get

这允许 access_control_policy = { 'Grants': [ { 'Grantee': { 'ID': canonical_user_account_A2, 'Type': 'CanonicalUser' }, 'Permission': 'READ' }, { 'Grantee': { 'ID': canonical_user_account_A3, 'Type': 'CanonicalUser' }, 'Permission': 'READ' }, ], 'Owner': { 'ID': canonical_user_account_A1 } } upload_extra_args = {'ACL': 'bucket-owner-full-control'} s3_client.upload_file(file_path, bucket_name, s3_file_path, ExtraArgs=upload_extra_args) s3_client.put_object_acl(AccessControlPolicy=access_control_policy, Bucket=bucket_name, Key=s3_file_path) canonical_user_account_A2读取和下载文件。