跳至內容

為什麼我在設定儲存貯體之間的複寫時,Amazon S3 物件無法複寫?

3 分的閱讀內容
0

我在 Amazon Simple Storage Service (Amazon S3) 一般用途儲存貯體之間設定了複寫。但是,物件未能複寫到位於相同 AWS 區域或不同區域的目的地儲存貯體。

簡短說明

**注意:**您只能將 Amazon S3 複寫功能用於一般用途的儲存貯體。您無法將複寫功能用於目錄儲存貯體和資料表儲存貯體。

若要對無法進行跨區域複寫 (CRR) 或同區域複寫 (SRR) 的 Amazon S3 物件進行疑難排解,請檢查目的地儲存貯體的權限。同時,檢查公開存取設定和儲存貯體擁有權設定。

解決造成複寫失敗的問題後,來源儲存貯體中可能有仍無法複寫的物件。預設情況下,Amazon S3 複寫不會複寫現有物件或具有 FAILED (失敗) 或 REPLICA (複本) 複寫狀態的物件。若要檢查物件的複寫狀態,請參閱如何檢視從一個 Amazon S3 儲存貯體複寫失敗到另一個儲存貯體的物件?對於這些物件,請使用 S3 批次複寫

解決方法

識別複寫設定問題

在每次組態變更後,上傳物件至來源儲存貯體,以便測試複寫。最佳實務是一次變更一個組態,藉此識別任何複寫設定問題。

同時,啟用 s3:Replication:OperationFailedReplication 事件類型通知,以確定失敗原因。

授予最少的 Amazon S3 權限

確認您在複寫規則中使用的 AWS Identity Access Management (IAM) 角色具有正確權限。如果來源與目的地儲存貯體位於不同 AWS 帳戶,請確認目的地帳戶的儲存貯體政策授予權限給複寫角色。以下範例 IAM 政策包含複寫所需的最少權限:

{    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetReplicationConfiguration",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::SourceBucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionTagging"
            ],
            "Resource": [
                "arn:aws:s3:::SourceBucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateTags"
            ],
            "Resource": "arn:aws:s3:::DestinationBucket/*"
        }
    ]
}

**注意:**將 SourceBucket 替換為您的來源儲存貯體,DestinationBucket 替換為您的目的地儲存貯體。

根據複寫規則選項,您可能需要授予額外權限

IAM 角色必須具有信任政策,以允許 Amazon S3 擔任該角色來複寫物件。信任政策範例:

{    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

授予額外 Amazon S3 權限

如果您將複寫規則設定為將物件擁有權變更為目的地儲存貯體擁有者,那麼您必須設定額外權限。

注意:如果目的地儲存貯體的物件擁有權為強制執行的儲存貯體擁有者,則您不需要在複寫規則中將物件擁有權變更為目的地儲存貯體擁有者。依預設,會發生此變更。

若要授予 IAM 角色 s3:ObjectOwnerOverrideToBucketOwner 權限,請在 Amazon S3 物件政策中新增以下權限:

{    "Effect": "Allow",
    "Action": [
        "s3:ObjectOwnerOverrideToBucketOwner"
    ],
    "Resource": "arn:aws:s3:::DestinationBucket/*"
}

**注意:**將 DestinationBucket 替換為您的目的地儲存貯體。

另外,在目的地帳戶的儲存貯體政策中新增以下 s3:ObjectOwnerOverrideToBucketOwner 權限:

{    "Sid": "1",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"
    },
    "Action": [
        "s3:ObjectOwnerOverrideToBucketOwner"
    ],
    "Resource": "arn:aws:s3:::DestinationBucket/*"
}

**注意:**將 SourceBucket-account-ID 替換為來源儲存貯體帳戶,將 source-account-IAM-role 替換為來源帳戶的 IAM 角色,並將 DestinationBucket 替換為目的地儲存貯體。

如果您在複寫規則上啟用了 刪除標記複寫,則 IAM 角色必須具有以下 s3:ReplicateDelete 權限:

{    "Effect": "Allow",
    "Action": [
        "s3:ReplicateDelete"
    ],
    "Resource": "arn:aws:s3:::DestinationBucket/*"
}

**注意:**將 DestinationBucket 替換為您的目的地儲存貯體。

如果目的地儲存貯體位於其他帳戶,則目的地儲存貯體擁有者還必須在儲存貯體政策中新增以下權限:

{    "Version": "2012-10-17",
    "Id": "PolicyForDestinationBucket",
    "Statement": [
        {
            "Sid": "Permissions on objects",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"
            },
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateTags",
                "s3:ObjectOwnerOverrideToBucketOwner",
                "s3:ReplicateDelete"
            ],
            "Resource": "arn:aws:s3:::DestinationBucket/*"
        },
        {
            "Sid": "Permissions on bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"
            },
            "Action": [
                "s3:GetBucketVersioning",
                "s3:PutBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::DestinationBucket"
        }

    ]
}

**注意:**將 arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role 替換為複寫角色的 Amazon Resource Name (ARN),將 DestinationBucket 替換為目的地儲存貯體。

授予 AWS KMS 權限

如果您使用 AWS Key Management Service (AWS KMS) 金鑰加密了來源儲存貯體的物件,則複寫規則必須包含 AWS KMS 加密。

若要設定所需權限,請完成以下步驟:

  1. 開啟 Amazon S3 console (Amazon S3 主控台)。
  2. 選擇來源儲存貯體。
  3. 選擇 Management (管理) 索引標籤,然後在 Replication rules (複寫規則) 下選擇複寫規則。
  4. 選擇 Edit (編輯)。
  5. 加密下,選擇複寫使用 AWS KMS 加密的物件
  6. 用於加密目的地物件的 AWS KMS key 下,選取 AWS KMS key。預設選項是使用 AWS KMS key (aws/S3)。

有關複寫政策範例,請參閱 範例政策 - 使用 SSE-S3 與 SSE-KMS 進行複寫

**注意:**如果目的地儲存貯體位於不同帳戶,請指定由目的地帳戶擁有的 AWS KMS 客戶自管金鑰。預設 aws/S3 金鑰使用來源帳戶擁有的 AWS 受管金鑰加密物件。不過,您無法將 AWS 受管金鑰與其他帳戶共用。

為跨帳戶情境授予額外 AWS KMS 權限

若要使用目的地帳戶的 AWS KMS key 加密目的地物件,目的地帳戶必須在金鑰政策中允許複寫角色。政策範例:

{    "Sid": "AllowS3ReplicationSourceRoleToUseTheKey",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"
    },
    "Action": [
        "kms:GenerateDataKey",
        "kms:Encrypt"
    ],
    "Resource": "*"
}

**注意:**將 arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role 替換為複寫角色 ARN。如果您對 Resource (資源) 使用星號 (*),則該政策只會授予複寫角色權限。但是,該政策不允許複寫角色擴展其權限。

同時,您必須在來源帳戶的複寫角色 IAM 政策中新增以下最少權限:

[      {  
        "Effect": "Allow",  
        "Action": [  
            "kms:Decrypt",  
            "kms:GenerateDataKey"  
        ],  
        "Resource": [  
            "SourceKmsKeyArn"  
        ]  
    },  
    {  
        "Effect": "Allow",  
        "Action": [  
            "kms:GenerateDataKey",  
            "kms:Encrypt"  
        ],  
        "Resource": [  
            "DestinationKmsKeyArn"  
        ]  
    }  
]

預設情況下,AWS KMS 金鑰政策授予根使用者對金鑰的完整權限。您可以將這些權限委派給同一帳戶的其他使用者。您也可以使用 IAM 政策授予複寫角色對來源 KMS 金鑰的權限。此組態允許所需的存取權,除非來源 AWS KMS key 政策中有 Deny (拒絕) 陳述式。

檢查明確拒絕與條件式允許陳述式

**重要:**在移除明確 Deny (拒絕) 陳述式之前,請確認其存在的原因,以及是否影響資料安全。

如果在驗證權限後物件仍無法複寫,請檢查可能導致複寫失敗的明確 Deny (拒絕) 陳述式。

移除目的地儲存貯體政策或 AWS KMS key 政策中,限制存取以下資源的 Deny (拒絕) 陳述式:

  • 特定 CIDR 範圍
  • 虛擬私有雲端 (VPC) 端點
  • Amazon S3 存取點

同時,移除來源與目的地帳戶 IAM 角色政策及 AWS Organizations 服務控制政策 (SCPs) 中的 Deny (拒絕) 陳述式或權限界限。

檢查 S3 儲存貯體金鑰

如果來源或目的地 AWS KMS key 根據加密上下文授權,請檢查您是否使用 S3 儲存貯體金鑰。如果儲存貯體使用 S3 儲存貯體金鑰,則加密上下文必須是儲存貯體層級資源。加密上下文範例:

"kms:EncryptionContext:aws:s3:arn": ["arn:aws:s3:::SOURCE_BUCKET_NAME"]
"kms:EncryptionContext:aws:s3:arn": ["arn:aws:s3:::DESTINATION_BUCKET_NAME"]

**注意:**將 SOURCE_BUCKET_NAME 替換為來源儲存貯體,DESTINATION_BUCKET_NAME 替換為目的地儲存貯體。

如果來源或目的地儲存貯體未使用 S3 儲存貯體金鑰,則加密上下文必須是物件層級資源。加密上下文範例:

"kms:EncryptionContext:aws:s3:arn": ["arn:aws:s3:::SOURCE_BUCKET_NAME/*"]
"kms:EncryptionContext:aws:s3:arn": ["arn:aws:s3:::DESTINATION_BUCKET_NAME/*"]

**注意:**將 SOURCE_BUCKET_NAME 替換為來源儲存貯體,DESTINATION_BUCKET_NAME 替換為目的地儲存貯體。

檢查物件 ACL

檢查來源和目的地儲存貯體是否使用禁止存取的存取控制清單 (ACL)。如果物件具有允許公開存取的 ACL,但目的地儲存貯體使用了 S3 禁止公開存取,則複寫會失敗。

確認來源物件擁有權

如果另一個帳戶上傳了來源儲存貯體的物件,則來源帳戶可能無法存取這些物件。檢查來源儲存貯體是否啟用 ACL。

如果來源儲存貯體已停用 ACL,則來源帳戶是儲存貯體中所有物件的擁有者。如果來源儲存貯體已啟用 ACL,請檢查物件擁有權是否設定為物件擁有者優先儲存貯體擁有者優先。如果擁有權設定為儲存貯體擁有者優先,則來源儲存貯體物件必須具有 bucket-owner-full-control ACL 權限。

來源帳戶可以停用 ACL 以取得儲存貯體中所有物件的擁有權。大多數使用案例不需要 ACL 來管理存取權。最佳實務是使用 IAM 與儲存貯體政策來管理 Amazon S3 資源的存取權。在停用 ACL 之前,請確保您的儲存貯體與 IAM 政策授予所需權限,以保留現有 Amazon S3 存取權。

指定正確的複寫規則篩選器

確保您正確指定複寫規則篩選器

如果您指定了結合索引鍵首碼和物件標籤的規則篩選器,則 Amazon S3 會執行邏輯 AND 作業。該規則適用於具有特定索引鍵首碼和特定標籤的物件子集。

相關資訊

設定即時複寫的範例

AWS 官方已更新 7 個月前