異なる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を確認したら、コピーが成功していることを確認できました!