如何使用 AWS DataSync 將資料傳入或傳出跨帳戶 Amazon S3 位置?
上次更新日期:2022 年 12 月 14 日
我想使用 AWS DataSync 將資料傳入或傳出跨帳戶 Amazon Simple Storage (Amazon S3) 儲存貯體。
簡短描述
若要使用 DataSync 進行跨帳戶資料傳輸,請執行以下操作:
- 使用 AWS Command Line Interface (AWS CLI) 或 AWS SDK 在 DataSync 中建立跨帳戶 Amazon S3 位置。
- 建立 DataSync 任務,將資料從來源儲存貯體傳輸到目的地儲存貯體。
使用 DataSync 在不同 S3 帳户擁有的儲存貯體之間傳輸資料時,請謹記以下限制:
- 將資料傳輸至跨帳戶目的地儲存貯體時,DataSync 未套用 bucket-owner-full-control 存取控制清單 (ACL)。這會導致目的地儲存貯體中的物件發生擁有權問題。
- 對於跨帳戶 S3 位置,僅支援同一區域中的跨帳戶儲存貯體。如果您嘗試使用跨帳戶和跨區域 S3 位置,則會收到 GetBucketLocation 或無法連接至 S3 端點錯誤。因此,如果任務是在來源帳戶中建立的,則必須在與目標儲存貯體相同的區域中建立任務。如果任務是在目的地帳戶中建立的,則必須在與來源值區相同的區域中建立任務。
- 您無法使用跨帳戶傳遞角色來存取跨帳戶 S3 位置。
透過解決上述限制,您可以將目的地帳戶中的 DataSync 任務設定為從來源中擷取資料。
解決方式
執行所需的檢查
假設來源帳戶具有跨帳戶來源 S3 儲存貯體,且目的地帳戶具有目的地 S3 儲存貯體和 DataSync 任務。請執行下列檢查:
AWS Identity and Management (IAM) 使用者/角色:檢查下列 IAM 使用者或角色是否具有必要的許可:
- 您用來建立跨帳戶 S3 位置的使用者或角色
- 您指派給 S3 位置的角色
來源儲存貯體政策:確保來源儲存貯體政策允許目的地帳戶中的 IAM 使用者/角色存取儲存貯體。以下範例政策會向 IAM 使用者/角色授予對來源儲存貯體的存取權限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::1111222233334444:role/datasync-config-role",
"arn:aws:iam::1111222233334444:role/datasync-transfer-role"
]
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::example-source-bucket"
]
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::1111222233334444:role/datasync-config-role",
"arn:aws:iam::1111222233334444:role/datasync-transfer-role"
]
},
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObjectTagging",
"s3:GetObjectTagging",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::example-source-bucket/*"
]
}
]
}
請務必替換上述政策中的下列值:
- example-source-bucket 替換為來源儲存貯體的名稱
- 1111222233334444 替換為目的地帳戶的帳戶 ID
- datasync-config-role 替換為用於 DataSync 組態的 IAM 角色 (例如:在 DataSync 中建立來源 S3 位置和任務)
注意:您也可以使用 IAM 使用者。本文將討論 IAM 角色的使用情況。 - dataysnc-transfer-role 替換為建立來源 S3 位置時指派的 IAM 角色
注意:DataSync 會使用此角色存取跨帳戶資料。
目的地 S3 位置:
- 確保根據為 AWS DataSync 建立 Amazon S3 位置中的説明建立目的地 S3 位置。
- 當您將 DataSync 與使用伺服器端加密的 S3 儲存貯體搭配使用時,請遵循使用伺服器端加密存取 S3 儲存貯體中的指示。
使用 AWS CLI 或 SDK 在 DataSync 中建立跨帳戶來源 S3 位置
注意:AWS 管理主控台不支援建立跨帳戶 S3 位置。
您可以使用以下任一方法建立跨帳戶 S3 位置:
- 使用組態 JSON 檔案。
- 使用 AWS CLI 命令中的選項。
使用組態 JSON 檔案
1. 使用以下參數為跨帳戶 S3 位置建立組態 JSON 檔案 input.template:
{
"Subdirectory": "",
"S3BucketArn": "arn:aws:s3:::[Source bucket]",
"S3StorageClass": "STANDARD",
"S3Config": {
"BucketAccessRoleArn": "arn:aws:iam::1111222233334444:role/datasync-transfer-role"
}
}
2. 執行以下 AWS CLI 命令建立 S3 位置:
aws datasync create-location-s3 --cli-input-json file://input.template --region example-DataSync-Region
{
"LocationArn": "arn:aws:datasync:example-Region:123456789012:location/loc-0f8xxxxxxxxe4821"
}
請注意 123456789012 來源帳戶的帳戶 ID。
使用 AWS CLI 命令中的選項
使用適當的選項來執行以下 AWS CLI 命令:
aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::example-source-bucket --s3-storage-class STANDARD --s3-config BucketAccessRoleArn="arn:aws:iam::1111222233334444:role/datasync-transfer-role" --region example-DataSync-Region
請務必替換命令中的下列值:
- example-source-bucket 替換為來源儲存貯體的名稱
- example-DataSync-Region 替換為您在其中建立 DataSync 工作的區域。
建立資料同步工作
設定 DataSync 任務,並從 DataSync 主控台啟動任務。如需詳細資訊,請參閱啟動 AWS DataSync 任務。
已知錯誤與解決方式
錯誤:建立 DataSync 位置 S3 時發生錯誤:InvalidRequestException:請在目前使用 DataSync 的 xxx 區域中提供一個儲存貯體
如果您收到此錯誤,請確認儲存貯體和 IAM 政策是否包含以下所需的許可:
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
]
如果您在使用跨帳戶儲存貯體時出現此錯誤,請確保儲存貯體與 DataSync 任務位於相同的區域
S3 物件擁有權問題
DataSync 不支援使用跨帳戶儲存貯體作為目的地位置。因此,您無法使用 ACL bucket-owner-full-control。如果 DataSync 任務從來源儲存貯體帳戶執行,則上傳至目的地儲存貯體帳戶的物件可能存在物件擁有權問題。若要解決此問題,如果目的地儲存貯體中沒有使用 ACL 的物件,請考慮停用目的地儲存貯體上的 ACL。如需詳細資訊,請參閱控制物件的擁有權並停用儲存貯體的 ACL。否則,最佳實務是將目的地帳戶中的 DataSync 任務設定為從來源中擷取資料。