因为标题表明这是我设法找到的一个非常具体的错误。我们有一个帐户可以保存所有帐单数据,然后将其作为每小时报告存储到S3存储桶中。
然而,我们有另一个帐户,其中有一个EC2实例,我们希望在我们的结算存储桶上授予GetObject权限。但我无法这样做,是因为AWS CloudWatch将报告上传到S3时它没有将acl设置为bucket-owner-full-control?我很遗憾为什么会这样。
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
当我尝试使用我的EC2实例的AWS-CLI从计费存储桶中复制hourly-Manifest.json
对象时,这是错误。
权限是从结算帐户设置的,如下所示,其中Principal是第二个帐户根。
{
"Sid": "ClaudiaReadOnly",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxx:root"
},
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::billing-bucket",
"arn:aws:s3:::billing-bucket/billing/*"
]
}
第二个帐户使用CloudFormation模板向EC2实例授予权限,同样具有相同的Get *和List *权限。
如果我们直接从控制台为第二个帐户设置单个对象的读取权限,我们可以使用EC2实例的AWS-CLI复制它。但是对于每个其他对象,我们得到相同的403错误。
调试此问题非常令人沮丧,我希望AWS对此事有更好的了解......
答案 0 :(得分:0)
这里的问题是,不同的帐户(AWS Billing)在您的帐单桶中创建了帐单报告,这使您进入S3对象ACL的黑暗世界-请参阅https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
如果您正在从计费帐户访问S3存储桶,则不会有问题,因为计费帐户是存储桶所有者,并且始终被授予访问权限,但是对于其他帐户,授予访问权限的唯一方法是为作者(AWS Billing)可以在副本上设置适当的ACL(不会发生这种情况),或追溯修改ACL。
以下是为帐单报告创建的默认对象ACL:
$ aws s3api get-object-acl --bucket my-billing-bucket --key reports/xxx/xxx.json
{
"Owner": {
"DisplayName": "aws-billpresentation+artifact-storage",
"ID": "aaaaaaaaaa"
},
"Grants": [
{
"Grantee": {
"DisplayName": "aws-billpresentation+artifact-storage",
"ID": "aaaaaaaaaa",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
},
{
"Grantee": {
"DisplayName": "mybilling",
"ID": "xxxxxxxxxxx",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
]
}
在上面的示例中,aws-billpresentation + artifact-storage是写报告的AWS账单账户的名称,而mybiling是存储桶所在的账单账户的名称。
如果您想授予对另一个帐户的读取访问权限,则需要找出该帐户的规范ID,然后添加READ授予,对每个文件重复此操作。例如:
aws s3api put-object-acl --bucket my-billing-bucket --key reports/xxx/xxx.json --access-control-policy '{
"Owner": {
"DisplayName": "aws-billpresentation+artifact-storage",
"ID": "aaaaaaaa"
},
"Grants": [
{
"Grantee": {
"DisplayName": "aws-billpresentation+artifact-storage",
"ID": "aaaaaaaa",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
},
{
"Grantee": {
"DisplayName": "mybilling",
"ID": "xxxxxxxx",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
},
{
"Grantee": {
"DisplayName": "myotheraccount",
"ID": "yyyyyyyy",
"Type": "CanonicalUser"
},
"Permission": "READ"
}
]
}'
最简单的选择是将报告发布到您要实际处理报告的帐户中,这避免了所有S3对象ACL问题。