概要
複数の AWS アカウントを運用している場合、開発者用アカウントのユーザーに本番環境アカウントの特定リソースへのアクセス権を付与することができます。 これは単にアカウント切り替えの手間が減るという話ではなく、クロスアカウントアクセスを実現する方法がいくつか存在する中で最小権限の原則に基づいてセキュアな手法です。
本記事では、AssumeRole を使ったクロスアカウントアクセスの設定方法と、最小権限を実現するためのポイントを解説します。
クロスアカウントアクセスが必要な理由
アカウント分離の重要性
そもそもなぜ、アカウントを分離するのかという話です。 複数の AWS アカウントを運用することで、以下のようなメリットがあります。
- 環境の分離: 開発環境、ステージング環境、本番環境を物理的に分離
- セキュリティの強化: 一つのアカウントが侵害されても、他のアカウントへの影響を最小化
- コスト管理: 環境ごとのコストを明確に把握
- 権限管理: 環境ごとに適切な権限を設定
AWS においてはアカウントを分けることで実際にシステムが稼働する本番環境と検証やステージングとして利用する開発環境を分離するパターンを多く見かけます。
VPCで分けるパターンや、全く分けないというパターンもありますが制約がないのであればアカウントを分けてしまうのがオペミスによって本番リソースに悪影響を与えるリスクが減るので分離する方が安全かと私は考えています。
クロスアカウントアクセスの必要性
アカウントを分離すると、開発者は、両方のリソースにアクセスする必要性が出てきます。 異なるアカウントにアクセスする方法としては IAM ユーザを両方のアカウントに作成する方法が一番最初に思いつくものかと思いますがそれにもデメリットがあります。
- IAM ユーザーを本番アカウントに作成: 管理するIAMユーザが増える
- AssumeRole を使用: 一時的な認証情報を使用し、最小権限でアクセス可能
アクセス権付与方法の比較
方法 1: アカウントB(本番環境)に IAM ユーザーを作成
アカウントB(本番環境)に直接 IAM ユーザーを作成し、アクセス権を付与する方法です。 一見シンプルで良いですがデメリットも存在します。
デメリット
- ユーザー管理が複雑になる(複数アカウントでIAMユーザーを管理する必要がある)
- 長期的な認証情報を保持する必要がある
- アカウント間での権限管理が分散する
利用しないIAMユーザが長期間残るということはセキュリティ監査的にも良くないです。(使わないポートが開きっぱなしになっているような感覚)
方法 2: AssumeRole を使用(推奨)
アカウントA(開発環境)の IAM ユーザーが、アカウントB(本番環境)の IAM ロールを引き受ける(AssumeRole)方法です。
アカウントA にログインしている IAM ユーザがアカウントBの IAM ロールを使い、アカウントB 内のリソースにアクセスする方式です。 アカウントB 側の IAM ロールで許可された権限のみを持つことになるため IAM ユーザを使う方法と比べてセキュアなアクセス方法になります。
メリット
- 最小権限の実現: 必要なリソースへのアクセスのみを許可
- 一時的な認証情報: セッション期間中のみ有効な認証情報を使用
- 一元管理: アカウントA(開発環境)でユーザーを管理し、アカウントB(本番環境)ではロールのみを管理
- 監査証跡: CloudTrail で誰がいつどのロールを引き受けたかを追跡可能
スイッチロールの設定実施
前提条件
2アカウントを用意して検証します。
- アカウントA(開発環境): 開発者が所属するアカウント
- アカウントB(本番環境): 本番環境のリソースが存在するアカウント

アカウントB で IAM ロールを作成
アカウントB で開発者が引き受けるための IAM ロールを作成します。
アカウントBロール作成
アカウントA(開発環境)の IAM ユーザーのAssumeRole を許可するポリシーを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "<アカウントAのIAMユーザARN>"
},
"Action": "sts:AssumeRole"
}
]
}
アカウントAのIAMユーザがアカウントBのIAMロールを引き受けることを許可する信頼ポリシーを作成しました。

アクセス許可はS3へのフルアクセスを設定しておきます。

アカウントA で IAM ポリシーを作成
アカウントA(開発環境)の IAM ユーザーに、アカウントB(本番環境)のロールを引き受ける権限を付与します。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "<アカウントBで作成したIAMロールのARN>"
}
]
}
対象のIAMユーザにポリシーを追加します。
今回はユーザに直接ポリシーをアタッチしますが、通常であればIAMユーザグループを作成しグループにポリシーを付与した方が運用が楽です。

スイッチロールの実行
マネジメントコンソールからスイッチロールを実行し、設定の確認をします。
アカウントA にログイン
アカウントA(開発環境)のマネジメントコンソールにログインします。

アカウント切り替え
右上のアカウント名をクリックし、「ロールに切り替え」を選択します。

以下の情報を入力します。
- アカウントID: アカウントB(本番環境)のアカウントID
- ロール名:
アカウントBに作成したロールのARN - 表示名: 任意の表示名(例:
AccountB)
「ロールに切り替え」をクリックします。

確認
右上のアカウント名が変更され、アカウントB のリソースにアクセスできるようになります。

アカウントBでは、S3へのアクセスのみ許可しているため、ダッシュボード上でアクセス拒否が出ています。
S3のリソースはこのIAMロールで許可されているため操作可能です。

試験での出題ポイント
クロスアカウントアクセスに関する問題では、以下の点が問われることが多いです:
- 「セキュアなアクセス権付与方法」 → AssumeRole を使用
- 「最小権限の原則」 → 必要なリソースへのアクセスのみを許可するアクセスポリシー
- 「信頼ポリシーとアクセスポリシーの違い」 → 信頼ポリシーは「誰が引き受けられるか」、アクセスポリシーは「何にアクセスできるか」
問題文で「最小権限」「セキュアな方法」などのキーワードが出てきた場合は、AssumeRole を使用した方法が正解になることが多いです。
「アカウント A(開発環境)のユーザーにアカウント B(本番環境)のリソースへのアクセス権を付与」という要件がある場合、AssumeRole を使った方法が最も適切です。
設定方法について問われることもあるので、どちらのアカウントで何の設定が必要なのかは覚えておきましょう。
まとめ
複数の AWS アカウントを運用している場合、クロスアカウントアクセスを実現するには、AssumeRole を使用した方法が最もセキュアです。
最小権限の原則に基づいて、信頼ポリシーで「誰が引き受けられるか」を制限し、アクセスポリシーで「何にアクセスできるか」を最小限に設定することで、セキュリティを強化できます。
アカウント A(開発環境)でユーザーを一元管理し、アカウント B(本番環境)ではロールのみを管理することで、運用の複雑さを軽減しながら、適切なアクセス制御を実現できます。


コメント