☁️

AWS DataSyncでクロスアカウントS3転送を行う

2024/10/11に公開

この記事では、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