どーも!shihopowerです。
今回はAWSの異なるアカウント間でS3のデータをコピーする方法についてお話します。
「別アカウントのS3にデータを移したい」という場面、意外と多いですよね。たとえばこんなケース👇
- 開発環境から本番環境へデータを移行したい
- 会社の組織変更でAWSアカウントを分けることになった
- データ活用チームに別アカウントでS3を用意した
ただ、クロスアカウントのS3コピーは「バケットポリシー」「IAMポリシー」「どちらのアカウントで操作するか」など、権限まわりの理解が必要で、最初は頭がこんがらがりました😅
この記事では、どのアカウントに・何の権限を・なぜ設定するのかを整理しながら解説します。同じところで詰まった方の参考になれば幸いです!
目次
- この記事でやること
- 権限設定の全体像
- 事前準備
- Step1:ソースバケットにバケットポリシーを設定する(アカウントA側)
- Step2:宛先アカウントのIAMユーザーにIAMポリシーをアタッチする(アカウントB側)
- Step3:aws s3 syncコマンドでデータをコピーする
- うまくいかないときのチェックリスト
- まとめ
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コンソールでの設定手順
- S3コンソールを開き、ソースバケットを選択
- 「アクセス許可」タブ →「バケットポリシー」→「編集」
- 上記の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コンソールでの設定手順
- IAMコンソールを開き、対象のIAMユーザーを選択
- 「許可を追加」→「インラインポリシーを作成」
- 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を実行
最初は権限設定の組み合わせに混乱しますが、「バケット側の許可」と「ユーザー側の許可」の両方が必要という点を押さえておくとスッキリ理解できます💡
この記事が参考になれば嬉しいです!最後まで読んでいただきありがとうございました🙌