Slide 1

Slide 1 text

シンプルな設定ファイルで実現する AWS IAM Identity Center の ユーザー管理Terraformフレームワークを公開しました 2026.10.23 株式会社エス・エム・エス 山口隆史 © SMS Co., Ltd. 1

Slide 2

Slide 2 text

エレベーターピッチ 「AWS IAM Identity Centerで200名以上の開発者と160以 上のアカウントを管理する中で、権限管理の運用負荷が増加 していました。 そこで、シンプルなテキストファイルとTerraformを組み合 わせることで、設定ファイルを編集するだけで権限管理が完 了する仕組みを実現できました。 AI-BOTに修正を任せることができ、運用負荷も大幅に削減で きました。」 © SMS Co., Ltd. 2

Slide 3

Slide 3 text

要はですね AWS IAM Identity CenterをTerraformで ユーザー管理するときにすっげー便利な Terraformコードをフレームワーク化して OSSとして公開したので、みんな使ってね © SMS Co., Ltd. 3

Slide 4

Slide 4 text

⾃⼰紹介 ⽒名:⼭⼝隆史(やまぐちたかし) 所属:株式会社エス・エム・エス プロダクト推進本部 技術推進グループ 業務:全社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

Slide 5

Slide 5 text

会社概要 基礎情報 業績 会社名 株式会社エス・エム・エス(英語表記)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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

注意事項 ● 今回発表するコードはGitHubでOSSとして公開しています ● スライドも発表後に公開します idc-terraform-framework idc-terraform-example https://github.com/yamaguchi-tk/idc-terraform-framework © SMS Co., Ltd. 7

Slide 8

Slide 8 text

ここから本題 © SMS Co., Ltd. 8

Slide 9

Slide 9 text

01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL 05 まとめ © SMS Co., Ltd. 9

Slide 10

Slide 10 text

01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL 05 まとめ © SMS Co., Ltd. 10

Slide 11

Slide 11 text

今回の取り組みの背景 ● 数年前からIdentity Centerで外部IdPによるSSOは設定済み ● コード管理目的ですごく頑張ってTerraform importした ● tfactionを利用してCICDを入れた ● 生成AIが使えるように、ユーザー管理に伴う修正作業を簡単に してみた ○ 生成AIなくてもいいんじゃね?くらいまで簡単になった が、現在はAI-BOTに1コマンドで依頼するだけになった ● 注意:SCIMによるユーザー自動同期との併用は対象外です。 © SMS Co., Ltd. 11

Slide 12

Slide 12 text

01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL 05 まとめ © SMS Co., Ltd. 12

Slide 13

Slide 13 text

Identity Centerとは 「AWS IAM アイデンティティセンターは、複数の AWS アカウントおよびビジネスアプリケーションへ のアクセスの一元管理を容易にします。<中略>IAM アイデンティティセンターを使用すると、AWS Organizations にあるすべてのアカウントに対する 一元的なアクセスとユーザーアクセス許可を簡単に管 理できます。」 https://aws.amazon.com/jp/iam/identity-center/features/ © SMS Co., Ltd. 13

Slide 14

Slide 14 text

Identity Centerの基本 ● シングルサインオン(SSO) ○ 一度の認証で複数のアカウントにアクセス ○ 外部IdPとの連携 ■ Entra ID、Okta、Google Workspaceなど ● マルチアカウント管理 ○ 全てのアカウントへのアクセス制御を統合 ● 許可セット ○ IAMポリシーをテンプレート化して再利用 ○ ユーザー/グループ単位に割り当て © SMS Co., Ltd. 14

Slide 15

Slide 15 text

主な概念 ● ユーザー ○ Identity Center で管理される個々の利用者 ● グループ ○ ユーザーの集合の名称 ● グループメンバーシップ ○ グループとユーザーとの紐付け ● 許可セット ○ アクセス制御の基本単位(ポリシーの集合体) ● アカウント割り当て ○ ユーザー/グループ、許可セットとアカウントとの紐付け © SMS Co., Ltd. 15

Slide 16

Slide 16 text

主な概念を図にしてみる AWSアカウント グループメンバー シップ ユーザー アカウント割り当て グループ 許可セット ポリシー © SMS Co., Ltd. 16

Slide 17

Slide 17 text

画面例 © SMS Co., Ltd. 17

Slide 18

Slide 18 text

01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL 05 まとめ © SMS Co., Ltd. 18

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

ユーザー定義 # ユーザーの定義 resource "aws_identitystore_user" "example" { identity_store_id = tolist(data.aws_ssoadmin_instances.example.identity_store_ids)[0] display_name = "Example User" user_name = "[email protected]" emails { value = "[email protected]" } } © SMS Co., Ltd. 20

Slide 21

Slide 21 text

グループ定義 # グループの定義 resource "aws_identitystore_group" "example" { identity_store_id = tolist(data.aws_ssoadmin_instances.example.identity_store_ids)[0] display_name = "Example Group" description = "Example group for testing" } © SMS Co., Ltd. 21

Slide 22

Slide 22 text

ユーザーをグループに割り当てる # ユーザーをグループに割り当て resource "aws_identitystore_group_membership" "example" { identity_store_id = tolist(data.aws_ssoadmin_instances.example.identity_store_ids)[0] group_id = aws_identitystore_group.example.group_id member_id = aws_identitystore_user.example.user_id } © SMS Co., Ltd. 22

Slide 23

Slide 23 text

許可セットの定義 # 許可セットの定義 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

Slide 24

Slide 24 text

ユーザーをアカウントに割り当てる # ユーザーをアカウントに割り当て 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

Slide 25

Slide 25 text

グループをアカウントに割り当てる # グループをアカウントに割り当て 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

Slide 26

Slide 26 text

Terraformコードは簡単ですよね? © SMS Co., Ltd. 26

Slide 27

Slide 27 text

コード自体は簡単ですが課題もあります © SMS Co., Ltd. 27

Slide 28

Slide 28 text

[再掲]主な概念を図にしてみる AWSアカウント グループメンバー シップ ユーザー アカウント割り当て グループ 許可セット ポリシー © SMS Co., Ltd. 28

Slide 29

Slide 29 text

基礎的な実装の課題 ● ユーザー、AWSアカウントの増加に対してコード量がリニアに 増加する ○ アカウント割り当て=AWSアカウント✖ユーザー数orグルー プ数✖付与する許可セット ● コードからユーザー、グループに付与した権限の棚卸しが困難 ○ 機械的にやろうとするとコードの解析やtfstateのパースが必 要になる ● 結果として、認知負荷が高く慣れている人しか安全に変更でき ない © SMS Co., Ltd. 29

Slide 30

Slide 30 text

次にTerraform Planを見てみましょう © SMS Co., Ltd. 30

Slide 31

Slide 31 text

ユーザーをグループに追加する # 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

Slide 32

Slide 32 text

ユーザーをアカウントに割り当てる # 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

Slide 33

Slide 33 text

Terraform Planの課題 ● レビューが困難 ○ 誰に、何の権限を、どこに割り当てたのかが、内部IDで表 示されるため、Planだけではわからない © SMS Co., Ltd. 33

Slide 34

Slide 34 text

ここまでのまとめ ● Identity Centerは便利 ● Terraformの素直な実装はシンプルだがコード量がリニアに増 大し認知負荷が高い ● Terraformの素直な実装ではTerraform Planが内部ID表示に なり変更内容の把握が困難 © SMS Co., Ltd. 34

Slide 35

Slide 35 text

01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL 05 まとめ © SMS Co., Ltd. 35

Slide 36

Slide 36 text

前提条件:SMSでの運用規模 ● AWSアカウント数 160以上 © SMS Co., Ltd. ● ユーザー数 200名以上 ● グループ数 数十個程度 ● 許可セット数 10個程度 36

Slide 37

Slide 37 text

目指す姿 ● レビューが楽にできる ○ Terraform Planにユーザー名、グループ名、許可セット名 を表示する © SMS Co., Ltd. 37

Slide 38

Slide 38 text

実装のアプローチ ● DSL化 ○ ユーザー作成、ユーザーをグループに割り当てる、 ユーザー・グループに権限を割り当てる操作をDSL化 ● ディレクトリ、ファイル名を構造化 ○ ディレクトリ、ファイル名だけで目的が伝わる構造にする ■ プログラム処理が可能な構造にする © SMS Co., Ltd. 38

Slide 39

Slide 39 text

実装するときに考えたこと[リソース名] ● コード量を削減するためにはfor_eachで回してリソースを作る 必要がある ● for_eachで回して作成したリソース名を連番にしないために は、for_eachで回す変数ブロックに名前をつける必要がある ○ 配列の添字をキーにしてfor_eachを回すと、変更時に destroy→createが発生することがある ● 名前付き変数ブロックを人間が記述するのはコード量が増えて 大変なので、単純な構造から自動生成する必要がある © SMS Co., Ltd. 39

Slide 40

Slide 40 text

必要なデータ構造[リソース名: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

Slide 41

Slide 41 text

必要なデータ構造[リソース名:group membership] # このようなmapに整形してからfor_eachを回す [groupname]_[user_name]={ user_name = ”user1” group_name = “XXX-Developers” } ● Group名でgroup_idが引けるようにGroup作成時にリソース配 列のキーをGroup名にしておく © SMS Co., Ltd. 41

Slide 42

Slide 42 text

実装するときに考えたこと[CICD] ● 特に制約がなければtfactionに乗るのが良さそう ○ https://github.com/suzuki-shunsuke/tfaction ● tfactionの機能で、moduleの変更検知を使えばTXTファイル の変更でCICDできそう ○ update_local_path_module_caller ○ TXTファイルを配置するディレクトリをmodule扱いにする ためにdummy.tfを配置してmodule呼び出ししておく © SMS Co., Ltd. 42

Slide 43

Slide 43 text

実装するときに考えたこと[ディレクトリ構造] ● プログラム処理することを考えるとディレクトリ名はAWSアカ ウントIDが良い ○ Terraformのfileset関数で列挙できる ● AWSアカウントIDをフラットなディレクトリ構造で配置する ○ 部門・部署・サービス名のディレクトリ構造にすることも 考えたが、依頼を捌くのは全社SREのことが多い © SMS Co., Ltd. 43

Slide 44

Slide 44 text

実際に出来たディレクトリ構造 © SMS Co., Ltd. 44

Slide 45

Slide 45 text

ディレクトリ構造 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

Slide 46

Slide 46 text

ディレクトリ構造 └── 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

Slide 47

Slide 47 text

ディレクトリ構造の説明 ● dummy.tfの役割 ○ ディレクトリをmoduleとして扱うためだけのファイル ○ tfactionに以下の設定を入れることで、TXTファイル修正 時にCIの対象とするようにしている update_local_path_module_caller: enabled: true © SMS Co., Ltd. 47

Slide 48

Slide 48 text

実際に出来たDSLはこんな感じ © SMS Co., Ltd. 48

Slide 49

Slide 49 text

ユーザーを追加する時 ● ユーザー管理ファイル(user.txt) ○ Identity Centerに登録するユーザーのメールアドレスを記 載 [email protected] [email protected] … … © SMS Co., Ltd. 49

Slide 50

Slide 50 text

グループにユーザーを追加する時 ● グループ管理ファイル([GROUP名].txt) ○ Groupに所属させるユーザーのメールアドレスのメールア カウント部分(@より左側)を記載 user1 user2 … … ※メールのローカル部が管理対象全体で一意であることが前提 © SMS Co., Ltd. 50

Slide 51

Slide 51 text

ユーザーに許可セットを付与する時 ● ユーザー・許可セット管理ファイル([AWSアカウントID]/[許 可セット名]_USER.txt) ○ 対象AWSアカウントに許可セットを付与するユーザーの メールアドレスのメールアカウント部分(@より左側)を 記載 user1 user2 … … ※メールのローカル部が管理対象全体で一意であることが前提 © SMS Co., Ltd. 51

Slide 52

Slide 52 text

グループに許可セットを付与する時 ● グループ・許可セット管理ファイル([AWSアカウントID]/[許 可セット名]_GROUP.txt) ○ 対象AWSアカウントに許可セットを付与するグループ名を 記載 XXX-Developers … … © SMS Co., Ltd. 52

Slide 53

Slide 53 text

Terraform Planはこんな感じになりました © SMS Co., Ltd. 53

Slide 54

Slide 54 text

ユーザーの追加 # 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

Slide 55

Slide 55 text

ユーザーをグループに追加する # 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

Slide 56

Slide 56 text

ユーザーをアカウントに割り当てる #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

Slide 57

Slide 57 text

グループをアカウントに割り当てる #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

Slide 58

Slide 58 text

ここまでのまとめ ● DSL化することで、日常的に発生する作業がものすごく簡単に なりました ● リソース名に意味を持たせることで、Terraform Planを見る だけでレビューができるようになりました © SMS Co., Ltd. 58

Slide 59

Slide 59 text

01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL 05 まとめ © SMS Co., Ltd. 59

Slide 60

Slide 60 text

まとめ AWS IAM Identity CenterをTerraformでユーザー管理すると きにすっげー便利なTerraformコードをフレームワーク化して OSSとして公開したので、みんな使ってね idc-terraform-framework idc-terraform-example https://github.com/yamaguchi-tk/idc-terraform-framework © SMS Co., Ltd. 60

Slide 61

Slide 61 text

アンケートにご協⼒お願いします! DevIO Passから回答が可能です

Slide 62

Slide 62 text

スタンプラリーに挑戦しよう! イベント会場(20会場)に、 QRコードが設置されております! 全部集めて景品をGETしよう! 感想は ハッシュタグ #devio2026 ※スタンプコンプリート先着10名様に 豪華景品をプレゼント! 景品引き換え場所 ⽇⽐⾕フォートタワー26階 メイン会場 Cafe (くらにゃんブース横) © SMS Co., Ltd. 62

Slide 63

Slide 63 text

日比谷オフィス 26階 会場MAP サテライト会場 4-7階 © SMS Co., Ltd. 63