SlideShare a Scribd company logo
1 of 20
Download to read offline
Microsoft Open Tech Night #6 w/ HashiCorp Japan
2020-02-18 Takeshi Yaegashi
⾃⼰紹介
⼋重樫 剛史 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」
今⽇の話題
Terraform Provider for Microsoft Graph
https://github.com/yaegashi/terraform-provider-msgraph
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 ⽉に⼊ってから…
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 のみ)
msgraph provider 開発の進捗
— まだプロダクションで使えるレベルではない
— v0.0.2 で azuread provider と同程度のリソースをテスト実装
— msgraph_user
— msgraph_group
— msgraph_group_member
— msgraph_application
— msgraph_application_password
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"
}
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
}
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
}
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"
}
}
}
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"
}
}
}
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"
}
ここまで作ってみた感想
— msgraph provider の開発⾃体は容易だった
— terraform-plugin-sdk がよくできていた
— Microsoft Graph が素直な RESTful Web API だった
— 成熟した API クライアントライブラリ msgraph.go があった
— 頑張って⾃動コード⽣成した恩恵があった (仕様のブレ・実装の漏れがない)
— azuread provider のコードが参考になった
— Terraform の DAG workflow engine の凄さを思い知った
— ベンチマークで単純なスクリプトや azuread provider と性能⽐較してみた
Azure AD ベンチマーク
— 次の Azure AD リソースを作成・削除
— 100 ×ユーザー
— 10 ×グループ
— 100 ×グループ・ユーザー関係
— 9 × グループ・グループ関係
グループ
ユーザー
グループ内のグループ
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}"
}
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
}
ベンチマークの結果
スクリプト 並列度 作成 (秒) 削除 (秒) 備考
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
ベンチマークの考察
— 使⽤したスクリプトの場所
— 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 に移⾏しよう!
今後の予定
— Azure AD リソースのテスト・安定化
— プロダクションで azuread provider を置き換えられるレベルを⽬指す
— Office 365 リソース対応
— msgraph_team: Team が作れる
— msgraph_drive, msgraph_drive_item: OneDrive のファイルを読み書き
— msgraph_workbook, msgraph_worksheet: Excel Online アクセス
— ⾃動⽣成
— msgraph.go と同様なコード⾃動⽣成を⽬指したい、が難しそう
おわり

More Related Content

More from yaegashi

AnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + αAnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + αyaegashi
 
msgraph-sshpubkey
msgraph-sshpubkeymsgraph-sshpubkey
msgraph-sshpubkeyyaegashi
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Goyaegashi
 
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話yaegashi
 
golang binary hacks
golang binary hacksgolang binary hacks
golang binary hacksyaegashi
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件yaegashi
 
Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献yaegashi
 

More from yaegashi (7)

AnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + αAnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + α
 
msgraph-sshpubkey
msgraph-sshpubkeymsgraph-sshpubkey
msgraph-sshpubkey
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Go
 
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話
 
golang binary hacks
golang binary hacksgolang binary hacks
golang binary hacks
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献
 

Terraform Provider for Microsoft Graph

  • 1. Microsoft Open Tech Night #6 w/ HashiCorp Japan 2020-02-18 Takeshi Yaegashi
  • 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. 今⽇の話題 Terraform Provider for Microsoft Graph https://github.com/yaegashi/terraform-provider-msgraph
  • 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 }
  • 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. 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}" }
  • 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. ベンチマークの結果 スクリプト 並列度 作成 (秒) 削除 (秒) 備考 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. ベンチマークの考察 — 使⽤したスクリプトの場所 — 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. 今後の予定 — Azure AD リソースのテスト・安定化 — プロダクションで azuread provider を置き換えられるレベルを⽬指す — Office 365 リソース対応 — msgraph_team: Team が作れる — msgraph_drive, msgraph_drive_item: OneDrive のファイルを読み書き — msgraph_workbook, msgraph_worksheet: Excel Online アクセス — ⾃動⽣成 — msgraph.go と同様なコード⾃動⽣成を⽬指したい、が難しそう