tech.guitarrapc.cóm

Technical updates

AWS IAM Identity CenterをTerraformで構成する

前回は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コード生成・説明共に強いので、お供にするといいでしょう。

参考