📝

AWS IAM Identity Center Pipeline を試してみた

に公開

aws-samples/aws-iam-identity-center-pipeline
上記ソリューションを試してみました。

手順

Manage AWS IAM Identity Center permission sets as code by using AWS CodePipeline - AWS Prescriptive Guidance
デプロイ手順は上記ドキュメントで紹介されている通りです。
前提条件はすべて満たした状態です。

01. リポジトリのクローン

$ git clone https://github.com/aws-samples/aws-iam-identity-center-pipeline.git

上記 GitHub リポジトリを任意の環境にクローンします。
今回は Cloud9 環境にクローンしました。
この時点では Organizations の管理アカウントや IAM Identity Center の委任アカウントなど、どのアカウントでの作業でも問題ありません。

02. アクセス権限セットの定義

クローンしたリポジトリで templates/permissionsets フォルダのファイルを編集してアクセス権限セットを定義します。
デフォルトでは以下のファイルが存在しています。

templates/
└── permissionsets/
    ├── AWSAdministrator.json
    ├── DatabaseAdministrator.json
    ├── NetworkAdministrator.json
    ├── OperationEngineer.json
    ├── ProductOwner.json
    ├── ProductionAccess.json
    └── SecurityEngineer.json

上記ファイルから必要なアクセス権限セットのファイルだけを残し、不要なファイルは削除します。
今回は AWSAdministrator.json のみを残しました。
AWSAdministrator.json の内容はデフォルトのまま使用します。

AWSAdministrator.json
{
    "Name": "AWSAdministrator",
    "Description": "Admin in AWS.",
    "SessionDuration": "PT4H",
    "ManagedPolicies": [
        "arn:aws:iam::aws:policy/AdministratorAccess"
    ]
}

03. 割り当ての定義

templates/assignments/iam-identitycenter-assigments.json を編集してどのアカウントにアクセス権限セットを割り当てるのかを定義します。

デフォルトでは Assignments に複数の割り当てが定義されていますが、必要な割り当てのみ定義してその他の定義は削除しました。
今回は 1 つのアカウントにのみ割り当てるように設定しました。

iam-identitycenter-assigments.json
{
    "Assignments": [
        {
            "SID": "Specificaccounts",
            "Target": [
                "dev:012345678901"
            ],
            "PrincipalType": "GROUP",
            "PrincipalId": "test",
            "PermissionSetName": "AWSAdministrator"
        }
    ]
}

04. iam-identitycenter-pipeline.yaml をデプロイ

IAM Identity Center の委任管理アカウントで iam-identitycenter-pipeline.yaml をデプロイします。
パラメータには以下の内容を指定しました。

  • nameConvention: デフォルト値
  • s3NameConvention: デフォルト値
  • mgmtAccountId: AWS Organizations の管理アカウント ID
  • cwLGRetentionInDays: デフォルト値
  • codeBuildErrorEmailAddress: 通知可能なメールアドレス
  • fullRepositoryId: 作成済みの GitHub リポジトリ
    • username/repository-name の形式で指定
  • providerType: デフォルト値

数分でデプロイ完了します。

05. iam-identitycenter-organization.yaml をデプロイ

AWS Organizations の管理アカウントのバージニア北部リージョンで iam-identitycenter-organization.yaml をデプロイします。

パラメータには以下の内容を指定しました。

  • nameConvention: デフォルト値
  • identityCenterAccountNameConvention: デフォルト値
  • identityCenterAccountId: IAM Identity Center の委任管理アカウント ID
  • pipelineRegion: ap-northeast-1

数分でデプロイ完了します。

06. AWS CodeConnections のステータス更新

iam-identitycenter-organization.yaml のデプロイ完了後、IAM Identity Center の委任管理アカウント側で CodeConnections のステータスを更新します。

iam-identitycenter-organization.yaml をデプロイする際に指定した pipelineRegion で CodeCommit コンソールを開き、左ペインから「接続」をクリックします。

「iam-idc-repository」をクリックします。

「保留中の接続を更新」をクリックします。

iam-identitycenter-pipeline.yaml をデプロイする際に指定した fullRepositoryId の GitHub リポジトリに接続します。

接続後にステータスが「利用可能」になれば更新完了です。

07. GitHub リポジトリにプッシュ

上述の 02, 03 の手順で編集したファイルを含む aws-iam-identity-center-pipeline のディレクトリを fullRepositoryId の GitHub リポジトリの main ブランチへプッシュします。
プッシュ先のブランチは必ず main ブランチである必要があります。

08 CodePipeline の実行履歴確認 (エラー発生)

07 でのプッシュによって、IAM Identity Center の委任管理アカウントの CodePipeline が実行されますが、CodeBuild のビルドで以下のエラーが発生しました。

[Container] 2025/04/30 12:21:04.115024 Running command wget https://releases.hashicorp.com/terraform/1.7.5/terraform_1.10.4_linux_amd64.zip
--2025-04-30 12:21:04--  https://releases.hashicorp.com/terraform/1.7.5/terraform_1.10.4_linux_amd64.zip
Resolving releases.hashicorp.com (releases.hashicorp.com)... 3.165.39.26, 3.165.39.106, 3.165.39.6, ...
Connecting to releases.hashicorp.com (releases.hashicorp.com)|3.165.39.26|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2025-04-30 12:21:06 ERROR 404: Not Found.

Terraform でのデプロイを行うために特定のバージョンのソースを取得しようとしていますが、存在しないバージョンを取得しようとした結果エラーになっています。
そのため、iam-idc-assignments という CodeBuild プロジェクトのビルドコマンドを手動で変更しました。

version: 0.2
phases:
  install:
    commands:
      - echo "[INFO] [INSTALL] Installing dependencies"
      - wget https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip # 変更箇所
      - unzip terraform_*_linux_amd64.zip -d /usr/bin/
      - chmod +x /usr/bin/terraform
      - echo "[INFO] [INSTALL] Installing finished"                    
    finally:
      - terraform --version
  build:
    commands:
      - echo "[INFO] [BUILD] Starting Assignments stage"
      - cd source/assignments/
      - chmod +x iam-identitycenter-assignments.py
      - python3 iam-identitycenter-assignments.py --mgmt_account $MGMT_ACCOUNT
      - terraform init -backend-config="bucket=$TERRAFORM_STATE" -backend-config="key=assignments.tfstate" -backend-config="region=$REGION" 
      - terraform plan
      - terraform apply -auto-approve

09 委任管理アカウントで IAM ロールを作成

Organizations の管理アカウントに CloudFormation でデプロイされたリソースのうち、
iam-identitycenter-moveou-trigger という Lambda 関数があります。
この関数は主に以下のフローで実行されます。

  • EventBridge ルールで CloudTrail の MoveAccount イベントを検知
  • EventBridge ルールから Lambda が実行される
  • Lambda から委任管理アカウントに AssumeRole
  • 委任管理アカウントの CodePipeline を実行

ここで、Lambda の環境変数を確認すると以下の環境変数が定義されていることを確認できます。

  • IC_ROLE: arn:aws:iam::012345678901:role/iam-identitycenter-pipelinetrigger-write

上記環境変数に定義された IAM ロールに AssumeRole する想定だと思われますが、委任管理アカウント側には iam-identitycenter-pipelinetrigger-write という IAM ロールは作成されていませんでした。
そのため、委任管理アカウントに iam-identitycenter-pipelinetrigger-write という名前の IAM ロールを明示的に作成する必要があります。

今回は以下の設定で作成しました。

  • ロール名: iam-identitycenter-pipelinetrigger-write
  • 信頼アカウント: AWS Organizations の管理アカウント ID
  • 権限: AdministratorAccess

10. 管理アカウントで CloudTrail の証跡を作成

上述の Lambda を実行するために管理アカウントのバージニア北部リージョンには iam-identitycenter-moveaccount-trigger という EventBridge ルールが作成されています。
イベントパターンは以下の通り、Organizations の MoveAccount イベント検知する定義です。

{
  "detail-type": ["AWS API Call via CloudTrail"],
  "source": ["aws.organizations"],
  "detail": {
    "eventSource": ["organizations.amazonaws.com"],
    "eventName": ["MoveAccount"]
  }
}

しかし、CloudTrail のイベントを検知するためには CloudTrail で管理イベントを記録する証跡を作成する必要があります。
AWS service events delivered via AWS CloudTrail - Amazon EventBridge

To record events with one of the CloudTrail detail-type values, you must enable a CloudTrail trail with logging.

そのため、管理アカウント側ですべての管理イベントを記録する証跡を作成しました。
Creating a trail with the CloudTrail console - AWS CloudTrail

11. 管理アカウント側で Lambda の環境変数を変更

ここまでの手順で Lambda の実行はできますが、実行時に以下のエラーが発生しました。

[ERROR] PipelineNotFoundException: An error occurred (PipelineNotFoundException) when calling the StartPipelineExecution operation: Pipeline with name iam-identitycenter-pipeline does not exist in account 012345678901.

委任管理アカウントに iam-identitycenter-pipeline という名前のパイプラインが存在しないというエラーです。
Lambda の環境変数を確認すると、以下の環境変数が定義されていました。

  • PIPELINE_NAME: iam-identitycenter-pipeline

一方、委任管理アカウントに作成されたパイプラインの名前は iam-idc-pipeline でした。
そのため、上記環境変数の値を iam-idc-pipeline に変更しました。

12. アカウントを移動させてみる

Organizations の管理アカウント側で Organizations コンソールからアカウントを別の OU に移動して動作確認します。
移動させるアカウントは手順 03 で指定したアカウントです。
今回は手順 03 で OU を指定していないので移動元、移動先の OU は任意です。

OU の移動後、パイプラインが実行されて IAM Identity Center で許可セットの作成とアカウントへの関連付けが行われます。



全体のフローとしては以下の通りです。

  1. ユーザーが Organizations でアカウントを移動させる
  2. EventBridge が Organizations の MoveAccount イベント検知して Lambda を実行
  3. Lambda は委任管理アカウントの IAM ロールに AssumeRole してパイプラインを実行
  4. パイプラインで IAM Identity Center の許可セット作成およびアカウントへのプロビジョニングを実行

まとめ

今回は AWS IAM Identity Center Pipeline を試してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion