0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クロスアカウントでS3のデータをコピーってどうやってするの?【バケットポリシー+IAMポリシー編】

0
Posted at

どーも!shihopowerです。

今回はAWSの異なるアカウント間でS3のデータをコピーする方法についてお話します。

「別アカウントのS3にデータを移したい」という場面、意外と多いですよね。たとえばこんなケース👇

  • 開発環境から本番環境へデータを移行したい
  • 会社の組織変更でAWSアカウントを分けることになった
  • データ活用チームに別アカウントでS3を用意した

ただ、クロスアカウントのS3コピーは「バケットポリシー」「IAMポリシー」「どちらのアカウントで操作するか」など、権限まわりの理解が必要で、最初は頭がこんがらがりました😅

この記事では、どのアカウントに・何の権限を・なぜ設定するのかを整理しながら解説します。同じところで詰まった方の参考になれば幸いです!


目次

  1. この記事でやること
  2. 権限設定の全体像
  3. 事前準備
  4. Step1:ソースバケットにバケットポリシーを設定する(アカウントA側)
  5. Step2:宛先アカウントのIAMユーザーにIAMポリシーをアタッチする(アカウントB側)
  6. Step3:aws s3 syncコマンドでデータをコピーする
  7. うまくいかないときのチェックリスト
  8. まとめ

1. この記事でやること

以下の構成でS3バケット間のデータコピーを行います。

アカウントA(ソース側)                アカウントB(宛先側)
┌──────────────────────┐             ┌──────────────────────┐
│  S3ソースバケット         │  ←読み取り  │  IAMユーザー              │
│  [バケットポリシー設定]    │             │  [IAMポリシー設定]       │
└──────────────────────┘             │                          │
                                      │  S3宛先バケット           │
                                      │  ↑書き込み               │
                                      └──────────────────────┘

使用するツール:AWS CLI
コマンドラインから aws s3 sync コマンドを実行してデータをコピーします。


2. 権限設定の全体像

なぜ2種類のポリシーが必要なのか?

クロスアカウントのS3アクセスには、「許可する側」と「許可される側」の両方でポリシー設定が必要です。

設定箇所 ポリシー種別 役割
アカウントA(ソース)のS3バケット バケットポリシー 「アカウントBのユーザーにここを読ませていいよ」とS3側が許可する
アカウントB(宛先)のIAMユーザー IAMポリシー 「このユーザーはA・B両方のバケットを操作できるよ」とIAM側が許可する

片方だけでは権限が通りません。両方の設定が揃って初めてアクセスできる仕組みです。

バケットポリシーとIAMポリシーの役割の違い

  • バケットポリシー:「誰が・このバケットに・何をしていいか」をバケット側で定義するリソースベースのポリシー
  • IAMポリシー:「このユーザーが・どのリソースに・何をしていいか」をIAM側で定義するアイデンティティベースのポリシー

3. 事前準備

  • AWS CLIをインストール済みであること(公式インストールガイド
  • アカウントA・アカウントBそれぞれのアクセスキーを取得済みであること
  • aws configure でプロファイルを設定しておくと、アカウントの切り替えがスムーズです
# アカウントAのプロファイル設定例
aws configure --profile accountA

# アカウントBのプロファイル設定例
aws configure --profile accountB

4. Step1:ソースバケットにバケットポリシーを設定する(アカウントA側)

アカウントAのS3ソースバケットに、アカウントBのユーザーがデータを読み取れるようにバケットポリシーを設定します。

設定するポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<アカウントBのID>:user/<IAMユーザー名>"
      },
      "Action": [
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::<ソースバケット名>",
        "arn:aws:s3:::<ソースバケット名>/*"
      ]
    }
  ]
}

ポリシーの各項目の意味

項目 意味
Principal アカウントBのIAMユーザーARN 誰に許可するか
s3:ListBucket ソースバケット本体に付与 バケット内のオブジェクト一覧を取得できる
s3:GetObject ソースバケット配下に付与 オブジェクトを読み取れる

s3:ListBucket はバケット自体(arn:aws:s3:::バケット名)に、s3:GetObject はオブジェクト(arn:aws:s3:::バケット名/*)に対して付与する必要があります。Resourceの指定ミスがよくあるハマりポイントです!

AWSコンソールでの設定手順

  1. S3コンソールを開き、ソースバケットを選択
  2. 「アクセス許可」タブ →「バケットポリシー」→「編集」
  3. 上記のJSONを貼り付けて保存

5. Step2:宛先アカウントのIAMユーザーにIAMポリシーをアタッチする(アカウントB側)

アカウントBのIAMユーザーに、ソースバケットの読み取りと宛先バケットへの書き込みを許可するIAMポリシーを設定します。

設定するポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::<ソースバケット名>",
        "arn:aws:s3:::<ソースバケット名>/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": [
        "arn:aws:s3:::<宛先バケット名>",
        "arn:aws:s3:::<宛先バケット名>/*"
      ]
    }
  ]
}

なぜ宛先アカウントにIAMポリシーが必要なのか?

IAMポリシーは**「操作を行うユーザーが所属するアカウント」に作成する必要があります**。

今回、aws s3 sync を実行するのはアカウントBのユーザーです。そのため、ソースバケットへのアクセス権限であっても、アカウントBのIAMポリシーとして定義します。

「ソースバケットへのアクセスだからアカウントAにIAMポリシーを作ればいい」と思いがちですが、それは誤りです。IAMポリシーはあくまで操作するユーザーのアカウント側に設定します。

AWSコンソールでの設定手順

  1. IAMコンソールを開き、対象のIAMユーザーを選択
  2. 「許可を追加」→「インラインポリシーを作成」
  3. JSONタブで上記のポリシーを貼り付けて保存

6. Step3:aws s3 syncコマンドでデータをコピーする

Step1・2の設定が完了したら、アカウントBのユーザーとして以下のコマンドを実行します。

aws s3 sync s3://<ソースバケット名> s3://<宛先バケット名> --profile accountB

プロファイルを設定していない場合は、環境変数でアカウントBの認証情報を設定してから実行してください。

実行するのは「宛先アカウントのユーザー」

Step1・2の設定により、アカウントBのユーザーは以下の権限を持っています。

  • ✅ ソースバケットのオブジェクト一覧取得・読み取り(Step1のバケットポリシー+Step2のIAMポリシー)
  • ✅ 宛先バケットへの書き込み(Step2のIAMポリシー)

ソースアカウントのユーザーとして実行しても、宛先バケットへの書き込み権限がないためエラーになります。必ずアカウントBのユーザーで実行しましょう。


7. うまくいかないときのチェックリスト

チェック項目 確認ポイント
AccessDenied エラーが出る Step1のバケットポリシーのPrincipalにアカウントBのユーザーARNが正確に記載されているか確認
NoSuchBucket エラーが出る バケット名のスペルミスがないか確認
❌ バケットポリシーが保存できない アカウントAのS3でブロックパブリックアクセス設定がポリシー保存を妨げていないか確認
❌ IAMポリシーをアタッチしたのにアクセスできない アカウントAのバケットポリシー(Step1)が設定済みか確認。両方揃わないと通らない
❌ Resourceのエラー s3:ListBucket はバケットARN、s3:GetObject はバケットARN+/* になっているか確認

8. まとめ

クロスアカウントのS3コピーに必要な手順を整理するとこうなります。

Step1. ソースバケット(アカウントA)にバケットポリシーを設定
       → アカウントBのユーザーにListBucket・GetObjectを許可

Step2. 宛先アカウント(アカウントB)のIAMユーザーにIAMポリシーをアタッチ
       → ソースバケットの読み取り+宛先バケットへの書き込みを許可

Step3. アカウントBのユーザーとしてaws s3 syncを実行

最初は権限設定の組み合わせに混乱しますが、「バケット側の許可」と「ユーザー側の許可」の両方が必要という点を押さえておくとスッキリ理解できます💡

この記事が参考になれば嬉しいです!最後まで読んでいただきありがとうございました🙌


参考:AWS公式ドキュメント

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?