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

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

YAEGASHI Takeshi

February 18, 2020
Tweet

More Decks by YAEGASHI Takeshi

Other Decks in Programming

Transcript

  1. Microsoft Open Tech Night #6 w/ HashiCorp Japan
    2020-02-18 Takeshi Yaegashi

    View full-size slide

  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」

    View full-size slide

  3. 今⽇の話題
    Terraform Provider for Microsoft Graph
    https://github.com/yaegashi/terraform-provider-msgraph

    View full-size slide

  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 ⽉に⼊ってから…

    View full-size slide

  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 のみ)

    View full-size slide

  6. msgraph provider 開発の進捗
    — まだプロダクションで使えるレベルではない
    — v0.0.2 で azuread provider と同程度のリソースをテスト実装
    — msgraph_user
    — msgraph_group
    — msgraph_group_member
    — msgraph_application
    — msgraph_application_password

    View full-size slide

  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"
    }

    View full-size slide

  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 = ["[email protected]"]
    account_enabled = true
    }

    View full-size slide

  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
    }

    View full-size slide

  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"
    }
    }
    }

    View full-size slide

  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"
    }
    }
    }

    View full-size slide

  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"
    }

    View full-size slide

  13. ここまで作ってみた感想
    — msgraph provider の開発⾃体は容易だった
    — terraform-plugin-sdk がよくできていた
    — Microsoft Graph が素直な RESTful Web API だった
    — 成熟した API クライアントライブラリ msgraph.go があった
    — 頑張って⾃動コード⽣成した恩恵があった (仕様のブレ・実装の漏れがない)
    — azuread provider のコードが参考になった
    — Terraform の DAG workflow engine の凄さを思い知った
    — ベンチマークで単純なスクリプトや azuread provider と性能⽐較してみた

    View full-size slide

  14. Azure AD ベンチマーク
    — 次の Azure AD リソースを作成・削除
    — 100 ×ユーザー
    — 10 ×グループ
    — 100 ×グループ・ユーザー関係
    — 9 × グループ・グループ関係
    グループ
    ユーザー
    グループ内のグループ

    View full-size slide

  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}"
    }

    View full-size slide

  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
    }

    View full-size slide

  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

    View full-size slide

  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 に移⾏しよう!

    View full-size slide

  19. 今後の予定
    — Azure AD リソースのテスト・安定化
    — プロダクションで azuread provider を置き換えられるレベルを⽬指す
    — Office 365 リソース対応
    — msgraph_team: Team が作れる
    — msgraph_drive, msgraph_drive_item: OneDrive のファイルを読み書き
    — msgraph_workbook, msgraph_worksheet: Excel Online アクセス
    — ⾃動⽣成
    — msgraph.go と同様なコード⾃動⽣成を⽬指したい、が難しそう

    View full-size slide