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

Cha*_*aye 8 amazon-s3 amazon-web-services 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 
Run Code Online (Sandbox Code Playgroud)

我确认的事情:

  • 我正在使用版本 aws-cli/1.11.13 Python/3.5.2 Linux/4.4.0-75-generic botocore/1.4.70
  • S3对象键是正确的.我直接从S3 Web界面复制了它.
  • AWS CLI配置了有效凭据.我生成了一个新的密钥/密钥对.我在重新配置aws cli之前删除了〜/ .aws文件夹.IAM Web界面在线确认arn特定的用户实际上是通过CLI使用S3.
  • 根据此SO帖子,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/*"
        ]
    }
Run Code Online (Sandbox Code Playgroud)

我是如何上传此对象的?

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

Cha*_*aye 6

事实证明,查看对象属性,我可以看到该对象的所有者是“匿名”,并且“匿名”用户对此对象具有完全权限。

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

因此,当使用上传策略发布文件时,最终的所有者是“匿名”。

在这种情况下,acl=bucket-owner-full-control应在上传对象时使用,以便存储桶所有者可以控制该对象。这样做时,所有者仍将是“匿名”,但是,它将授予存储桶所有者(我)完全权限,之后我应该能够通过 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复制到我自己的代码库中(事实证明,它是一个完全可移植的小实用程序类)并修改它才能使用acl=bucket-owner-full-control. 我已经验证这可以通过 AWS CLI 管理上传的对象。