Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Terraform Provider for Microsoft Graph

397 views

Published on

※ SlideShare の画質が微妙ですので Speaker Deck をご覧になるか PDF をダウンロードしてご覧ください。
https://speakerdeck.com/yaegashi/terraform-provider-for-microsoft-graph

Microsoft Open Tech Night #6 w/ HashiCorp Japan
https://msdevjp.connpass.com/event/159496/

Terraform Provider for Microsoft Graph
https://github.com/yaegashi/terraform-provider-msgraph

Published in: Software
  • Be the first to comment

  • Be the first to like this

Terraform Provider for Microsoft Graph

  1. 1. Microsoft Open Tech Night #6 w/ HashiCorp Japan 2020-02-18 Takeshi Yaegashi
  2. 2. ⾃⼰紹介 ⼋重樫 剛史 Takeshi Yaegashi — 株式会社バンダイナムコスタジオ所属 — Linux・Unix・OSS・低レベルなことが好きなエンジニア — ホームページ・ブログ https://l0w.dev Qiita https://qiita.com/yaegashi — 最近の仕事 — Raspberry Pi IoT 案件 (Go) スマホゲームのサーバ開発 (Go) — Azure による開発者向けインフラ構築 (Python, Azure, Go, Terraform, etc.) — 最近の登壇 — Microsoft de:code 2019 「DT01: ゲームメーカー⽬線で Azure を (略)」 — Go Conference 2019 Autumn 「Microsoft Graph API Library for Go」
  3. 3. 今⽇の話題 Terraform Provider for Microsoft Graph https://github.com/yaegashi/terraform-provider-msgraph
  4. 4. msgraph provider 開発の経緯 — 2019 年秋 Microsoft Graph Client Library for Go (msgraph.go) を作った — https://github.com/yaegashi/msgraph.go — GoCon 2019 Autumn で発表 — HashiCorp 製品の多くは Go で書かれているという事実を認識 — Terraform などの Microsoft Graph 対応を TODO に積む — そのまま 2ヶ⽉ほど経過 — 2020 年初頭 Microsoft Open Tech Night #6 w/ HashiCorp Japan アナウンス — LT 募集枠に⼿を上げて開発開始 (イベントドリブン開発?) — なお実際に作り始めたのは 2 ⽉に⼊ってから…
  5. 5. msgraph provider の意義 — azuread (公式 Azure Active Directory provider) の置き換え — azuread は廃⽌予定の Azure AD Graph API を今でも使っている — 同等の機能を提供する Microsoft Graph API に移⾏する必要がある — Azure AD / Office 365 の様々なリソースが Terraform で扱えるようになる — User, Group, Application (Azure AD Graph でも可能) — OneDrive, SharePoint, Teams, Planner, Mail, Calendar, ... (MS Graph API のみ)
  6. 6. msgraph provider 開発の進捗 — まだプロダクションで使えるレベルではない — v0.0.2 で azuread provider と同程度のリソースをテスト実装 — msgraph_user — msgraph_group — msgraph_group_member — msgraph_application — msgraph_application_password
  7. 7. msgraph provider 設定 provider "msgraph" { tenant_id = "common" client_id = "82492584-8587-4e7d-ad48-19546ce8238f" client_secret = "" // empty for device code authorization token_cache_path = "token_cache.json" } variable "tenant_domain" { type = string default = "l0wdev.onmicrosoft.com" }
  8. 8. msgraph_user resource "msgraph_user" "demo_user" { user_principal_name = "demouser@${var.tenant_domain}" display_name = "デモ ユーザー" given_name = "ユーザー" surname = "デモ" mail_nickname = "demouser" other_mails = ["demouser@example.com"] account_enabled = true }
  9. 9. msgraph_group, msgraph_group_member resource "msgraph_group" "demo_group" { display_name = "デモ グループ" mail_nickname = "demogroup" } resource "msgraph_group_member" "demo_group_user" { group_id = msgraph_group.demo_group.id member_id = msgraph_user.demo_user.id }
  10. 10. msgraph_application (API consumer) resource "msgraph_application" "demo_consumer_app" { display_name = "Demo Consumer App" sign_in_audience = "AzureADMyOrg" identifier_uris = ["http://localhost/consumer"] redirect_uris = ["http://localhost:8080"] home_page_url = "http://localhost/consumer" api {} required_resource_access { resource_app_id = "00000003-0000-0000-c000-000000000000" // MS Graph API resource_access { id = "df85f4d6-205c-4ac5-a5ea-6bf408dba283" // Files.Read.All type = "Scope" } resource_access { id = "7427e0e9-2fba-42fe-b0c0-848c9e6a8182" // offline_access type = "Scope" } } }
  11. 11. msgraph_application (API provider) provider "random" {} resource "random_uuid" "demo_provider_app_hoge" {} resource "msgraph_application" "demo_provider_app" { display_name = "Demo Provider App" sign_in_audience = "AzureADMyOrg" identifier_uris = ["http://localhost/provider"] redirect_uris = ["http://localhost:8080"] home_page_url = "http://localhost/provider" api { oauth2_permission_scope { id = random_uuid.demo_provider_app_hoge.result admin_consent_description = "Hoge API Description" admin_consent_display_name = "Hoge API Display Name" type = "User" value = "Hoge" } } }
  12. 12. msgraph_application_password resource "msgraph_application_password" "demo_consumer_app_password" { application_id = msgraph_application.demo_consumer_app.id // Object ID display_name = "Demo Consumer App Password" end_date_time = "2100-01-01T00:00:00Z" } resource "msgraph_application_password" "demo_provider_app_password" { application_id = msgraph_application.demo_provider_app.id // Object ID display_name = "Demo Provider App Password" end_date_time = "2100-01-01T00:00:00Z" }
  13. 13. ここまで作ってみた感想 — msgraph provider の開発⾃体は容易だった — terraform-plugin-sdk がよくできていた — Microsoft Graph が素直な RESTful Web API だった — 成熟した API クライアントライブラリ msgraph.go があった — 頑張って⾃動コード⽣成した恩恵があった (仕様のブレ・実装の漏れがない) — azuread provider のコードが参考になった — Terraform の DAG workflow engine の凄さを思い知った — ベンチマークで単純なスクリプトや azuread provider と性能⽐較してみた
  14. 14. Azure AD ベンチマーク — 次の Azure AD リソースを作成・削除 — 100 ×ユーザー — 10 ×グループ — 100 ×グループ・ユーザー関係 — 9 × グループ・グループ関係 グループ ユーザー グループ内のグループ
  15. 15. msgraph_user×100, msgraph_group×10 resource "msgraph_user" "demo_users" { count = 100 user_principal_name = "demouser${count.index}@${var.tenant_domain}" display_name = "Demo User ${count.index}" mail_nickname = "demouser${count.index}" account_enabled = true } resource "msgraph_group" "demo_groups" { count = 10 display_name = "Demo Group ${count.index}" mail_nickname = "demogroup${count.index}" }
  16. 16. msgraph_group_member×(100+9) resource "msgraph_group_member" "demo_group_user_members" { count = 100 group_id = msgraph_group.demo_groups[count.index % 10].id member_id = msgraph_user.demo_users[count.index].id } resource "msgraph_group_member" "demo_group_group_members" { count = 9 group_id = msgraph_group.demo_groups[count.index].id member_id = msgraph_group.demo_groups[count.index + 1].id }
  17. 17. ベンチマークの結果 スクリプト 並列度 作成 (秒) 削除 (秒) 備考 msgraphgo 1 82.119 42.548 msgraph.go の素朴なプログラム msgraphtf 1 103.473 107.952 msgraphtf 10 12.568 12.632 Terraform msgraph provider デフォルト並列度 msgraphtf 100 7.550 7.943 azureadtf 1 >1000? ? 未計測 azureadtf 10 125.191 12.832 Terraform azuread provider デフォルト並列度 azureadtf 100 30.266 10.745
  18. 18. ベンチマークの考察 — 使⽤したスクリプトの場所 — https://github.com/yaegashi/terraform-provider-msgraph/tree/master/tests/benchmark — Terraform DAG Workflow Engine の威⼒ — 宣⾔的なリソース定義のおかげで作るのも壊すのも最速 — 命令的な構成管理ツールやスクリプトに対する Terraform の優位点 — ただし性能はネットやサーバの速度・頑健性にも⼤きく依存する — Azure AD Graph はたまにリクエスト失敗する? — azuread provider は対策としてリソース作成ごとに 10 回 GET して確認している — Microsoft Graph は優秀 — 1000 ユーザー作っても⼤丈夫 はやく Microsoft Graph に移⾏しよう!
  19. 19. 今後の予定 — Azure AD リソースのテスト・安定化 — プロダクションで azuread provider を置き換えられるレベルを⽬指す — Office 365 リソース対応 — msgraph_team: Team が作れる — msgraph_drive, msgraph_drive_item: OneDrive のファイルを読み書き — msgraph_workbook, msgraph_worksheet: Excel Online アクセス — ⾃動⽣成 — msgraph.go と同様なコード⾃動⽣成を⽬指したい、が難しそう
  20. 20. おわり

×