terraform-aws-iam-identity-centerモジュールを使って、IAM Identity Centerリソースを管理してみる
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)でした。