前回はPulumiを使ってAWS IAM Access Identityを構成しました。 Terraformで同じことをやってみましょう。
どのような構成にするのか
全体構成は前回と同様です。Terraformで組む時もPulumiで構成したときと同じことに注意を払います。
- グループと権限セットはアカウントごとに分ける
- 管理アカウントで一括管理
- TOTP送信を有効にしておく
TerraformでAWS IAM Access Identityを構成する
スクラッチで書いてもいいのですが、aws-ia/terraform-aws-iam-identity-centerがいい感じの作りになっているので、今回はこれを使います。
module "aws-iam-identity-center" { source = "aws-ia/iam-identity-center/aws" version = "1.0.2" // Create desired GROUPS in IAM Identity Center sso_groups = { master_Admin : { group_name = "master_Admin" group_description = "Admin IAM Identity Center Group" }, master_ViewOnly : { group_name = "master_ViewOnly" group_description = "ReadOnly IAM Identity Center Group" }, serviceA_Admin : { group_name = "serviceA_Admin" group_description = "Admin IAM Identity Center Group" }, serviceA_ViewOnly : { group_name = "serviceA_ViewOnly" group_description = "ReadOnly IAM Identity Center Group" }, } // Create desired USERS in IAM Identity Center sso_users = { foo : { group_membership = ["master_Admin", "serviceA_Admin"] user_name = "foo@example.com" given_name = "Foo" family_name = "Example" email = "foo@example.com" }, suchiha : { group_membership = ["master_ViewOnly", "serviceA_ViewOnly"] user_name = "bar@example.com" given_name = "Bar" family_name = "Baz" email = "bar@example.com" }, } // Create permissions sets backed by AWS managed policies permission_sets = { master_Admin = { description = "Provides AWS full access permissions.", session_duration = "PT8H", aws_managed_policies = ["arn:aws:iam::aws:policy/AdministratorAccess"] }, master_ViewOnly = { description = "Provides AWS view only permissions.", session_duration = "PT8H", aws_managed_policies = ["arn:aws:iam::aws:policy/job-function/ViewOnlyAccess"] }, serviceA_Admin = { description = "Provides AWS full access permissions.", session_duration = "PT8H", aws_managed_policies = ["arn:aws:iam::aws:policy/AdministratorAccess"] }, serviceA_ViewOnly = { description = "Provides AWS view only permissions.", session_duration = "PT8H", aws_managed_policies = ["arn:aws:iam::aws:policy/job-function/ViewOnlyAccess"] }, } // Assign users/groups access to accounts with the specified permissions account_assignments = { master_Admin : { principal_name = "master_Admin" principal_type = "GROUP" principal_idp = "INTERNAL" permission_sets = ["mater_Admin"] account_ids = [ "111111111111", // replace with your desired account id ] }, master_ViewOnly : { principal_name = "master_ViewOnly" principal_type = "GROUP" principal_idp = "INTERNAL" permission_sets = ["master_ViewOnly"] account_ids = [ "111111111111", ] }, serviceA_Admin : { principal_name = "serviceA_Admin" principal_type = "GROUP" principal_idp = "INTERNAL" permission_sets = ["serviceA_Admin"] account_ids = [ "222222222222", // replace with your desired account id ] }, serviceA_ViewOnly : { principal_name = "serviceA_ViewOnly" principal_type = "GROUP" principal_idp = "INTERNAL" permission_sets = ["serviceA_ViewOnly"] account_ids = [ "222222222222", ] }, } }
まとめ
Terraformだとパブリックモジュールを使って実装を余り気にせず構成できます。 パブリックなTerraformのリモートモジュールは状況によって破壊的変更を伴うケースがあるため、実際の運用では、これをベースにローカルモジュールとして用意しつつ一部調整していますが割愛します。 多くのリモートモジュールは、作者の使い勝手に特価しているのでむやみと採用はできません。しかし、多くのモジュールは調整しやすい作りや工夫がこらされており1、コードリーディングで学びつつ使うといいでしょう。
AIはTerraformコード生成・説明共に強いので、お供にするといいでしょう。
参考
- aws-ia/terraform-aws-iam-identity-center | GitHub
- aws_ssoadmin_managed_policy_attachment | Resources | hashicorp/aws | Terraform | Terraform Registry
- IAM Identity Center ユーザーで Terraform を使う
- IAM Identity CenterのGoogle Workspace連携における制限をTerraformでいい感じに管理する
- variablesやlocalsは工夫が垣間見えます。terraform-aws-iam-identity-center/variables.tf at main · aws-ia/terraform-aws-iam-identity-center↩