terraform-aws-iam-identity-centerモジュールを使って、IAM Identity Centerリソースを管理してみる

terraform-aws-iam-identity-centerモジュールを使って、IAM Identity Centerリソースを管理してみる

Clock Icon2024.10.30

Terraformで効率よくAWS IAM Identity Centerリソースを定義するのはなかなか大変です。

(数が多くなりがちなaws_ssoadmin_account_assignmentを効率よく書こうとすると特に)

以下のモジュールを使うと簡単に定義できます。

aws-ia/iam-identity-center/aws | Terraform Registry

terraform-aws-iam-identity-centerとは

eks-blueprint等でおなじみの、aws-iaが管理するAWS IAM Identity Center用のTerraformモジュールです。

このモジュールは以下に対応しています。

  • Dynamic User Creation
  • Dynamic Group Creation
  • Dynamic Group Membership Creation
  • Dynamic Permission Set Creation
  • Dynamic Account Assignment Creation
  • Dynamic Reference of Existing Users
  • Dynamic Reference of Existing Groups
  • AWS Managed Policy Support
  • Customer Managed Policy Support

aws-ia/iam-identity-center/aws | Terraform Registryより引用

各種リソース作成だけではなく、既存のユーザーやグループを使った設定が可能です。

また、外部IdPで構成するパターンやインラインポリシーの利用にも対応しています。

詳しくは、examplesを確認ください。

https://github.com/aws-ia/terraform-aws-iam-identity-center/tree/main/examples

やってみた

基本的な使い方はドキュメントにサンプルコードがあります。

実践的ではないパターンかと思いますが、動作確認のため以下でリソースを作ってみます。

  • Permission Sets,GroupはReadOnlyとAdminを用意
    • Adminは既存を利用
    • ReadOnlyは新規に作成
main.tf
module "aws-iam-identity-center" {
  source = "aws-ia/iam-identity-center/aws"

  existing_sso_groups = {
    Admin : {
      group_name = "Admin"
    }
  }
  sso_groups = {
    ReadOnly : {
      group_name = "ReadOnly"
    }
  }
  existing_permission_sets = {
    AdministratorAccess : {
      permission_set_name = "AdministratorAccess"
    }
  }
  permission_sets = {
    ReadOnlyAccess = {
      description          = "Provides AWS Read only permissions.",
      session_duration     = "PT3H",
      aws_managed_policies = ["arn:aws:iam::aws:policy/ReadOnlyAccess"]
    }
  }
  account_assignments = {
    Admin : {
      principal_name = "Admin"
      principal_type = "GROUP"
      # Identity sourceがIdentity Center directoryの場合であっても、既存のグループを指定する際は「EXTERNAL」で指定する必要がある
      principal_idp   = "EXTERNAL"
      permission_sets = ["AdministratorAccess"]
      account_ids     = var.account_ids
    }
    ReadOnly : {
      principal_name  = "ReadOnly"
      principal_type  = "GROUP"
      principal_idp   = "INTERNAL"
      permission_sets = ["ReadOnlyAccess"]
      account_ids     = var.account_ids
    }
  }
}

いい感じにすっきりかけますね。

Module利用無しで書くと、aws_ssoadmin_account_assignmentを2(Group) * 2(Permission Set) * アカウント数分書く必要があります。この分だけでもかなり記述が削減できています。

existing_*で始まるInputsを使うことで、既存のGroupやPermission Setも簡単に渡せます。

注意点は既存のGroupをaccount_assignmentsに登録する際は、principal_idpEXTERNALに指定する必要がある点です。(v1.0.0時点)

これは、Identity sourceがIdentity Center directoryの場合も同様です。

Moduleのaws_ssoadmin_account_assignmentprincipa_idを見ると以下のように、principal_idpがEXTERNALの際にexisting_sso_groupsを使ってgroup_idを取得するようになっています。

INTERNALの際にはこの条件にあてはまりません。

main.tf
# 抜粋
  (each.value.principal_type == "GROUP" && each.value.principal_idp == "EXTERNAL" ? data.aws_identitystore_group.existing_sso_groups[each.value.principal_name].group_id

https://github.com/aws-ia/terraform-aws-iam-identity-center/blob/main/main.tf

existing_sso_groupsは外部IdP利用時に仕様、Identity Center directory利用の場合は、sso_groupsを使って既存があればimportするのが分かりやすいと思います。

おわりに

以前苦戦しながらIAM Identity CenterリソースをTerraformで定義しましたが、こちらのModuleを使えば簡単に定義できそうです。

https://dev.classmethod.jp/articles/iic-setting-terraform/

対応しているユースケースも多くシンプルに書けるため、IAM Identity CenterリソースをTerraformで利用する際には、こちらのモジュールの利用をご検討いただくのがおすすめです。

以上、AWS事業本部の佐藤(@chari7311)でした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.