为什么无法生成 Amazon S3 清单报告?

3 分钟阅读
0

我配置了 Amazon Simple Storage Service(Amazon S3)清单报告,但该报告尚未送达,并且我收到“访问被拒绝”错误。

简短描述

如果您创建了 Amazon S3 清单配置,则必须设置正确的桶策略和权限,才能避免出现这一错误:

Access denied Inventory export for 2021-02-19 failed because S3 doesn't have access to the destination bucket or KMS key. Ask the owner of the destination bucket or KMS key to grant the necessary access and then try again.

要生成 Amazon S3 清单报告,必须满足以下要求:

  • 目标桶必须允许源桶将 Amazon S3 清单报告上传到目标桶。
  • 您的目标桶必须与源桶位于同一 AWS 区域(您已在其中设置 Amazon S3 清单)。
  • 您的目标桶策略必须授予对用于加密清单报告文件的 AWS KMS 密钥的访问权限。

注意: 最多可能需要 48 小时才能送达第一份清单报告

解决方法

允许源桶将 Amazon S3 清单报告上传到目标桶

要生成清单报告并将其上传到目标桶,您的桶策略必须允许源桶上传到目标桶。

例如:

{
  "Version": "2012-10-17",
  "Id": "S3PolicyId",
  "Statement": [
    {
      "Sid":"InventoryAndAnalyticsExamplePolicy",
      "Effect":"Allow",
      "Principal": {"Service": "s3.amazonaws.com"},
      "Action":"s3:PutObject",
      "Resource":["arn:aws:s3:::destinationbucket/*"],
      "Condition": {
          "ArnLike": {
              "aws:SourceArn": "arn:aws:s3:::sourcebucket"
           },
         "StringEquals": {
             "aws:SourceAccount": "123456789012",
             "s3:x-amz-acl": "bucket-owner-full-control"
          }
       }
    }
  ]
}

查看目标桶策略中是否有任何拒绝语句。桶不能包含任何阻止 Amazon S3(s3.amazonaws.com)在目标桶执行 PutObject拒绝语句。显式拒绝优先于任何允许语句。从可能影响 PutObject 操作的每条拒绝语句中排除 Amazon S3 服务(s3.amazonaws.com)。

以下是拒绝访问 Amazon S3(s3.amazonaws.com)且仅允许访问指定 IP 范围的桶策略示例:

{
  "Version": "2012-10-17",
  "Id": "S3PolicyId",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
	       "arn:aws:s3:::destinationbucket",
               "arn:aws:s3:::destinationbucket/*"
      ],
      "Condition": {
	 "NotIpAddress": {"aws:SourceIp": "54.240.143.0/24"}
      }
    }
  ]
}

要更正之前的桶策略,请按如下所示更新您的策略:

{
"Version": "2012-10-17",  "Id": "S3PolicyId",
 "Statement": [
    {
      "Sid": "IPAllow",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::destinationbucket",
        "arn:aws:s3:::destinationbucket/*"
      ],
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "54.240.143.0/24"
        },
        "ArnNotLike": {
          "aws:SourceArn": "arn:aws:s3:::sourcebucket"
        }
      },
      "Principal": "*"
    },
    {
      "Sid": "InventoryAndAnalyticsExamplePolicy",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::destinationbucket/*"
      ],
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:s3:::sourcebucket"
        },
        "StringEquals": {
          "aws:SourceAccount": "123456789012",
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      },
      "Principal": {
        "AWS": [
          "s3.amazonaws.com"
        ]
      }
    }
  ]
}

确认目标桶与源桶位于同一 AWS 区域。

要验证目标桶是否与源桶位于同一 AWS 区域,请执行以下操作:

1.    登录 AWS 管理控制台。

2.    打开 Amazon S3 控制台

3.    查看桶列表中的“AWS 区域”列,以确认目标桶与源桶位于同一 AWS 区域。(源桶是您设置 Amazon S3 清单的位置。)

4.    (可选)如果源桶和目标桶位于不同的区域,请创建或选择新桶。这是因为源桶和目标桶必须位于同一 AWS 区域。

**注意:**Amazon S3 在特定区域创建桶。在特定区域创建桶后,属于该桶的任何对象都永远不会离开该区域(除非它们被明确转移)。有关使用 Amazon S3 桶和 AWS 区域的详细信息,请参阅桶概述

向用于加密清单报告文件的 AWS KMS 密钥授予访问权限

如果您使用 AWS KMS 密钥加密 Amazon S3 存储桶,那么请确保向 Amazon S3 授予访问您的 AWS KMS 密钥的权限。

要使用 AWS KMS 密钥授予加密权限,请执行以下操作:

1.    登录 AWS 管理控制台。

**注意:**请务必使用拥有 AWS KMS 密钥的 AWS 账户登录。

2.    打开 AWS KMS 控制台

3.    在左侧导航窗格中,选择客户自主管理型密钥

4.    在客户自主管理型密钥下,选择要用于加密清单报告文件的 AWS KMS 密钥。

5.    在密钥策略下,选择切换到策略视图

6     要更新密钥策略,请选择编辑

7.    在编辑密钥策略下,将以下密钥策略添加到现有密钥策略。

{
    "Sid": "Allow Amazon S3 use of the KMS key",
    "Effect": "Allow",
    "Principal": {
        "Service": "s3.amazonaws.com"
    },
    "Action": [
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition":{
      "StringEquals":{
         "aws:SourceAccount":"source-account-id"
     },
      "ArnLike":{
        "aws:SourceARN": "arn:aws:s3:::source-bucket-name"
     }
   }
}

8.    选择保存更改

注意:在 Amazon S3 控制台中,检查清单配置下方的上次导出列。如果此列为空,则 Amazon S3 在查询目标桶的清单状态后,会收到 403 AccessDenied 响应。空的“上次导出”列并不总是表示报告未送达。清单报告可能已成功送达。在这种情况下,您可以在目标桶的指定路径中找到清单报告。

查看服务器访问日志和 CloudTrail 历史记录

查看您的服务器访问日志。检查当您的清单报告停止送达时,是否对您的桶策略进行了任何更改。Amazon S3 服务器访问日志格式如下所示:

79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be awsexamplebucket1 [06/Feb/2019:00:00:38 +0000] 192.0.2.3 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be 891CE47D2EXAMPLE REST.PUT.BUCKETPOLICY - "GET /awsexamplebucket1?logging HTTP/1.1" 200 - 242 - 11 - "-" "S3Console/0.4" - 9vKBE6vMhrNiWHZmb2L0mXOcqPGzQOI5XLnCtZNPxev+Hf+7tpT6sxDwDty4LHBUOZJG96N1234= SigV2 ECDHE-RSA-AES128-GCM-SHA256 AuthHeader awsexamplebucket1.s3.us-west-1.amazonaws.com TLSV1.1

查找以下任何表明桶策略已发生更改的条目:

REST.PUT.BUCKETPOLICY

您还可在 AWS CloudTrail 事件历史记录中搜索 PutBucketPolicy 操作,以确认最近是否进行了任何更改。请注意,CloudTrail 事件历史记录仅提供 90 天的时间段。如果 PutBucketPolicy 操作是在 90 天前执行的,那么您必须直接在 Amazon S3 中查询 CloudTrail 日志。有关 CloudTrail 捕获的 Amazon S3 API 调用的信息,请参阅 AWS Docs GitHub 网站上的 CloudTrail 中的 Amazon S3 信息

相关信息

为 S3 桶和对象启用 CloudTrail 事件日志记录

授予 Amazon S3 清单和 Amazon S3 分析的权限

如何将所有对象从一个 Amazon S3 桶复制到另一个桶?

AWS 官方
AWS 官方已更新 1 年前