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存储桶策略旨在授予广泛的开放访问权限:
{
"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.
事实证明,查看对象属性,我可以看到该对象的所有者是“匿名”,并且“匿名”用户对此对象具有完全权限。
我相信这就是我无法访问该对象的原因(我已通过身份验证)。示例:由于“匿名”用户拥有完全权限,因此我可以使用 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 管理上传的对象。