Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

【AWS】クロスアカウントスイッチロールの設定

はじめに

開発・本番環境をアカウントで分けるなど、1つのプロジェクトで複数のAWSアカウントを扱う場合があると思います。
各環境にIAMユーザを作成していると、開発者も管理者も、たくさんの認証情報を管理しなければならなくなり、大変です。

この問題を解決する手段の1つとして、クロスアカウントアクセスがあります。
これは元のアカウントにあるIAMユーザから、別のアカウントにあるIAMロールへスイッチするための設定です。
これによりIAMユーザを開発環境で一元管理できたり、スイッチロールによる容易な環境移動が実現できます。

クロスアカウントアクセスのイメージ、1つのユーザーにログインし、各環境へはスイッチロールで移動する

今回の記事では、クロスアカウントアクセスの実装手順を紹介します。

前提

以下2つのAWSアカウントが存在する状態を前提とします。

  • AWSアカウント1:IAMユーザを作成するアカウント、スイッチロール元環境となる
    ※説明のため、アカウントIDを111111111111とします
  • AWSアカウント2:IAMロールを作成するアカウント、スイッチロール先環境となる
    ※説明のため、アカウントIDを222222222222とします

今回の設定で実現できるクロスアカウントアクセスは以下のような状態になります。
今回実装するクロスアカウントアクセスのイメージ、アカウント1のユーザにログインし、アカウント1,2のロールにスイッチする

※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を使用します。

  1. IAM > ロール > ロールを作成
  2. 信頼されたエンティティを選択
    信頼されたエンティティタイプを選択している
    AWSアカウントを選択している
    信頼されたエンティティタイプ:AWSアカウント
    AWSアカウント:このアカウント
  3. 許可を追加
    許可ポリシーを検索し、ポリシーにチェックを入れている
    "ReadOnly"で検索し、AWS管理のReadOnlyAccessを選択
  4. 名前、確認、および作成
    ロール名を入力している
    ロール名:分かりやすい名前を入力(例ではrole-Account1-ReadOnly)
    説明:必要があれば追加
    タグ:必要があれば追加

[AWSアカウント2] IAMロールの作成

続けて、アカウント2の方でもIAMロールを作成します。
作成手順はアカウント1のものとほぼ同じですが、アカウント1からのスイッチロールを許可する設定を追加します。

  1. IAM > ロール > ロールを作成
  2. 信頼されたエンティティを選択
    AWSアカウントで別のAWSアカウントを選択し、アカウントIDにアカウント1のIDを入力している
    信頼されたエンティティタイプ:AWSアカウント
    AWSアカウント:別のAWSアカウントを選択し、アカウント1のID(今回の例では111111111111)を入力
    ※これ以降はアカウント1での作成手順と同じで大丈夫です。
    ロール名:分かりやすい名前を入力(例ではrole-Account2-ReadOnly)

[AWSアカウント1] IAMポリシーの作成

ログインするIAMユーザに付与するIAMポリシーを作成します。
IAMユーザには上で作成した2つのロールに対し、スイッチロールを行う権限が必要になります。
※ここで作成するポリシーにはスイッチロールを行う権限のみを付与しています

  1. IAM > ポリシー > ポリシーを作成、を選択
  2. 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"
                 ]
             }
         ]
     }
    
  3. 確認して作成
    ポリシー名を入力している
    ポリシー名:分かりやすい名前を入力(例ではpolicy-cross-account-access)
    説明:必要があれば追加

[AWSアカウント1] IAMグループの作成

これから作成するIAMユーザを所属させるグループを作成します。
グループに対し、先ほど作成したポリシーを割り当てますが、IAMユーザに他の権限(MFAの設定権限など)を付与したい場合は適宜追加してください。

  1. IAM > グループ > グループを作成、を選択
    ユーザーグループ名を入力している
    許可ポリシーを添付、で作成したポリシーを選択している
    ユーザーグループ名:分かりやすい名前を入力(例ではgroup-cross-account-access)
    ユーザーをグループに追加:※ここでは追加しません
    許可ポリシーを添付:作成したIAMポリシーにチェック(例ではpolicy-cross-account-access)

[AWSアカウント1] ログイン用IAMユーザーの作成

最後にログインするためのIAMユーザを作成します。

  1. IAM > ユーザー > ユーザーを追加、を選択
  2. ユーザーの詳細を指定
    IAMユーザー名を入力し、オプションにチェックを入れている
    コンソールパスワードやオプションを選択している
    ユーザー名:分かりやすい名前を入力(例ではuser-cross-account-access)
    AWS マネジメントコンソールへのユーザーアクセスを提供する:チェックを入れる
    コンソールパスワード:自動生成されたパスワード
    ユーザーは次回のサインイン時に新しいパスワードを作成する必要があります (推奨):チェックを入れる
  3. 許可を設定
    許可のオプション、ユーザーグループを選択している
    許可のオプション:ユーザーをグループに追加
    ユーザーグループ:作成したIAMグループにチェック(例ではgroup-cross-account-access)
  4. 確認して作成
    タグ:必要があれば追加
    ※許可にIAMUserChangePasswordが追加されていますが、ユーザーが初期パスワードを変更するためです。

設定確認

これで設定が完了しましたので、クロスアカウントアクセスを試してみます。
流れとしては、まず
AWSアカウント1のIAMユーザーにログインAWSアカウント1のIAMロールにスイッチ

次に
AWSアカウント1のIAMユーザーに戻るAWSアカウント2のIAMロールにスイッチ

で確認します。

AWSアカウント1のIAMユーザーにログインAWSアカウント1のIAMロールにスイッチ

  1. 作成したIAMユーザーでログイン(作成時の初期パスワードでログインし、パスワードを変更)
  2. 右上のプルダウンからロールの切り替えを選択
    ロールの切り替えボタンを選択している
  3. ロールの切り替え画面でアカウント、ロールを入力
    ロールの切り替え画面でロール情報を入力している
    アカウント:AWSアカウント1のID(例では111111111111)
    ロール:AWSアカウント1用に作成したロール(例ではrole-Account1-ReadOnly)
    表示名:必要に応じて設定
    色:必要に応じて設定(環境種別ごとに分けるとロール履歴で分かりやすくなります)

これでロールの切り替えを押すと、アカウント1に作成したロールにスイッチできるはずです。

次にアカウント2に作成したロールに切り替えてみます。

AWSアカウント1のIAMユーザーに戻るAWSアカウント2のIAMロールにスイッチ

  1. 右上のプルダウンからスイッチバックを選択
    スイッチバックのボタンを選択している
  2. 再度、右上のプルダウンからロールの切り替えを選択
  3. ロールの切り替え画面でアカウント、ロールを入力
    ロールの切り替え画面でアカウント2のロール情報を入力している
    アカウント:AWSアカウント2のID(例では222222222222)
    ロール:AWSアカウント2用に作成したロール(例ではrole-Account2-ReadOnly)
    表示名:必要に応じて設定
    色:必要に応じて設定(環境種別ごとに分けるとロール履歴で分かりやすくなります)

これでロールの切り替えを押すと、アカウント2に作成したロールにスイッチできるはずです。

再度右上のプルダウンからアカウントIDを確認し、アカウント2のIDになっていればクロスアカウントアクセスは成功です。

スイッチロールに失敗した場合は、IAMユーザーのスイッチ権限、IAMロールの信頼されたエンティティ設定を間違えている可能性がありますので、ご確認ください。

補足

  • スイッチロールを許可するpolicyをIAMグループに付与することで、開発者権限グループは開発・検証環境まで、管理者権限グループは本番環境も、といったスイッチロール先の制御が簡単になります
  • ロール切り替え時の表示名や色を環境毎に設定することで、ロール履歴からのスイッチロールが分かりやすく行えるようになります

おわりに

今回はクロスアカウントアクセスの実装方法について、少し細かく書いてみました。
多くのAWSアカウントを管理する場合に、IAMユーザーの総数を減らすことができ、各種作業の手間も減らせます。
ぜひ活用してみてください。

参考

  1. IAMチュートリアル: AWSアカウント間のIAMロールを使用したアクセスの委任
    https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html
  2. ロールの切り替え (コンソール)
    https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-console.html