S3のオブジェクトを別アカウントにコピーする
こんにちは!インフラエンジニアのずやです!
最近AWSアカウント間でS3のオブジェクトをコピーする機会があったので、覚書として手順を残したいと思います。
S3のオブジェクトを別アカウントにコピーする方法
前提
あるAWSアカウント(コピー元アカウント)から別のAWSアカウント(コピー先アカウント)にS3のオブジェクトをコピーしたいとします。
コピー作業はコピー先アカウントのIAMユーザまたはIAMロールを使用してAWS CLIで行います。
手順
- コピー作業用のIAMユーザまたはIAMロールを用意し、下記の内容相当のIAMポリシーをアタッチします。
このIAMユーザ or IAMロールのARNをメモしておきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<コピー元のS3バケット名>",
"arn:aws:s3:::<コピー元のS3バケット名>/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::<コピー先のS3バケット名>",
"arn:aws:s3:::<コピー先のS3バケット名>/*"
]
}
]
}
コピー元バケットからオブジェクトをGetする権限とコピー先バケットにオブジェクトをPutする権限を付与することとなります。
- コピー元アカウントの対象オブジェクトがあるバケットのバケットポリシーを編集します。
既にバケットポリシーがある場合は、Statement部分を追記してください。
{
"Version": "2012-10-17",
"Id": "test",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "<IAMユーザ or IAMロールのARN>"
},
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<コピー元のS3バケット名>/*",
"arn:aws:s3:::<コピー元のS3バケット名>"
]
}
]
}
- コピー作業用のIAMユーザまたはIAMロールを用いて次のコマンドを実行します。
aws s3 sync s3://<コピー元S3バケット名>/<フォルダ> s3://<コピー先S3バケット名>/<フォルダ>
以上です!
おまけ: S3のアクセス管理について
ここからはおまけです。
S3は頻繁に利用するものの、バケットポリシー等のアクセス管理についてあまり詳しくないなと感じたのでざっくりとまとめてみました。
アクセス管理の種類
S3のリソースへのアクセスを管理する仕組み(リソースポリシー)には大きく分けて3種類あります。
・アクセスコントロールリスト (ACL)
- バケットまたはオブジェクトに対して設定するリソースベースポリシー
- 基本的な書き込み/読み込み権限を簡易に設定できる
- 詳細な権限管理はできない
・バケットポリシー
- バケットに対して設定するリソースベースポリシー
- JSON形式で詳細に権限設定できる
・ユーザポリシー
- IAMユーザ or IAMロールに対して設定するポリシー(IAMポリシー)
ACLは詳細な権限管理ができず、他のポリシーより権限適用の優先度も低いため、基本的にはバケットポリシーとユーザポリシーによってS3バケットへのアクセス管理を行います。
IAMユーザにアクセス許可するには
IAMユーザ(またはIAMロール)からS3にアクセスする権限を付与するには、アクセス先のS3の所有権によって付与すべきポリシーが異なります。
S3の所有権がIAMユーザの所属するAWSアカウントである場合
バケットポリシーもしくはユーザポリシーのどちらかで必要なアクセス権限が付与されていればアクセスできます。
S3の所有権が他AWSアカウントである場合
バケットポリシーとユーザポリシーの両方で必要なアクセス権限を付与する必要があります。
参考
・他の AWS アカウントから S3 オブジェクトをコピーする
・20190220 AWS Black Belt Online Seminar Amazon S3 / Glacier
・Amazon S3 での Identity and Access Management
・S3のバケットポリシーでハマったので、S3へのアクセスを許可するPrincipalの設定を整理する