我無法產生 Amazon S3 庫存報告。為什麼會發生此情況?

上次更新日期:2021 年 11 月 19 日

我已經設定 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 的「拒絕」陳述式。明確拒絕的優先順序高於任何「允許」陳述式。排除 Amazon S3 服務 (s3.amazonaws.com) 免於會影響 PutObject 動作的每個「拒絕」陳述式。

以下是會拒絕存取 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 存取權給予您的 KMS 金鑰。

若要使用您的 AWS KMS 金鑰授予加密的許可,請執行下列步驟:

1.    登入 AWS 管理主控台。

注意:請確保使用擁有 AWS KMS 金鑰的 AWS 帳戶登入。

2.    開啟 AWS KMS 主控台

3.    在左側導覽窗格中,選擇 Customer managed keys (客戶管理的金鑰)

4.    在 Customer managed keys (客戶管理的金鑰) 底下,選取您想要用來加密庫存報告檔案的 AWS KMS 金鑰。

5.    在 Key policy (金鑰政策) 底下,選擇 Switch to policy view (切換到政策檢視)

6 若要更新金鑰政策,請選擇 Edit (編輯)

7.    在 Edit key policy (編輯金鑰政策) 底下,將下列金鑰政策新增到現有的金鑰政策。

{
    "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.    選擇 Save Changes (儲存變更)

檢閱您的伺服器存取記錄和 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 文件 GitHub 網站上的 CloudTrail 中的Amazon S3 資訊