為什麼我無法產生 Amazon S3 庫存清單報告?

3 分的閱讀內容
0

我設定了 Amazon Simple Storage Service (Amazon S3) 庫存清單報告,但它並未交付,並且我收到了「Access Denied」(存取遭拒) 錯誤。

簡短說明

您會收到以下錯誤訊息:

「由於 S3 無法存取目的地儲存貯體或 KMS 金鑰,存取遭拒,2021-02-19 的庫存清單匯出失敗請要求目的地儲存貯體或 KMS 金鑰的擁有者授予必要的存取權,然後再試一次。」

若要產生 Amazon S3 庫存清單報告並避免上述錯誤訊息,您必須滿足以下要求:

  • 允許來源儲存貯體將 Amazon S3 庫存清單報告上傳到目的地儲存貯體。
  • 將目的地儲存貯體和來源儲存貯體保留在您設定 Amazon S3 庫存清單的同一 AWS 區域中。
  • 授予 Amazon S3 存取用於加密庫存清單報告檔案的 AWS Key Management Service (KMS) 金鑰的權限。

注意: Amazon S3 可能需要最多 48 小時才能提供第一份庫存清單報告。

解決方法

允許來源儲存貯體將 Amazon S3 庫存清單報告上傳到目的地儲存貯體

確認您的儲存貯體政策允許來源儲存貯體上傳到目的地儲存貯體。

包含 PutObject 動作的儲存貯體政策範例:

{
    "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"
                }
            }
        }
    ]
}

從每個可能影響 PutObject 動作的 Deny 陳述式中排除 s3.amazonaws.com。明確的拒絕會優先於允許陳述式。 

以下範例儲存貯體政策拒絕存取 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"
                }
            }
        }
    ]
}

以下是上述儲存貯體政策的更新版本,允許對 s3.amazonaws.com 的存取:

{
    "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"
                ]
            }
        }
    ]
}

確認目的地儲存貯體與來源儲存貯體位於相同區域

開啟 Amazon S3 主控台。導覽至您的儲存貯體清單,然後檢查「區域」欄,以確定您的目的地儲存貯體和來源儲存貯體是否位於相同區域。 

如果您的來源儲存貯體和目的地儲存貯體位於不同的區域,請建立或選擇一個新儲存貯體。 

注意: 在您移轉物件之前,屬於該儲存貯體的物件將保留在您建立該儲存貯體的區域中。如需詳細資訊,請參閱儲存貯體概覽

授予存取用於加密庫存清單報告檔案的 AWS KMS key 的權限

如果您使用 AWS KMS key 加密了 Amazon S3 儲存貯體,則授予 Amazon S3 存取您的 AWS KMS key 的權限。

請完成下列步驟:

  1. 開啟 AWS KMS 主控台
    注意: 使用擁有 AWS KMS key 的 AWS 帳戶登入。

  2. 從導覽窗格選擇 Customer managed keys (客戶受管金鑰)。

  3. Customer managed keys (客戶自管金鑰) 下,選擇用於加密庫存清單報告檔案的 AWS KMS key。

  4. Key policy (金鑰政策) 下,選擇 Switch to policy view (切換為政策檢視)。

  5. 選擇 Edit (編輯)。

  6. 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"
            }
        }
    }
  7. 選擇 Save changes (儲存變更)。

注意: 檢查 Amazon S3 主控台中 Inventory configurations (庫存清單組態) 下的 Last export (上次匯出) 欄。空的上次匯出欄可能表示 Amazon S3 未提供庫存清單報告。如果 Amazon S3 提供了庫存清單報告,那麼您可以在目的地儲存貯體中的指定路徑中,找到庫存清單報告。

查看伺服器存取日誌和 CloudTrail 歷史記錄

檢查您的伺服器存取日誌,以確定是否對儲存貯體政策進行了更動,導致報告未能交付。有關日誌格式的範例,請參閱 Amazon S3 伺服器存取日誌格式

以下日誌項目範例顯示對儲存貯體政策進行了變更:

REST.PUT.BUCKETPOLICY

您也可以在 AWS CloudTrail 事件歷史記錄中搜尋 PutBucketPolicy API 動作。如果 PutBucketPolicy 動作是在 90 天前執行的,則必須查詢 Amazon S3 中的 CloudTrail 日誌。如需詳細資訊,請參閱 AWS Docs GitHub 網站上 CloudTrail 中的 Amazon S3 資訊

檢查庫存清單範圍的前綴篩選器

如果您設定了前綴篩選器,但 48 小時後仍未收到庫存清單報告,請檢查您的前綴組態。請確定前綴篩選器與庫存儲存貯體中的現有前綴相符。移除空格、拼字錯誤和前導斜線。

相關資訊

為 S3 儲存貯體和物件啟用 CloudTrail 事件記錄

管理 S3 庫存清單、S3 分析和 S3 庫存清單報告的權限

AWS 官方
AWS 官方已更新 5 個月前