はじめに
開発・本番環境をアカウントで分けるなど、1つのプロジェクトで複数のAWSアカウントを扱う場合があると思います。
各環境にIAMユーザを作成していると、開発者も管理者も、たくさんの認証情報を管理しなければならなくなり、大変です。
この問題を解決する手段の1つとして、クロスアカウントアクセスがあります。
これは元のアカウントにあるIAMユーザから、別のアカウントにあるIAMロールへスイッチするための設定です。
これによりIAMユーザを開発環境で一元管理できたり、スイッチロールによる容易な環境移動が実現できます。
今回の記事では、クロスアカウントアクセスの実装手順を紹介します。
前提
以下2つのAWSアカウントが存在する状態を前提とします。
- AWSアカウント1:IAMユーザを作成するアカウント、スイッチロール元環境となる
※説明のため、アカウントIDを111111111111とします - AWSアカウント2:IAMロールを作成するアカウント、スイッチロール先環境となる
※説明のため、アカウントIDを222222222222とします
今回の設定で実現できるクロスアカウントアクセスは以下のような状態になります。
※AWSアカウント1でIAMユーザにログイン後、スイッチロールによりAWSアカウント1および2のIAMロールにスイッチできる
設定の流れ
- [AWSアカウント1] IAMロールの作成
- [AWSアカウント2] IAMロールの作成
- [AWSアカウント1] IAMポリシーの作成
- [AWSアカウント1] IAMグループの作成
- [AWSアカウント1] ログイン用IAMユーザの作成
設定手順
[AWSアカウント1] IAMロールの作成
まず、アカウント1で使用するIAMロールを作成します。
権限はAWS管理のReadOnlyAccess
を使用します。
- IAM > ロール > ロールを作成
- 信頼されたエンティティを選択
信頼されたエンティティタイプ:AWSアカウント
AWSアカウント:このアカウント
- 許可を追加
"ReadOnly"で検索し、AWS管理のReadOnlyAccessを選択 - 名前、確認、および作成
ロール名:分かりやすい名前を入力(例ではrole-Account1-ReadOnly)
説明:必要があれば追加
タグ:必要があれば追加
[AWSアカウント2] IAMロールの作成
続けて、アカウント2の方でもIAMロールを作成します。
作成手順はアカウント1のものとほぼ同じですが、アカウント1からのスイッチロールを許可する設定を追加します。
- IAM > ロール > ロールを作成
- 信頼されたエンティティを選択
信頼されたエンティティタイプ:AWSアカウント
AWSアカウント:別のAWSアカウント
を選択し、アカウント1のID(今回の例では111111111111)を入力
※これ以降はアカウント1での作成手順と同じで大丈夫です。
ロール名:分かりやすい名前を入力(例ではrole-Account2-ReadOnly)
[AWSアカウント1] IAMポリシーの作成
ログインするIAMユーザに付与するIAMポリシーを作成します。
IAMユーザには上で作成した2つのロールに対し、スイッチロールを行う権限が必要になります。
※ここで作成するポリシーにはスイッチロールを行う権限のみを付与しています
- IAM > ポリシー > ポリシーを作成、を選択
JSON
を選択し、以下のポリシーを入力
※アカウントID部分と、ロール名は実際に作成したものに合わせてください。{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::111111111111:role/role-Account1-ReadOnly", "arn:aws:iam::222222222222:role/role-Account2-ReadOnly" ] } ] }
確認して作成
ポリシー名:分かりやすい名前を入力(例ではpolicy-cross-account-access)
説明:必要があれば追加
[AWSアカウント1] IAMグループの作成
これから作成するIAMユーザを所属させるグループを作成します。
グループに対し、先ほど作成したポリシーを割り当てますが、IAMユーザに他の権限(MFAの設定権限など)を付与したい場合は適宜追加してください。
- IAM > グループ > グループを作成、を選択
ユーザーグループ名:分かりやすい名前を入力(例ではgroup-cross-account-access)
ユーザーをグループに追加:※ここでは追加しません
許可ポリシーを添付:作成したIAMポリシーにチェック(例ではpolicy-cross-account-access)
[AWSアカウント1] ログイン用IAMユーザーの作成
最後にログインするためのIAMユーザを作成します。
- IAM > ユーザー > ユーザーを追加、を選択
- ユーザーの詳細を指定
ユーザー名:分かりやすい名前を入力(例ではuser-cross-account-access)
AWS マネジメントコンソールへのユーザーアクセスを提供する:チェックを入れる
コンソールパスワード:自動生成されたパスワード
ユーザーは次回のサインイン時に新しいパスワードを作成する必要があります (推奨):チェックを入れる - 許可を設定
許可のオプション:ユーザーをグループに追加
ユーザーグループ:作成したIAMグループにチェック(例ではgroup-cross-account-access) - 確認して作成
タグ:必要があれば追加
※許可にIAMUserChangePasswordが追加されていますが、ユーザーが初期パスワードを変更するためです。
設定確認
これで設定が完了しましたので、クロスアカウントアクセスを試してみます。
流れとしては、まず
AWSアカウント1のIAMユーザーにログイン
→ AWSアカウント1のIAMロールにスイッチ
次に
AWSアカウント1のIAMユーザーに戻る
→ AWSアカウント2のIAMロールにスイッチ
で確認します。
AWSアカウント1のIAMユーザーにログイン
→ AWSアカウント1のIAMロールにスイッチ
- 作成したIAMユーザーでログイン(作成時の初期パスワードでログインし、パスワードを変更)
- 右上のプルダウンから
ロールの切り替え
を選択
- ロールの切り替え画面でアカウント、ロールを入力
アカウント:AWSアカウント1のID(例では111111111111)
ロール:AWSアカウント1用に作成したロール(例ではrole-Account1-ReadOnly)
表示名:必要に応じて設定
色:必要に応じて設定(環境種別ごとに分けるとロール履歴で分かりやすくなります)
これでロールの切り替え
を押すと、アカウント1に作成したロールにスイッチできるはずです。
次にアカウント2に作成したロールに切り替えてみます。
AWSアカウント1のIAMユーザーに戻る
→ AWSアカウント2のIAMロールにスイッチ
- 右上のプルダウンから
スイッチバック
を選択
- 再度、右上のプルダウンから
ロールの切り替え
を選択 - ロールの切り替え画面でアカウント、ロールを入力
アカウント:AWSアカウント2のID(例では222222222222)
ロール:AWSアカウント2用に作成したロール(例ではrole-Account2-ReadOnly)
表示名:必要に応じて設定
色:必要に応じて設定(環境種別ごとに分けるとロール履歴で分かりやすくなります)
これでロールの切り替え
を押すと、アカウント2に作成したロールにスイッチできるはずです。
再度右上のプルダウンからアカウントIDを確認し、アカウント2のIDになっていればクロスアカウントアクセスは成功です。
スイッチロールに失敗した場合は、IAMユーザーのスイッチ権限、IAMロールの信頼されたエンティティ設定を間違えている可能性がありますので、ご確認ください。
補足
- スイッチロールを許可するpolicyをIAMグループに付与することで、開発者権限グループは開発・検証環境まで、管理者権限グループは本番環境も、といったスイッチロール先の制御が簡単になります
- ロール切り替え時の表示名や色を環境毎に設定することで、ロール履歴からのスイッチロールが分かりやすく行えるようになります
おわりに
今回はクロスアカウントアクセスの実装方法について、少し細かく書いてみました。
多くのAWSアカウントを管理する場合に、IAMユーザーの総数を減らすことができ、各種作業の手間も減らせます。
ぜひ活用してみてください。
参考
- IAMチュートリアル: AWSアカウント間のIAMロールを使用したアクセスの委任
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html - ロールの切り替え (コンソール)
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-console.html