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 を以下の手順で設定します。
- AWS 管理コンソール > AWS DataSync
- コピー元バケットのロケーションを作成
- コピー元バケットを選択
- コピー元バケットにアクセスするための IAM ロールを選択
- コピー先バケットのロケーションを作成
- コピー先バケットを選択
- コピー先バケットにアクセスするための IAM ロールを選択
- タスクを作成
- 送信元のロケーションにコピー元バケットのロケーションを選択
- 送信先のロケーションにコピー先バケットのロケーションを選択
タスクは手動で実行したり、スケジュールで定期的に実行することもできます。