我想要在 AWS 帳戶中複製 Amazon Simple Storage Service (Amazon S3) 物件,並確保目的地帳戶擁有複製的物件。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
重要:上傳物件的 AWS 帳戶並非自動擁有 Amazon S3 中的物件。當您變更 S3 物件擁有權設定時,最佳做法是使用強制執行的儲存貯體擁有者設定。但是,此選項會關閉所有儲存貯體存取控制清單 (ACL),以及您儲存貯體中任何物件的 ACL。
使用 S3 物件擁有權中強制執行的儲存貯體擁有者設定時,相同儲存貯體擁有者會自動擁有 Amazon S3 儲存貯體中的所有物件。強制執行的儲存貯體擁有者設定可簡化儲存在 Amazon S3 中的資料的存取管理。對於現有的儲存貯體,S3 物件由上傳該物件的 AWS 帳戶所擁有,除非您明確關閉該 ACL。
如果您現有的方法依賴 ACL 來共用物件,則請確認使用 ACL 存取物件的主體。如需詳細資訊,請參閱關閉 ACL 的先決條件。
如果您無法關閉 ACL,請完成下列步驟以取得物件擁有權,直到您可以調整儲存貯體政策:
- 在來源帳戶中,建立 AWS Identity and Access Management (AWS IAM) 客戶管理政策,以授予 IAM 身分 (使用者或角色) 所需的權限。IAM 使用者必須具有從來源儲存貯體擷取物件的存取權,以及將物件放回目標儲存貯體的權限。您可以使用類似於下列範例的 IAM 政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::source-DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::source-DOC-EXAMPLE-BUCKET/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
]
}
]
}
**注意:**上述範例 IAM 政策僅包含列出物件和在不同帳戶的儲存貯體之間複製物件所需的最低必要權限。根據您的使用案例自訂允許的 S3 動作。例如,如果使用者必須複製具備物件標籤的物件,則您同樣必須授予 s3:GetObjectTagging 許可。如果您遇到錯誤,請以管理員使用者的身分執行這些步驟。
- 在來源帳戶中,將客戶管理政策附加到 IAM 身分。
- 在目的地帳戶中,將目的地儲存貯體的 S3 物件擁有權設定為偏好的儲存貯體擁有者。然後,將 ACL 設定為 bucket-owner-full-control 時上傳的新物件將自動由目的地儲存貯體的帳戶擁有。
- 在目的地帳戶中,修改目的地的儲存貯體政策,以授予來源帳戶上傳物件的權限。此外,請在儲存貯體政策中納入一個條件,要求物件上傳時將 ACL 設定為 bucket-owner-full-control。使用類似於下列範例的陳述式:
{
"Version": "2012-10-17",
"Id": "Policy1611277539797",
"Statement": [
{
"Sid": "Stmt1611277535086",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:user/Jane"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
},
{
"Sid": "Stmt1611277877767",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:user/Jane"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
}
]
}
**注意:**將 destination-DOC-EXAMPLE-BUCKET 取代為目的地儲存貯體的名稱。將 arn:aws:iam::222222222222:user/Jane 取代為來源帳戶的 IAM 身分的 ARN。
上述範例儲存貯體政策僅包含上傳具備所需 ACL 之物件的最低必要權限。根據您的使用案例自訂允許的 S3 動作。
- 確定 ACL 已設定為 bucket-owner-full-control,以便來源帳戶的 IAM 身分可以將物件上傳到目的地儲存貯體。例如,來源 IAM 身分必須使用 --acl 選項執行 cp AWS CLI 命令:
aws s3 cp s3://source-DOC-EXAMPLE-BUCKET/object.txt s3://destination-DOC-EXAMPLE-BUCKET/object.txt --acl bucket-owner-full-control
在上述範例中,該命令會複製檔案 object.txt。若要複製整個資料夾,請執行下列命令:
aws s3 cp directory/ s3://bucketname/directory --recursive --acl bucket-owner-full-control
**重要:**如果您的 S3 儲存貯體具備已啟用預設加密的 AWS Key Management Service (AWS KMS),則您還必須修改 AWS KMS key 權限。如需指示,請參閱我的 Amazon S3 儲存貯體具備使用自訂 AWS KMS key 的預設加密。如何允許使用者從儲存貯體下載及上傳?
相關資訊
儲存貯體擁有者授予跨帳戶儲存貯體許可
當物件由其他 AWS 帳戶上傳時,如何變更 Amazon S3 儲存貯體的物件擁有權?
使用資源型政策將存取權委派給另一個帳戶中的 Amazon S3 儲存貯體