この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ベルリンの半瀬です。
はじめに
題名の通りですが、アカウントを跨いだS3転送についてEc2からコマンドラインでの実行確認を行いましたので、そのメモを残します。 以下の過去記事とAWSドキュメントを元にしました。
- How do I transfer ownership of Amazon S3 objects to a different AWS account? | AWS
- クロスアカウントで S3 sync するための権限設定 | Developers.IO
やってみます
以下のような形で実行します。EC2は送り先で起動。
簡単です。と言いつつもポリシーの記述間違いでハマったことは内緒です。
- 送信元(Source)の情報
- AWS Account ID : 111111111111
- S3 Bucket : test-s3-sync-src (Frankfurt)
- 送信先(Destination)の情報
- AWS Account ID : 222222222222
- S3 Bucket : test-s3-sync-dst (Frankfurt)
とします。
送信元バケットでバケットポリシー付与
送信元アカウント(ID:111111111111)のバケット「test-s3-sync-src」に、以下のポリシーを付与します。 Principalで送信先アカウントID(2222222222222)を指定し、送信先からのアクセスを許可しています。
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "DelegateS3Access",
"Effect": "Allow",
"Principal":{ "AWS": "222222222222"},
"Action":"s3:*",
"Resource": [
"arn:aws:s3:::test-s3-sync-src/*",
"arn:aws:s3:::test-s3-sync-src"
]
}
]
}
送信先アカウントでCLI操作用のIAM Roleを準備
作業場所はEC2なので、IAM Ec2 Roleを準備します。 送信元ではListBucketとGetObject、送信先ではListBucketとPutObjectをポリシーで指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::test-s3-sync-src",
"arn:aws:s3:::test-s3-sync-src/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::test-s3-sync-dst",
"arn:aws:s3:::test-s3-sync-dst/*"
]
}
]
}
作業用Ec2を起動
します。前項で設定したIAM roleの付与忘れず。 起動後にログインし、今回の実行環境を確認します。
$ aws --version
aws-cli/1.14.9 Python/2.7.12 Linux/4.9.76-3.78.amzn1.x86_64 botocore/1.8.13
CLIバージョンは上の通りです。
S3 syncを実行
IAM Role が効いていることを確認します。 送信先アカウントの「test-s3-sync-dst」が見えていることを確認。
$ aws s3 ls s3://test-s3-sync-dst/
2018-01-22 18:57:37 288381 test.jpg
テストで配置した画像ファイルが確認できます。
送信元アカウントの「test-s3-sync-src」が見えていることを確認。
$ aws s3 ls s3://test-s3-sync-src/
2018-01-22 18:51:16 1422172380 test.gz
test.gz(約1.3Gbyte)を確認に使用します。
実行。
$ aws s3 sync s3://test-s3-sync-src s3://test-s3-sync-dst
Completed 120.0 MiB/1.3 GiB (163.1 MiB/s) with 1 file(s) remaining
Completed 208.0 MiB/1.3 GiB (173.3 MiB/s) with 1 file(s) remaining
Completed 320.0 MiB/1.3 GiB (198.7 MiB/s) with 1 file(s) remaining
Completed 424.0 MiB/1.3 GiB (196.9 MiB/s) with 1 file(s) remaining
Completed 576.0 MiB/1.3 GiB (209.9 MiB/s) with 1 file(s) remaining
Completed 712.0 MiB/1.3 GiB (213.8 MiB/s) with 1 file(s) remaining
Completed 856.0 MiB/1.3 GiB (220.5 MiB/s) with 1 file(s) remaining
Completed 984.0 MiB/1.3 GiB (224.6 MiB/s) with 1 file(s) remaining
Completed 1.1 GiB/1.3 GiB (227.3 MiB/s) with 1 file(s) remaining
Completed 1.2 GiB/1.3 GiB (229.3 MiB/s) with 1 file(s) remaining
Completed 1.3 GiB/1.3 GiB (227.9 MiB/s) with 1 file(s) remaining
copy: s3://test-s3-sync-src/test.gz to s3://test-s3-sync-dst/test.gz
実行が完了しました。 実行時はだいたい200M/secほど出ています。1G程度だったので、あっという間に転送されました。
ファイルが転送されていることを確認。
$ aws s3 ls s3://test-s3-sync-dst/
2018-01-22 18:57:37 288381 test.jpg
2018-01-22 20:14:15 1422172380 test.gz
以上です。
おわりに
S3ファイルのアカウント間転送について実行確認を行ない、具体的な実行コマンドサンプルについてご紹介しました。なお、実行したコマンドは同じリージョン間での転送ですので、異なるリージョンのバケットを指定する場合は--source-region
、--region
の指定が必要となります。
その他のご参考
それではー。