Terraform Provider for Microsoft Graph

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

5b47136bedcba2799edf4fcd27ea66d7?s=128

YAEGASHI Takeshi

February 18, 2020
Tweet

Transcript

  1. 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」
  2. 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 ⽉に⼊ってから…
  3. 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 のみ)
  4. 6.

    msgraph provider 開発の進捗 — まだプロダクションで使えるレベルではない — v0.0.2 で azuread provider

    と同程度のリソースをテスト実装 — msgraph_user — msgraph_group — msgraph_group_member — msgraph_application — msgraph_application_password
  5. 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" }
  6. 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 }
  7. 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 }
  8. 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" } } }
  9. 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" } } }
  10. 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" }
  11. 13.

    ここまで作ってみた感想 — msgraph provider の開発⾃体は容易だった — terraform-plugin-sdk がよくできていた — Microsoft

    Graph が素直な RESTful Web API だった — 成熟した API クライアントライブラリ msgraph.go があった — 頑張って⾃動コード⽣成した恩恵があった (仕様のブレ・実装の漏れがない) — azuread provider のコードが参考になった — Terraform の DAG workflow engine の凄さを思い知った — ベンチマークで単純なスクリプトや azuread provider と性能⽐較してみた
  12. 14.

    Azure AD ベンチマーク — 次の Azure AD リソースを作成・削除 — 100

    ×ユーザー — 10 ×グループ — 100 ×グループ・ユーザー関係 — 9 × グループ・グループ関係 グループ ユーザー グループ内のグループ
  13. 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}" }
  14. 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 }
  15. 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
  16. 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 に移⾏しよう!
  17. 19.

    今後の予定 — Azure AD リソースのテスト・安定化 — プロダクションで azuread provider を置き換えられるレベルを⽬指す

    — Office 365 リソース対応 — msgraph_team: Team が作れる — msgraph_drive, msgraph_drive_item: OneDrive のファイルを読み書き — msgraph_workbook, msgraph_worksheet: Excel Online アクセス — ⾃動⽣成 — msgraph.go と同様なコード⾃動⽣成を⽬指したい、が難しそう
  18. 20.