構成
2つのAWSアカウントのS3バケット間でファイルをコピーする設定を考える。
構成としては以下のようになる。
権限設定としては以下のようになる。
- コピー先AWSアカウント: コピー元、コピー先のS3バケットにアクセスするための権限をIAM Userに与える
- コピー元AWSアカウント: コピー先のAWSアカウントのIAM Userがアクセスできるようにバケットポリシーを設定する
【AWS】他アカウントのS3へアクセスできるようにする の構成に加えて自アカウントのS3バケットにアクセスするための権限をIAM Userに追加した形となる。
コピー先AWSアカウントの設定
コピー先のAWSアカウントにあるIAM Userへ以下の権限を与える。
権限を与えるIAM Userがまだ存在しない場合は作成する。
IAM Roleを作成し、以下のポリシーをアタッチする。
- コピー元バケットへのアクセス権限
- s3:GetObject
- s3:ListBucket
- コピー先バケットへのアクセス権限
- s3:GetObject
- s3:ListBucket
- s3:PutObject
その他、コピー元のバケットのデータがタグやバージョンを持っている場合は対応するs3:GetObject*
やs3:PutObject*
の権限を与える。
また、アクセスを許可するResourceにはアクセス先のS3バケットを指定する。
例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObjectTagging",
"s3:GetObjectVersion",
"s3:GetObjectVersionTagging"
],
"Resource": [
"arn:aws:s3:::コピー元バケット名/*",
"arn:aws:s3:::コピー先バケット名/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectTagging",
],
"Resource": [
"arn:aws:s3:::コピー先バケット名/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::コピー元バケット名",
"arn:aws:s3:::コピー先バケット名"
]
}
]
}
IAM Policyを作成してIAM Roleにアタッチしてもいいし、IAM Roleのインラインとして設定してもいい。
コピー元AWSアカウントの設定
コピー元のS3バケットにコピー先のAWSアカウントのIAM Userがアクセスできるようにバケットポリシー
を設定する。
バケットポリシーへ設定する情報は以下のとおり。
- アクセスを許可するIAM UserのARNをPrincipalで指定
- アクセスを許可するActionを指定(コピー元なので読み取り権限だけでオーケー)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::コピー先アカウントID:role/コピー先AWSアカウントのロール名"
},
"Action": [
"s3:GetObjectTagging",
"s3:GetObjectVersion",
"s3:GetObjectVersionTagging"
],
"Resource": [
"arn:aws:s3:::コピー元バケット名/*"
]
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::コピー先アカウントID:role/コピー先AWSアカウントのロール名"
},
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::コピー元バケット名"
]
}
]
}
コピーの実行
コピー元のS3バケットからコピー先のS3バケットへファイルをコピーするにはaws s3 cp
コマンドやaws s3 sync
コマンドを使う。
例
$ aws s3 cp s3://<コピー元バケット名>/<オブジェクトキー> s3://<コピー先バケット名>/<オブジェクトキー>
$ aws s3 sync s3://<コピー元バケット名> s3://<コピー先バケット名>
\手を動かしながらTerraformを学びたい人にオススメ!/