Share
シンプルな設定ファイルで実現する 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
Takashi Yamaguchi
Transcript
63 slides
-
エレベーターピッチ 「AWS IAM Identity Centerで200名以上の開発者と160以 上のアカウントを管理する中で、権限管理の運用負荷が増加 していました。 そこで、シンプルなテキストファイルとTerraformを組み合 わせることで、設定ファイルを編集するだけで権限管理が完 了する仕組みを実現できました。
AI-BOTに修正を任せることができ、運用負荷も大幅に削減で きました。」 © SMS Co., Ltd. 2 -
⾃⼰紹介 ⽒名:⼭⼝隆史(やまぐちたかし) 所属:株式会社エス・エム・エス プロダクト推進本部 技術推進グループ 業務:全社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 -
会社概要 基礎情報 業績 会社名 株式会社エス・エム・エス(英語表記)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 -
サービス一覧(一部抜粋) 分野 キャリア 区分 人材紹介サー ビス DR・その他 介護・障害福祉 経営支援 サービス
介護職向け人材紹介 看護師向け 人材紹介 保育士向け 人材紹介 放射線技師向け 人材紹介 臨床検査技師向け 人材紹介 臨床工学技士向け 人材紹介 職種横断ダイレクト 看護師・看護学生向け リクルーティング コミュニティ 管理栄養士・栄養士向け 人材紹介 看護学生向け 就職情報 介護で悩む人向け コミュニティ 医療従事者向け医薬情報 © SMS Co., Ltd. 看護師の職場を 診断するツール 介護で働く人の ためのスクール 介護・医療・福祉の 管理栄養士・栄養士 治療家を目指す人のため 資格講座情報 向けコミュニティ の総合メディア 企業の健康管理 業務サポート 障害のある方向け 人材紹介 障害のある方向け 就労支援事業所情報 高齢者向け 住宅紹介 リフォーム会社 紹介 建設・不動産 業界向け人材紹介 ヘルスケア 海外 治療家*1・セラピスト向け 人材紹介 ケアマネジャー・相談員 ・障がい福祉の人材紹介 高齢社会の 障害福祉事業者向け 介護事業の 介護/障害福祉 業務支援 事業者向け経営支援 経営者・管理者向け情報 調査・研究・情報発信 遠隔指導重症化 遠隔指導特定保健指導 予防サービス サービス シニアライフ PT/OT/ST向け 人材紹介 高齢者向け 食事宅配紹介 医療従事者向け人材紹介 (マレーシア、フィリピン、アイルランド、UK、ドイツ等) 産業保健に 医療介護業界特化型 関わる人向け情報 ストレスチェック 葬儀社紹介 認知症予防 ソリューション 認知症患者とその家族 向け認知症情報 看護師向け キャリアサービス *1.柔道整復師、あん摩マッサージ師、はり師、きゅう師のこと 6 -
01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL
05 まとめ © SMS Co., Ltd. 9 -
01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL
05 まとめ © SMS Co., Ltd. 10 -
今回の取り組みの背景 • 数年前からIdentity Centerで外部IdPによるSSOは設定済み • コード管理目的ですごく頑張ってTerraform importした • tfactionを利用してCICDを入れた •
生成AIが使えるように、ユーザー管理に伴う修正作業を簡単に してみた ◦ 生成AIなくてもいいんじゃね?くらいまで簡単になった が、現在はAI-BOTに1コマンドで依頼するだけになった • 注意:SCIMによるユーザー自動同期との併用は対象外です。 © SMS Co., Ltd. 11 -
01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL
05 まとめ © SMS Co., Ltd. 12 -
Identity Centerとは 「AWS IAM アイデンティティセンターは、複数の AWS アカウントおよびビジネスアプリケーションへ のアクセスの一元管理を容易にします。<中略>IAM アイデンティティセンターを使用すると、AWS Organizations
にあるすべてのアカウントに対する 一元的なアクセスとユーザーアクセス許可を簡単に管 理できます。」 https://aws.amazon.com/jp/iam/identity-center/features/ © SMS Co., Ltd. 13 -
Identity Centerの基本 • シングルサインオン(SSO) ◦ 一度の認証で複数のアカウントにアクセス ◦ 外部IdPとの連携 ▪ Entra
ID、Okta、Google Workspaceなど • マルチアカウント管理 ◦ 全てのアカウントへのアクセス制御を統合 • 許可セット ◦ IAMポリシーをテンプレート化して再利用 ◦ ユーザー/グループ単位に割り当て © SMS Co., Ltd. 14 -
主な概念 • ユーザー ◦ Identity Center で管理される個々の利用者 • グループ ◦
ユーザーの集合の名称 • グループメンバーシップ ◦ グループとユーザーとの紐付け • 許可セット ◦ アクセス制御の基本単位(ポリシーの集合体) • アカウント割り当て ◦ ユーザー/グループ、許可セットとアカウントとの紐付け © SMS Co., Ltd. 15 -
主な概念を図にしてみる AWSアカウント グループメンバー シップ ユーザー アカウント割り当て グループ 許可セット ポリシー ©
SMS Co., Ltd. 16 -
01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL
05 まとめ © SMS Co., Ltd. 18 -
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 -
ユーザー定義 # ユーザーの定義 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 -
グループ定義 # グループの定義 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 -
ユーザーをグループに割り当てる # ユーザーをグループに割り当て 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 -
許可セットの定義 # 許可セットの定義 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 -
ユーザーをアカウントに割り当てる # ユーザーをアカウントに割り当て 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 -
グループをアカウントに割り当てる # グループをアカウントに割り当て 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 -
基礎的な実装の課題 • ユーザー、AWSアカウントの増加に対してコード量がリニアに 増加する ◦ アカウント割り当て=AWSアカウント✖ユーザー数orグルー プ数✖付与する許可セット • コードからユーザー、グループに付与した権限の棚卸しが困難 ◦
機械的にやろうとするとコードの解析やtfstateのパースが必 要になる • 結果として、認知負荷が高く慣れている人しか安全に変更でき ない © SMS Co., Ltd. 29 -
ユーザーをグループに追加する # 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 -
ユーザーをアカウントに割り当てる # 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 -
ここまでのまとめ • Identity Centerは便利 • Terraformの素直な実装はシンプルだがコード量がリニアに増 大し認知負荷が高い • Terraformの素直な実装ではTerraform Planが内部ID表示に
なり変更内容の把握が困難 © SMS Co., Ltd. 34 -
01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL
05 まとめ © SMS Co., Ltd. 35 -
前提条件:SMSでの運用規模 • AWSアカウント数 160以上 © SMS Co., Ltd. • ユーザー数
200名以上 • グループ数 数十個程度 • 許可セット数 10個程度 36 -
実装のアプローチ • DSL化 ◦ ユーザー作成、ユーザーをグループに割り当てる、 ユーザー・グループに権限を割り当てる操作をDSL化 • ディレクトリ、ファイル名を構造化 ◦ ディレクトリ、ファイル名だけで目的が伝わる構造にする
▪ プログラム処理が可能な構造にする © SMS Co., Ltd. 38 -
実装するときに考えたこと[リソース名] • コード量を削減するためにはfor_eachで回してリソースを作る 必要がある • for_eachで回して作成したリソース名を連番にしないために は、for_eachで回す変数ブロックに名前をつける必要がある ◦ 配列の添字をキーにしてfor_eachを回すと、変更時に destroy→createが発生することがある
• 名前付き変数ブロックを人間が記述するのはコード量が増えて 大変なので、単純な構造から自動生成する必要がある © SMS Co., Ltd. 39 -
必要なデータ構造[リソース名: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 -
必要なデータ構造[リソース名:group membership] # このようなmapに整形してからfor_eachを回す [groupname]_[user_name]={ user_name = ”user1” group_name =
“XXX-Developers” } • Group名でgroup_idが引けるようにGroup作成時にリソース配 列のキーをGroup名にしておく © SMS Co., Ltd. 41 -
実装するときに考えたこと[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 -
実装するときに考えたこと[ディレクトリ構造] • プログラム処理することを考えるとディレクトリ名はAWSアカ ウントIDが良い ◦ Terraformのfileset関数で列挙できる • AWSアカウントIDをフラットなディレクトリ構造で配置する ◦ 部門・部署・サービス名のディレクトリ構造にすることも
考えたが、依頼を捌くのは全社SREのことが多い © SMS Co., Ltd. 43 -
ディレクトリ構造 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 -
ディレクトリ構造 └── 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 -
グループにユーザーを追加する時 • グループ管理ファイル([GROUP名].txt) ◦ Groupに所属させるユーザーのメールアドレスのメールア カウント部分(@より左側)を記載 user1 user2 … …
※メールのローカル部が管理対象全体で一意であることが前提 © SMS Co., Ltd. 50 -
ユーザーに許可セットを付与する時 • ユーザー・許可セット管理ファイル([AWSアカウントID]/[許 可セット名]_USER.txt) ◦ 対象AWSアカウントに許可セットを付与するユーザーの メールアドレスのメールアカウント部分(@より左側)を 記載 user1 user2
… … ※メールのローカル部が管理対象全体で一意であることが前提 © SMS Co., Ltd. 51 -
ユーザーの追加 # 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 -
ユーザーをグループに追加する # 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 -
ユーザーをアカウントに割り当てる #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 -
グループをアカウントに割り当てる #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 -
01 今回の取り組みの背景 02 Identity Centerの基本 目次 03 Terraformでの基礎的な実装 04 改善のアプローチとDSL
05 まとめ © SMS Co., Ltd. 59 -
スタンプラリーに挑戦しよう! イベント会場(20会場)に、 QRコードが設置されております! 全部集めて景品をGETしよう! 感想は ハッシュタグ #devio2026 ※スタンプコンプリート先着10名様に 豪華景品をプレゼント! 景品引き換え場所
⽇⽐⾕フォートタワー26階 メイン会場 Cafe (くらにゃんブース横) © SMS Co., Ltd. 62