Mais conteúdo relacionado Terraform Provider for Microsoft Graph2. ⾃⼰紹介
⼋重樫 剛史 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」
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. 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. msgraph provider 開発の進捗
— まだプロダクションで使えるレベルではない
— v0.0.2 で azuread provider と同程度のリソースをテスト実装
— msgraph_user
— msgraph_group
— msgraph_group_member
— msgraph_application
— msgraph_application_password
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. 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
}
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. 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. 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. ここまで作ってみた感想
— msgraph provider の開発⾃体は容易だった
— terraform-plugin-sdk がよくできていた
— Microsoft Graph が素直な RESTful Web API だった
— 成熟した API クライアントライブラリ msgraph.go があった
— 頑張って⾃動コード⽣成した恩恵があった (仕様のブレ・実装の漏れがない)
— azuread provider のコードが参考になった
— Terraform の DAG workflow engine の凄さを思い知った
— ベンチマークで単純なスクリプトや azuread provider と性能⽐較してみた
14. Azure AD ベンチマーク
— 次の Azure AD リソースを作成・削除
— 100 ×ユーザー
— 10 ×グループ
— 100 ×グループ・ユーザー関係
— 9 × グループ・グループ関係
グループ
ユーザー
グループ内のグループ
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}"
}
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
19. 今後の予定
— Azure AD リソースのテスト・安定化
— プロダクションで azuread provider を置き換えられるレベルを⽬指す
— Office 365 リソース対応
— msgraph_team: Team が作れる
— msgraph_drive, msgraph_drive_item: OneDrive のファイルを読み書き
— msgraph_workbook, msgraph_worksheet: Excel Online アクセス
— ⾃動⽣成
— msgraph.go と同様なコード⾃動⽣成を⽬指したい、が難しそう