異なるAWSアカウント間で、S3のファイルのコピーを行うには?
異なるAWSアカウント間で、S3のファイルをコピーすることができます。
S3 の bucket のアクセスコントロールで、別のアカウントのアクセスを許可することで、アクセス、コピーが可能になります。
以下に、その具体的な方法をまとめました。
1.S3 のバケットのポリシーを編集
AWS S3 Management Console 上で、バケットを指定して、edit Policy を選択すると、Bucket Policy generatorが表示されるので、こちらに下記のように入力します。(入力例)
{ "Version": "2008-10-17", "Id": "Policy1345626759739", "Statement": [ { "Sid": "Stmt1345626754496", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111111111111:root", ] }, "Action": "s3:*", "Resource": "arn:aws:s3:::bucket1/*" } ] }
こちらはPolicy generator で作成できます。
http://awspolicygen.s3.amazonaws.com/policygen.html
111111111111のところに、アクセスを許可したいAWSアカウント番号を記入します。アカウントを複数指定することも可能です。
Action のところで、"S3:*"を指定することで、S3に対するすべてのActionを実行できます。
Resource に、アクセス対象となるバケット名を指定します。
これで、指定されたアカウントからアクセスが可能になりますが、1点だけ注意が必要です。
AWS S3 Management Console 上では、自分が作成したバケットしか表示されません。他のアカウントのバケットを指定してアクセスすることがS3 のManagement Consoleでは現状できません。(2012/8/23現在)S3 用の API を使用(AWS SDK for Javaを今回は使用)して、バケットを明示的に指定すれば、その中のオブジェクトを表示したり、バケット間でコピーもできます。
2.コピーをする。
今回試した Java のサンプルプログラムはこちらです。
import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.s3.AmazonS3Client; public class S3CopyClient { public static void main(String[] args) { String originBucket = "bucket1"; String originFile = "test.txt"; String targetBucket = "bucket2"; String targetFile = "test-new.txt"; AWSCredentials cred = new BasicAWSCredentials( "XXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); AmazonS3Client s3Client = new AmazonS3Client(cred); s3Client.copyObject(originBucket, originFile, targetBucket, targetFile); } }
これで、コピーができました。Management Consoleを確認したら、コピーが成功していることを確認できました!