Skip to main content

AWS DataSync でクロスアカウント間の S3 バケットをコピー

概要

AWS DataSync を使うと簡単に大量のデータを効率的に S3 バケット間でコピーすることができます。同一アカウント内であれば S3 バケットの読み込み、書き込みにそれぞれ IAM ロールを設定して割り当てるだけですが、異なるアカウント間の場合は別のアカウントからアクセスできるようバケットポリシーを設定する必要があります。その方法について簡単にまとめてみました。

参考) Tutorial: Transferring data between Amazon S3 buckets across AWS accounts - AWS DataSync

設定パターン

コピー元アカウントに DataSync を設定する場合

コピー先となる S3 バケット(右)にバケットポリシーを設定し、コピー元アカウントからの書き込みを許可します。

コピー元アカウントに設定

コピー先アカウントに DataSync を設定する場合

コピー元となる S3 バケット(左)にバケットポリシーを設定し、コピー先アカウントからの読み込みを許可します。

コピー先アカウントに設定

いずれとも異なるアカウントに DataSync を設定する場合

コピー元、コピー先いずれの S3 バケットにもバケットポリシーを設定し、DataSync アカウントからの読み書きを許可します。

別アカウントに設定

設定方法

IAM ロール

コピー元、コピー先のバケットにアクセスするための IAM ロールをそれぞれ作成して DataSync に指定します。

サービスとしての DataSync から使用されるため、IAM ロールの Trusted policy は以下のように設定します。

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

S3 バケットに対して必要な権限は以下のとおりです。バケット名にはそれぞれコピー元、コピー先のバケット名を指定します。厳密にはコピー元(読み取り)かコピー先(書き込み)かでそれぞれ必要な権限は異なると思いますが、ここでは読み書きの権限をつけていますため、共通で使用できます。

{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::(バケット名)"
},
{
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:GetObjectTagging",
"s3:PutObjectTagging",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::(バケット名)/*"
}
]
}

バケットポリシー

別のアカウントからアクセスされる S3 バケットには、IAM ロールだけでなくバケットポリシーによる許可が必要になります。バケットポリシーに以下のようにアクセス元 IAM ロールからのアクセスを許可します。こちらも厳密にはコピー元(読み取り)かコピー先(書き込み)かでそれぞれ必要な権限は異なると/思いますが、ここでは読み書きの権限をつけているため、共通で使用できます。

末尾の DataSyncCreateS3Location にある s3:ListBucket は、DataSync に S3 ロケーションを設定する際に必要な権限です。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::(アクセス元のアカウント ID):role/(アクセス元の IAM ロール名)"
]
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::(バケット名)"
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::(アクセス元のアカウント ID):role/(アクセス元の IAM ロール名)"
]
},
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObjectTagging",
"s3:GetObjectTagging",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::(バケット名)/*"
},
{
"Sid": "DataSyncCreateS3Location",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::(アクセス元のアカウント ID):root"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::(バケット名)"
}
]
}

DataSync

DataSync を以下の手順で設定します。

  1. AWS 管理コンソール > AWS DataSync
  2. コピー元バケットのロケーションを作成
    • コピー元バケットを選択
    • コピー元バケットにアクセスするための IAM ロールを選択
  3. コピー先バケットのロケーションを作成
    • コピー先バケットを選択
    • コピー先バケットにアクセスするための IAM ロールを選択
  4. タスクを作成
    • 送信元のロケーションにコピー元バケットのロケーションを選択
    • 送信先のロケーションにコピー先バケットのロケーションを選択

タスクは手動で実行したり、スケジュールで定期的に実行することもできます。