AWS账单报告S3存储桶授予对另一个账户的读取权限

时间:2018-05-02 10:14:48

标签: amazon-web-services amazon-s3

因为标题表明这是我设法找到的一个非常具体的错误。我们有一个帐户可以保存所有帐单数据,然后将其作为每小时报告存储到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对此事有更好的了解......

1 个答案:

答案 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问题。