我在我的儲存貯體之間設定了複寫,但新物件不會複寫。我怎樣才能疑難排解這個問題?

3 分的閱讀內容
0

我在 Amazon Simple Storage Service (Amazon S3) 儲存貯體之間設定了跨區域複寫 (CRR) 或相同區域複寫 (SRR)。不過,物件不會複寫到目的地儲存貯體。

解決方式

若要疑難排解未複寫到目的地儲存貯體的物件,請檢查儲存貯體的不同類型許可。另外,請檢查公共存取設定和儲存貯體擁有權設定。

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

解決造成複寫失敗的問題後,來源儲存貯體中可能有未複寫的物件。根據預設,S3 複寫不會複寫現有物件或複寫狀態為「失敗」 或「複本」的物件。使用 S3 批次複寫來複寫這些物件。

Amazon S3 最低許可

確認 AWS 身分存取管理 (IAM) 角色具有正確的許可。如果來源和目的地儲存貯體位於不同的帳戶中,請確認目的地帳戶的儲存貯體政策也授予複寫角色的足夠許可。

以下範例顯示具有複寫所需最低許可的 ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/setting-repl-config-perm-overview.html#setting-repl-config-same-acctowner)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/*"
        }
    ]
}

注意: 以 S3 儲存貯體的名稱取代來源儲存貯體目的地儲存貯體

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

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

如果目的地儲存貯體位於另一個帳戶中,則目的地儲存貯體政策必須授予下列許可:

{
    "Version": "2012-10-17",
    "Id": "Policy1644945280205",
    "Statement": [
        {
            "Sid": 「STMT1644945277847」,
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
            },
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateTags"
            ]、
            "Resource": "arn:aws:s3:::DestinationBucket/*"
        }
    ]
}

注意: 將 arn:aws:iam::123456789101:role/s3-replication-role 取代為複寫角色的 ARN

其他 Amazon S3 許可

如果複寫規則設定為「將物件擁有權變更為目的地儲存貯體擁有者」,則 IAM 角色必須具有 s3:ObjectOwnerOverrideToBucketOwner許可。此許可會置於 S3 物件資源上。例如:

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

目的地帳戶還必須通過儲存貯體政策授予 s3:ObjectOwnerOverrideToBucketOwner 許可:

{
  "Version": "2012-10-17",
  "Id": "Policy1644945280205",
  "Statement": [
    {
      "Sid": 「STMT1644945277847」,
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
      },
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateTags",
        "s3:ObjectOwnerOverrideToBucketOwner"
      ]、
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

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

如果複寫規則啟用了刪除標記複寫,則 IAM 角色必須具有 s3:ReplicateDelete 許可。如果目的地儲存貯體位於另一個帳戶中,則目的地儲存貯體擁有者也必須透過儲存貯體政策授予此許可。例如:

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

}

注意: 將DestinationBucket取代為 S3 儲存貯體的名稱。

同樣的許可也必須透過目的地儲存貯體上的儲存貯體政策授予:

{
  "Version": "2012-10-17",
  "Id": "Policy1644945280205",
  "Statement": [
    {
      "Sid": 「STMT1644945277847」,
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
      },
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateTags",
        "s3:ObjectOwnerOverrideToBucketOwner",
        "s3:ReplicateDelete"
      ]、
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

AWS KMS 許可

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

若要包含使用 AWS KMS 加密的物件:

1.    打開 Amazon S3 主控台

2.    選擇包含來源物件的 S3 儲存貯體。

3.    在管理索引標籤上,選取複寫規則。

5.    選取「編輯」。

6.    在加密下,選取複寫使用 AWS KMS 加密的物件

7.    在用於加密目的地物件的 AWS KMS 金鑰下,選取 AWS KMS 金鑰。預設選項是使用 AWS KMS 金鑰 (AWS/S3)。

重要事項: 如果目的地儲存貯體位於不同的 AWS 帳戶中,請指定目的地帳戶所擁有的 KMS 客戶受管金鑰。請勿使用預設的 AWS/S3 金鑰。這會使用來源帳戶所擁有的 AWS 受管金鑰加密物件,而且無法與其他帳戶共用。因此,目的地帳戶無法存取目的地儲存貯體中的物件。

若要使用屬於目的地帳戶的 AWS KMS 金鑰來加密目的地物件,目的地帳戶必須在 KMS 金鑰政策中授予複寫角色:

{
    "Sid": "AllowS3ReplicationSourceRoleToUseTheKey",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
    },
    "Action": ["kms:GenerateDataKey", "kms:Encrypt"],
    "Resource": "*"
}

注意:如果您在 AWS KMS 金鑰政策中使用星號 (\ *) 作為資源,則該政策只會將 KMS 金鑰的許可授予複寫角色。政策不允許複寫角色提升其許可。

此外,來源帳戶必須將下列最低許可新增至複寫角色的 IAM 政策:

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

根據預設,KMS 金鑰政策會授予根使用者金鑰的完整許可。這些許可可以委派給相同帳戶中的其他使用者。除非來源 KMS 金鑰政策中有拒絕陳述式,否則使用 IAM 政策將複寫角色許可授予來源 KMS 金鑰就足夠了。

明確拒絕和條件式允許陳述式

如果您的物件在驗證許可之後仍未複寫,請檢查是否有任何明確的拒絕陳述式:

  • 目的地儲存貯體政策中的拒絕陳述式或限制存取特定 CIDR 範圍、VPC 端點或 S3 存取點的 KMS 金鑰政策可能會導致複寫失敗。
  • 附加至 IAM 角色的拒絕陳述式或許可界限可能會導致複寫失敗。
  • 附加至來源或目的地帳戶的 AWS 組織服務控制政策中的拒絕陳述式可能會導致複寫失敗。

**提示:**移除任何明確的拒絕陳述式之前,請確認使用 deny 的原因,並判斷陳述式是否會影響資料安全性。

如果來源或目的地 KMS 金鑰根據加密內容授予許可,請確認已開啟儲存貯體的 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_NAMEDESTINATION_BUCKET_NAME 取代為您的來源儲存貯體和目的地儲存貯體的名稱。

如果未為來源或目的地儲存貯體開啟儲存貯體金鑰,則加密內容必須是物件層級資源:

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

注意: 將 SOURCE_BUCKET_NAMEDESTINATION_BUCKET_NAME 取代為您的來源儲存貯體和目的地儲存貯體的名稱。

物件 ACL 和封鎖公用存取

檢查來源儲存貯體和目的地儲存貯體是否正在使用 ACL。如果物件已連接允許公開存取的 ACL,但目的地儲存貯體正在使用區塊公開存取,則複寫會失敗。

來源物件擁有權

如果來源儲存貯體中的物件是由另一個 AWS 帳戶上傳的,則來源帳戶可能沒有這些物件的許可。檢查來源儲存貯體以查看 ACL 是否已停用。如果來源儲存貯體已停用 ACL,則來源帳戶就是儲存貯體中所有物件的擁有者。如果來源儲存貯體沒有停用 ACL,請檢查「物件擁有權」是否設定為**「偏好的物件擁有者」** 或「偏好的儲存貯體擁有者」。如果儲存貯體設定為「偏好的儲存貯體擁有者」,則來源儲存貯體物件需要 bucket-owner-full-control ACL,才能讓儲存貯體擁有者成為物件擁有者。

來源帳戶可以停用 ACL,取得儲存貯體中所有物件的所有權。大多數使用案例不需要使用 ACL 來管理存取權。最佳做法是使用 IAM 和儲存貯體政策來管理 S3 資源的存取。若要停用 S3 儲存貯體上的 ACL,請參閱控制物件擁有權和停用儲存貯體的 ACL。請務必評估 ACL 在儲存貯體和物件上的目前使用情況。您目前的儲存貯體和 IAM 政策必須授予足夠的許可,以便您可以停用 ACL 而不會影響 Amazon S3 存取。


相關資訊

逐步解說: 設定複寫的範例

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