S3のオブジェクトを別アカウントにコピーする | Dev Driven 開発・デザインチーム S3のオブジェクトを別アカウントにコピーする – 働くひとと組織の健康を創る iCARE

BLOG

S3のオブジェクトを別アカウントにコピーする

MiyakawaKazuya
2020/10/27

こんにちは!インフラエンジニアのずやです!

最近AWSアカウント間でS3のオブジェクトをコピーする機会があったので、覚書として手順を残したいと思います。

S3のオブジェクトを別アカウントにコピーする方法

前提

あるAWSアカウント(コピー元アカウント)から別のAWSアカウント(コピー先アカウント)にS3のオブジェクトをコピーしたいとします。

コピー作業はコピー先アカウントのIAMユーザまたはIAMロールを使用してAWS CLIで行います。

手順

  1. コピー作業用の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する権限を付与することとなります。

  1. コピー元アカウントの対象オブジェクトがあるバケットのバケットポリシーを編集します。
    既にバケットポリシーがある場合は、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バケット名>"
            ]
        }
    ]
}
  1. コピー作業用の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の設定を整理する