terraform-aws-iam-identity-centerモジュールを使って、IAM Identity Centerリソースを管理してみる
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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を確認ください。
やってみた
基本的な使い方はドキュメントにサンプルコードがあります。
実践的ではないパターンかと思いますが、動作確認のため以下でリソースを作ってみます。
- Permission Sets,GroupはReadOnlyとAdminを用意
- Adminは既存を利用
- ReadOnlyは新規に作成
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_idpをEXTERNALに指定する必要がある点です。(v1.0.0時点)
これは、Identity sourceがIdentity Center directoryの場合も同様です。
Moduleのaws_ssoadmin_account_assignmentのprincipa_idを見ると以下のように、principal_idpがEXTERNALの際にexisting_sso_groupsを使ってgroup_idを取得するようになっています。
INTERNALの際にはこの条件にあてはまりません。
# 抜粋
(each.value.principal_type == "GROUP" && each.value.principal_idp == "EXTERNAL" ? data.aws_identitystore_group.existing_sso_groups[each.value.principal_name].group_id
existing_sso_groupsは外部IdP利用時に仕様、Identity Center directory利用の場合は、sso_groupsを使って既存があればimportするのが分かりやすいと思います。
おわりに
以前苦戦しながらIAM Identity CenterリソースをTerraformで定義しましたが、こちらのModuleを使えば簡単に定義できそうです。
対応しているユースケースも多くシンプルに書けるため、IAM Identity CenterリソースをTerraformで利用する際には、こちらのモジュールの利用をご検討いただくのがおすすめです。
以上、AWS事業本部の佐藤(@chari7311)でした。






