これは何?

AWS Organizations の OU にアカウントを所属させたらそれをトリガーとして AWS CloudFormation StackSets が動くことにより自動で IAM ロールを作成させる仕組みを試したのでその手順を記載した記事です!

SaaS とのインテグレーションをするというケースで AWS アカウントに一つずつ特定の IAM ロールが必要になるというケースはよくあるかと思いますのでそういった場合で利用できると思います😆

構成図

理解しやすくなると思うので最終的な状態の構成図を先に見ていただきます😌

登場する主な AWS サービスについて

  • AWS Organizations
  • CloudFormation StackSets
  • IAM

手順について説明

  • AWS Organizations をすでに利用していることを想定しています。
  • 登場人物となる AWS アカウントは以下です。
    • 管理アカウント
    • メンバーアカウント A
    • メンバーアカウント B
  • メンバーアカウント A, B を「Workloads」という OU に所属させるタイミングで IAM ロールが自動で作成されるという仕組みを作ります。

手順

【事前準備】 IAM ロールを作成する CloudFormation テンプレート (yaml) の用意

IAM ロールを作成する CloudFormation テンプレート を事前に用意します。
今回は以下の yaml を使います。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  DeployRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName : 'hirata-readonly-auto-create-role'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              AWS: 'arn:aws:iam::[許可する AWS アカウント]:root'
            Action: 'sts:AssumeRole'
            Condition: 
              StringEquals:
                sts:ExternalId: '[外部 ID]'
      ManagedPolicyArns: 
        - 'arn:aws:iam::aws:policy/ReadOnlyAccess'

内容を簡単に箇条書きで説明します。
– 信頼されたエンティティとして AWS アカウントを選択し、オプションとして外部 ID の要求をする
– 許可ポリシーとしてはマネージドポリシー「ReadOnlyAccess」を指定する

【事前準備】 CloudFormation で AWS Organizations で信頼されたアクセスを有効化

※ 以降の作業は AWS Organizations 管理アカウント で実行します

管理アカウントの AWS マネジメントコンソールで以下のように画面遷移します。
[CloudFormation] > [StackSets]

以下のようなメッセージが出ているため、[信頼されたアクセスを有効にする] を押下します。

これにより何が実行されるかというと、CloudFormation StackSets を AWS Organizations 内で利用するために管理アカウントとメンバーアカウントで IAM ロールが作成されます。

詳細は以下の公式ドキュメントを参照ください。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-orgs-activate-trusted-access.html?icmpid=docs_cfn_console

※ この手順の作業は AWS Organizations の管理アカウント上で一度だけ実施するものです。

CloudFormation StackSets 作成

管理アカウントの AWS マネジメントコンソールで以下のように画面遷移します。
[CloudFormation] > [StackSets]

[StackSet を作成] を押下します。

テンプレートの選択」のステップでは以下のように設定をします。

項目名 備考欄
アクセス許可 サービスマネージドアクセス許可
前提条件 テンプレートの準備完了
テンプレートの指定 テンプレートファイルのアップロード ※ 事前準備で用意した yaml ファイルをアップロードする

StackSet の詳細を指定」のステップでは以下のように設定します。

項目名 備考欄
StackSet 名 [任意の StackSet 名]

※ 他の項目はオプションのため割愛します。

StackSet オプションの設定」のステップではデフォルトとします。

デプロイオプションの設定」のステップでは以下のように設定します。

項目名 備考欄
スタックセットにスタックを追加 新しいスタックのデプロイ
デプロイターゲット 組織単位 (OU) へのデプロイ
AWS OU ID [OU : Workloads の OU ID]

項目名 備考欄
リージョンの指定 ap-northeast-1

※ 他の項目はオプションのため割愛します。

レビュー画面で設定を確認します。
その際に一番最後でテンプレート内に IAM に関するリソースが含まれることについての承認項目があるのでチェックを入れます。

CloudFormation StackSets の作成を実行したらオペレーションタブでステータスが「SUCCEEDED」になっていることを確認します。

これで CloudFormation StackSets の作成が完了しました😆

メンバーアカウント A, B を OU : Workloads に移動させることで CloudFormation StackSets が動き IAM ロールが作成されることを確認する

AWS Organizations の 「AWS アカウント」の操作画面でメンバーアカウント A, B を OU : Workloads に移動させます。

メンバーアカウント A, B が OU : Workloads に移動されたことを確認します。

この操作をトリガーとして先ほど設定した CloudFrotamtion StackSets が動き、各メンバーアカウントで CloudFormation スタックが作成されることによって IAM ロールが作成されるので、
例としてメンバーアカウント A を確認します。

メンバーアカウント A で以下のように画面遷移します。
[CloudFormation] > [スタック]

先ほど設定した CloudFrotamtion StackSets の名前をプレフィックスとしたスタックが作成されています。
スタック作成直後はステータスが「CREATE_IN_PROGRESS」です。

スタックの処理が完了してステータスが「CREATE_COMPLETE」になることを確認したらスタック名を押下して詳細を確認します。

スタックの詳細ページで「テンプレート」のタブを押下すると事前準備で作成した CloudFormation テンプレートの yaml が確認できます。

今回の最終的な目的である IAM ロール作成が実際にされているかを確認します。
メンバーアカウント A で IAM ロール確認画面から CloudFormation テンプレートで指定した IAM ロールが作成されていることを確認します。
以下が実際に作成された IAM ロールです。

許可ポリシー」タブ
許可ポリシーとしてはマネージドポリシー「ReadOnlyAccess」を指定されていることを確認します。

信頼されたエンティティ」タブ
信頼されたエンティティとして AWS アカウントを選択し、オプションとして外部 ID の要求をする設定ができていることを確認します。

意図した IAM ロールが作成されていることを確認できました😆

最後に

AWS Organizations を利用すれば今回の記事のように複数の AWS アカウントを利用している環境の効率化ができます。
アイレットでは AWS Organizations が利用できる AWS 請求代行サービス が提供できますので是非ご覧ください。
https://cloudpack.jp/lp/aws-organizations/

記事をご覧いただきありがとうございました!