尝试将文件从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
存储分区策略旨在授予广泛的开放访问权限:
{
"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。
答案 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个帐户(A1
,A2
,A3
)和3个规范用户(canonical_user_account_A1
,canonical_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
添加了List
和Get
权限,在这种情况下,如果帐户是存储区,则这还不够不是所有者,它不允许其他帐户的用户访问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
读取和下载文件。