☁️
AWS DataSyncでクロスアカウントS3転送を行う
この記事では、AWS DataSyncを使用して異なるAWSアカウント間でS3バケットのデータを転送する方法を説明します。本件は検証用にAmazonS3FullAccessを利用してますが、本番利用の際は必要最小限の権限を付与するようにして下さい。
前提条件
- ソースアカウントID: 111111111111
- デスティネーションアカウントID: 222222222222
- ソースS3バケット: source-bucket
- デスティネーションS3バケット: destination-bucket
手順
1. デスティネーションアカウントでRole作成
デスティネーションアカウント(222222222222)で以下の設定を行います。
a. IAMロールの作成:
aws iam create-role --role-name DataSyncDestinationRole --assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "datasync.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'
aws iam attach-role-policy --role-name DataSyncDestinationRole --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
2. ソースアカウントの設定
ソースアカウント(111111111111)で以下の設定を行います。
a. IAMロールの作成:
aws iam create-role --role-name DataSyncSourceRole --assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "datasync.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:role/DataSyncDestinationRole"
},
"Action": "sts:AssumeRole"
}
]
}'
aws iam attach-role-policy --role-name DataSyncSourceRole --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
b. S3バケットポリシーの設定:
S3バケットsource-bucketを作成し、以下のようにポリシーをアタッチします
aws s3api put-bucket-policy --bucket source-bucket --policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:role/DataSyncDestinationRole"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::source-bucket",
"arn:aws:s3:::source-bucket/*"
]
}
]
}'
3. デスティネーションアカウントの設定
デスティネーションアカウント(222222222222)で以下の設定を行います。
a. IAMロールの変更:
aws iam put-role-policy --role-name DataSyncDestinationRole --policy-name AssumeSourceRole --policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::111111111111:role/DataSyncSourceRole"
}
]
}'
4. DataSyncタスクの作成
デスティネーションアカウント(222222222222)で以下のコマンドを実行します。
a. ソースロケーションの作成:
aws datasync create-location-s3 \
--s3-bucket-arn arn:aws:s3:::source-bucket \
--s3-config '{"BucketAccessRoleArn":"arn:aws:iam::222222222222:role/DataSyncDestinationRole"}' \
--region ap-northeast-1
b. デスティネーションロケーションの作成:
aws datasync create-location-s3 \
--s3-bucket-arn arn:aws:s3:::destination-bucket \
--s3-config '{"BucketAccessRoleArn":"arn:aws:iam::222222222222:role/DataSyncDestinationRole"}' \
--region ap-northeast-1
c. DataSyncタスクの作成:
aws datasync create-task \
--source-location-arn <ソースロケーションARN> \
--destination-location-arn <デスティネーションロケーションARN> \
--name "CrossAccountS3Transfer" \
--options '{"VerifyMode":"ONLY_FILES_TRANSFERRED","OverwriteMode":"ALWAYS","Atime":"BEST_EFFORT","Mtime":"PRESERVE","Uid":"NONE","Gid":"NONE","PreserveDeletedFiles":"REMOVE","PreserveDevices":"NONE","PosixPermissions":"NONE","BytesPerSecond":-1}' \
--region ap-northeast-1
5. タスクの実行
実行結果は以下のコマンドで確認できます。
aws datasync start-task-execution --task-arn <タスクARN> --region ap-northeast-1
6. おわりに
セキュリティのベストプラクティスとして、本番環境ではAmazonS3FullAccessではなく必要最小限の権限を付与するようにしてください。
Discussion