Upgrade to Pro — share decks privately, control downloads, hide ads and more …

シンプルな設定ファイルで実現する AWS IAM Identity Center の ユーザー...

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →

シンプルな設定ファイルで実現する AWS IAM Identity Center の ユーザー管理Terraformフレームワークを公開しました / Simplifying AWS IAM Identity Center User Management: An Open-Source Terraform Framework

シンプルな設定ファイルで、AWS IAM Identity Centerのユーザー・権限管理を効率化する、オープンソースのTerraformフレームワークを紹介します。

200名以上の開発者と160以上のAWSアカウントを管理する現場での経験をもとに、日々の権限変更を設定ファイルの編集だけで完結させる仕組みを解説。フレームワークの設計に加え、レビューしやすいTerraform Planの工夫や、AIによる設定変更支援を通じて、運用負荷を削減する方法を紹介します。

GitHub: https://github.com/yamaguchi-tk/idc-terraform-framework

---

Simplify AWS IAM Identity Center user and access management with an open-source Terraform framework.

Based on experience managing over 200 developers and more than 160 AWS accounts, this talk shows how simple configuration files can streamline everyday access changes. It covers the framework’s design, readable Terraform plans for easier reviews, and AI-assisted updates to reduce operational overhead.

GitHub: https://github.com/yamaguchi-tk/idc-terraform-framework

Avatar for Takashi Yamaguchi

Takashi Yamaguchi

October 24, 2026

More Decks by Takashi Yamaguchi

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 ⽒名:⼭⼝隆史(やまぐちたかし) 所属:株式会社エス・エム・エス プロダクト推進本部 技術推進グループ 業務:全社SREとしての活動 略歴:フリーランス、SIer、Web系を渡り歩く→現職(2024/05〜) ⾃称:Security Hub芸⼈ 通称:千葉⽀部公式AWS

    BuilderCards審判員 好きなAWSサービス:営業、Security Hub、GuardDuty 他:AWS Community Builder(Security & Identity)、JAWS-UG千葉⽀部運営 Snyk Ambassador、SRE NEXTコアスタッフ 第022587号 © SMS Co., Ltd. 4
  2. 会社概要 基礎情報 業績 会社名 株式会社エス・エム・エス(英語表記)SMS Co., Ltd. 社会課題の解決につながる事業を 創造・拡大し、継続的に成長 設立

    2003年 4月4日 市場情報 東京証券取引所プライム市場(証券コード:2175) 資本金 25億5,172万円(2026年3月31日時点) 従業員数 連結:4,660人、単体:3,214人(2026年3月31日時点) 関連会社 国内:4社、海外:アジア・オセアニア等16の国と地域 ミッション 「高齢社会に適した情報インフラを構築することで人々の 売上推移 *1 (売上高・億円) 生活の質を向上し、社会に貢献し続ける」 高齢社会に求められる領域を、医療・介護/障害福祉・ヘルスケア ・シニアライフと捉え、価値提供先であるエンドユーザ・従事者・事 業者をつなぐプラットフォームとしての情報インフラを構築し、40以 上のサービスを展開 *1:第7期迄は単体数値、第8期より連結数値にて記載 © SMS Co., Ltd. 5
  3. サービス一覧(一部抜粋) 分野 キャリア 区分 人材紹介サー ビス DR・その他 介護・障害福祉 経営支援 サービス

    介護職向け人材紹介 看護師向け 人材紹介 保育士向け 人材紹介 放射線技師向け 人材紹介 臨床検査技師向け 人材紹介 臨床工学技士向け 人材紹介 職種横断ダイレクト 看護師・看護学生向け リクルーティング コミュニティ 管理栄養士・栄養士向け 人材紹介 看護学生向け 就職情報 介護で悩む人向け コミュニティ 医療従事者向け医薬情報 © SMS Co., Ltd. 看護師の職場を 診断するツール 介護で働く人の ためのスクール 介護・医療・福祉の 管理栄養士・栄養士 治療家を目指す人のため 資格講座情報 向けコミュニティ の総合メディア 企業の健康管理 業務サポート 障害のある方向け 人材紹介 障害のある方向け 就労支援事業所情報 高齢者向け 住宅紹介 リフォーム会社 紹介 建設・不動産 業界向け人材紹介 ヘルスケア 海外 治療家*1・セラピスト向け 人材紹介 ケアマネジャー・相談員 ・障がい福祉の人材紹介 高齢社会の 障害福祉事業者向け 介護事業の 介護/障害福祉 業務支援 事業者向け経営支援 経営者・管理者向け情報 調査・研究・情報発信 遠隔指導重症化 遠隔指導特定保健指導 予防サービス サービス シニアライフ PT/OT/ST向け 人材紹介 高齢者向け 食事宅配紹介 医療従事者向け人材紹介 (マレーシア、フィリピン、アイルランド、UK、ドイツ等) 産業保健に 医療介護業界特化型 関わる人向け情報 ストレスチェック 葬儀社紹介 認知症予防 ソリューション 認知症患者とその家族 向け認知症情報 看護師向け キャリアサービス *1.柔道整復師、あん摩マッサージ師、はり師、きゅう師のこと 6
  4. 今回の取り組みの背景 • 数年前からIdentity Centerで外部IdPによるSSOは設定済み • コード管理目的ですごく頑張ってTerraform importした • tfactionを利用してCICDを入れた •

    生成AIが使えるように、ユーザー管理に伴う修正作業を簡単に してみた ◦ 生成AIなくてもいいんじゃね?くらいまで簡単になった が、現在はAI-BOTに1コマンドで依頼するだけになった • 注意:SCIMによるユーザー自動同期との併用は対象外です。 © SMS Co., Ltd. 11
  5. Identity Centerとは 「AWS IAM アイデンティティセンターは、複数の AWS アカウントおよびビジネスアプリケーションへ のアクセスの一元管理を容易にします。<中略>IAM アイデンティティセンターを使用すると、AWS Organizations

    にあるすべてのアカウントに対する 一元的なアクセスとユーザーアクセス許可を簡単に管 理できます。」 https://aws.amazon.com/jp/iam/identity-center/features/ © SMS Co., Ltd. 13
  6. Identity Centerの基本 • シングルサインオン(SSO) ◦ 一度の認証で複数のアカウントにアクセス ◦ 外部IdPとの連携 ▪ Entra

    ID、Okta、Google Workspaceなど • マルチアカウント管理 ◦ 全てのアカウントへのアクセス制御を統合 • 許可セット ◦ IAMポリシーをテンプレート化して再利用 ◦ ユーザー/グループ単位に割り当て © SMS Co., Ltd. 14
  7. 主な概念 • ユーザー ◦ Identity Center で管理される個々の利用者 • グループ ◦

    ユーザーの集合の名称 • グループメンバーシップ ◦ グループとユーザーとの紐付け • 許可セット ◦ アクセス制御の基本単位(ポリシーの集合体) • アカウント割り当て ◦ ユーザー/グループ、許可セットとアカウントとの紐付け © SMS Co., Ltd. 15
  8. TerraformリソースとIdentity Centerの概念のマッピング © SMS Co., Ltd. Identity Centerの概念 Terraformリソース ユーザー

    aws_identitystore_user グループ aws_identitystore_group グループメンバーシップ aws_identitystore_group_membership 許可セット aws_ssoadmin_permission_set aws_ssoadmin_managed_policy_attachment aws_ssoadmin_customer_managed_policy_attachment aws_ssoadmin_permission_set_inline_policy アカウント割り当て aws_ssoadmin_account_assignment 19
  9. 許可セットの定義 # 許可セットの定義 resource "aws_ssoadmin_permission_set" "example" { name = "ExamplePermissionSet"

    description = "Example permission set" instance_arn = tolist(data.aws_ssoadmin_instances.example.arns)[0] session_duration = "PT1H" } # 許可セットへポリシーのアタッチ resource "aws_ssoadmin_managed_policy_attachment" "example" { instance_arn = tolist(data.aws_ssoadmin_instances.example.arns)[0] permission_set_arn = aws_ssoadmin_permission_set.example.arn managed_policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess" } © SMS Co., Ltd. 23
  10. ユーザーをアカウントに割り当てる # ユーザーをアカウントに割り当て resource "aws_ssoadmin_account_assignment" "example" { instance_arn = tolist(data.aws_ssoadmin_instances.example.arns)[0]

    permission_set_arn = aws_ssoadmin_permission_set.example.arn target_id = "123456789012" target_type = "AWS_ACCOUNT" principal_id = aws_identitystore_user.example.user_id principal_type = "USER" } © SMS Co., Ltd. 24
  11. グループをアカウントに割り当てる # グループをアカウントに割り当て resource "aws_ssoadmin_account_assignment" "example" { instance_arn = tolist(data.aws_ssoadmin_instances.example.arns)[0]

    permission_set_arn = aws_ssoadmin_permission_set.example.arn target_id = "123456789012" target_type = "AWS_ACCOUNT" principal_id = aws_identitystore_group.example.group_id principal_type = "GROUP" } © SMS Co., Ltd. 25
  12. ユーザーをグループに追加する # aws_identitystore_group_membership.example will be created + resource "aws_identitystore_group_membership" "example"

    { + group_id = "1234567890abcdef" + identity_store_id = "d-1234567890" + member_id = "b123456-1235-1234-1234-ab1234567890" + membership_id = (known after apply) } © SMS Co., Ltd. どのグループに 誰を 追加するのかが全 くわからない 31
  13. ユーザーをアカウントに割り当てる # aws_ssoadmin_account_assignment.example will be created + resource "aws_ssoadmin_account_assignment" "example"

    { + instance_arn = "arn:aws:sso:::instance/ssoins-1234567890abcdef" + permission_set_arn = "arn:aws:sso:::permissionSet/ssoins-1234567890abcdef/ps-1234567 890abcdef" + principal_id = "b123456-1235-1234-1234-ab1234567890" + principal_type = "USER" + target_id = "123456789012" + target_type = "AWS_ACCOUNT" } © SMS Co., Ltd. 誰に 何の権限を 割り当てるのか 全くわからない 32
  14. 前提条件:SMSでの運用規模 • AWSアカウント数 160以上 © SMS Co., Ltd. • ユーザー数

    200名以上 • グループ数 数十個程度 • 許可セット数 10個程度 36
  15. 必要なデータ構造[リソース名:assignment] # このようなmapに整形してからfor_eachを回す [awsaccount_id]_[permissionset]_[USER|GROUP]_[user_name]={ user_name = ”user1” account = “123456789012”

    permission_set_arn = “arn:aws:sso:::permissionSet/ssoins-1234567890abcdef/ps-1234567 890abcdef” principal_type = “[USER|GROUP]” } • User名でuser_idが引けるようにUser作成時にリソース配列の キーをUser名にしておく © SMS Co., Ltd. 40
  16. 必要なデータ構造[リソース名:group membership] # このようなmapに整形してからfor_eachを回す [groupname]_[user_name]={ user_name = ”user1” group_name =

    “XXX-Developers” } • Group名でgroup_idが引けるようにGroup作成時にリソース配 列のキーをGroup名にしておく © SMS Co., Ltd. 41
  17. ディレクトリ構造 terraform/ ├── user/ # ユーザー管理 │ ├── user.txt #

    ユーザーリスト(メールアドレス) │ └── dummy.tf ├── membership/ # グループメンバーシップ │ ├── XXX-Developers.txt # 開発者グループ │ ├── XXX-SREs.txt # SREグループ │ └── dummy.tf ├── assignment/ # アクセス権限の割り当て │ ├── 123456789012/ # AWSアカウントID │ │ ├── AdministratorAccess_GROUP.txt │ │ ├── PowerUserAccess_USER.txt │ │ └── dummy.tf │ ├── 234567890123/ │ └── ... © SMS Co., Ltd. 45
  18. ディレクトリ構造 └── root/ # Terraformの実装コード ├── variables.tf # 変数定義 ├──

    assignments.tf # assignmentの実装コード ├── assignments_dummy.tf # dummy.tfを読み込むための実装コード © SMS Co., Ltd. ├── memberships.tf # group membershipの実装コード ├── permissionsets.tf # permission setの実装コード ├── users.tf # userの定義コード └── groups.tf # Groupの実装コード 46
  19. ユーザーの追加 # aws_identitystore_user.this["user1"] will be created + resource "aws_identitystore_user" "this"

    { + display_name = "[email protected]" + external_ids = (known after apply) + id = (known after apply) + identity_store_id = "d-1234567890" + user_id + user_name } © SMS Co., Ltd. = (known after apply) リソースキーで 追加したユーザー名を 判別可能 = "[email protected]" 54
  20. ユーザーをグループに追加する # aws_identitystore_group_membership.this["XXX-Developers_user1"] will be created リソースキーで + resource "aws_identitystore_group_membership"

    "this" { + group_id = "abc12345-1234-1234-1234-abc123456789" どのグループに どのユーザーを + identity_store_id = "d-1234567890" 追加したか判別可能 + member_id = (known after apply) [Group名]_[ユーザー名] + id = (known after apply) + membership_id = (known after apply) } フォーマット:[Group名]_[ユーザー名] © SMS Co., Ltd. 55
  21. ユーザーをアカウントに割り当てる #aws_ssoadmin_account_assignment.this["123456789012_AdministratorAcce ss_USER_user1"] will be created リソースのキーで + resource "aws_ssoadmin_account_assignment"

    "this" { = (known after apply) どのAWSアカウントIDに + id + instance_arn = "arn:aws:sso:::instance/ssoins-1234567890abcdef" どの許可セットで + permission_set_arn = どのユーザーを 追加したか判別可能 "arn:aws:sso:::permissionSet/ssoins-1234567890abcdef/ps-1234567890a bcdef" + principal_id + principal_type = (known after apply) = "USER" フォーマット:[AWSアカウントID]_[許可セット名]_USER_[ユーザー名] + target_id + target_type = "123456789012" = "AWS_ACCOUNT" } © SMS Co., Ltd. 56
  22. グループをアカウントに割り当てる #aws_ssoadmin_account_assignment.this["123456789012_AdministratorAcce ss_GROUP_XXX-Developers"] will be created リソースのキーで + id =

    (known after apply) どのAWSアカウントIDに どの許可セットで + instance_arn = "arn:aws:sso:::instance/ssoins-1234567890abcdef" + permission_set_arn = どのグループを "arn:aws:sso:::permissionSet/ssoins-1234567890abcdef/ps-1234567890a 追加したか判別可能 + resource "aws_ssoadmin_account_assignment" "this" { bcdef" + principal_id + principal_type = “abc12345-1234-1234-1234-abc123456789” = "GROUP" フォーマット:[AWSアカウントID]_[許可セット名]_GROUP_[グループ名] + target_id + target_type = "123456789012" = "AWS_ACCOUNT" } © SMS Co., Ltd. 57