SlideShare a Scribd company logo
msgraph: Terraform Provider for Microsoft Graph
八重樫 剛史 Takeshi Yaegashi
BANDAI NAMCO Studios Inc.
自己紹介
八重樫 剛史 Takeshi Yaegashi
株式会社バンダイナムコスタジオ BANDAI NAMCO Studios Inc. 所属
Linux・Unix・OSS が好きなエンジニア 最近は Go 言語が好き
組み込みシステム開発、ゲームサーバ開発、 CI/CD インフラ開発、
開発環境のクラウドシフトなどの業務に従事
活動場所
ホームページ・ブログ https://l0w.dev
GitHub https://github.com/yaegashi
GitLab https://gitlab.com/yaegashi
Twitter https://twitter.com/hogegashi
msgraph: Introduction
msgraph の紹介
Terraform provider for Microsoft Graph とは?
▪ Terraform から Microsoft Graph を扱うための非公式のプロバイダです
https://github.com/yaegashi/terraform-provider-msgraph
▪ 短く msgraph provider と呼んでいます
Microsoft Graph とは?
▪ Microsoft 365 クラウドサービスのバックエンドとなる統一 API です
https://developer.microsoft.com/ja-jp/graph
▪ アイデンティティ管理基盤の Azure Active Directory も包含しており、
Azure クラウドサービスの利用とも深い関係があります!
Official Terraform providers for Azure
Terraform による Azure の対応状況は?
▪ HashiCorp が公式にメンテナンスするプロバイダが 2 つあります
– azurerm: Azure Resource Manager
https://github.com/terraform-providers/terraform-provider-azurerm
– azuread: Azure Active Directory
https://github.com/terraform-providers/terraform-provider-azuread
azurerm vs. azuread
プロバイダ azurerm azuread
開発・保守 HashiCorp HashiCorp
ライブラリ Azure SDK for Go Azure SDK for Go
API Azure Resource Manager
Azure Active Directory Graph
2022/06 終了予定
機能
仮想マシン、ストレージ、
マネージド DB や K8s など
Azure のほとんどのサービス
ユーザー、グループ、アプリケー
ションなどの ID 管理
azuread provider をとりまく状況
API: Azure AD Graph の廃止と MS Graph 移行の要請
▪ Azure AD Graph は古い API - 2022 年 6 月 30 日で廃止のアナウンス
▪ MS Graph は新しい API - Azure AD Graph の機能も包含している
▪ すでに Azure AD Graph への新機能の追加は止まっている
Library: azuread provider の Azure SDK for Go への依存
▪ Azure SDK は Azure AD Graph のみに対応しており MS Graph は使えない
▪ 公式の MS Graph SDK には Go 言語のサポートがない
azuread provider issues
Microsoft Graph でなければ対応できない案件が過半を占める
状況に一石を投じる msgraph.go
msgraph.go とは?
▪ 非公式の Go 言語用 MS Graph ライブラリです
https://github.com/yaegashi/msgraph.go
▪ 会社の Office 365 をいじるために Go 言語でツールを自作したのが始まり
▪ Go Conference 2019 Autumn で発表
msgraph provider の誕生
Terraform provider の開発
▪ terraform-plugin-sdk を使用する
https://github.com/hashicorp/terraform-plugin-sdk
▪ msgraph.go のようなライブラリがあれば Terraform provider 開発は容易
msgraph provider を開発する意義
▪ azuread provider の補完と代替
▪ Azure SDK for Go の代わりに msgraph.go を使用
▪ Azure AD Graph では実現できないことを MS Graph で実現する
azuread vs. msgraph
プロバイダ azuread msgraph
開発・保守 HashiCorp コミュニティ
ライブラリ
Azure SDK for Go
(Microsoft)
msgraph.go
(コミュニティ)
API
Azure Active Directory Graph
2022/06 終了予定
Microsoft Graph
機能
ユーザー、グループ、アプリケー
ションなどの ID 管理
ID 管理、ファイル、メール、カレン
ダー、サイト、チームなどの
Microsoft 365 サービスのリソー
スすべて (予定)
msgraph:
Features and Performance
azuread_user vs. msgraph_user
CODE EDITOR
resource "azuread_user" "azuread_user_1" {
user_principal_name = "azureaduser1@l0wdev.onmicrosoft.com"
display_name = "AzureAD User 1"
mail_nickname = "azureaduser1"
password = "Secret123456!"
}
resource "msgraph_user" "msgraph_user_1" {
user_principal_name = "msgraphuser1@l0wdev.onmicrosoft.com"
display_name = "MSGraph User 1"
mail_nickname = "msgraphuser1"
password = "Secret123456!"
account_enabled = true
}
azuread_group vs. msgraph_group
CODE EDITOR
resource "azuread_group" "azuread_group_1" {
name = "AzureAD Group 1"
// members = [azuread_user.azuread_user_1.id]
}
resource "azuread_group_member" "azuread_group_member_1" {
group_object_id = azuread_group.azuread_group_1.id
member_object_id = azuread_user.azuread_user_1.id
}
resource "msgraph_group" "msgraph_group_1" {
display_name = "MSGraph Group 1"
mail_nickname = "msgraphgroup1"
}
resource "msgraph_group_member" "msgraph_group_member_1" {
group_id = msgraph_group.msgraph_group_1.id
member_id = msgraph_user.msgraph_user_1.id
}
azuread_application vs. ...
CODE EDITOR
resource "azuread_application" "azuread_app" {
name = "AzureAD App"
homepage = "http://localhost:8080"
reply_urls = ["http://localhost:8080"]
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 "azuread_application_password" "azuread_app_password" {
application_object_id = azuread_application.azuread_app.id
description = "AzureAD App Password"
value = "Secret123456!"
end_date = "2100-01-01T00:00:00Z"
}
... vs. msgraph_application
CODE EDITOR
resource "msgraph_application" "msgraph_app" {
display_name = "MSGraph App"
sign_in_audience = "AzureADMyOrg"
redirect_uris = ["http://localhost:8080"]
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 "msgraph_application_password" "msgraph_app_password" {
application_id = msgraph_application.msgraph_app.id // Object ID
display_name = "MSGraph App Password"
end_date_time = "2100-01-01T00:00:00Z"
}
ベンチマークテスト
大量のユーザー・グループの作成・削除にかかる時間を比較
▪ 100 Users
▪ 10 Groups
▪ 100 User-in-Group memberships
▪ 9 Group-in-Group memberships
msgraph_user×100, msgraph_group×10
CODE EDITOR
resource "msgraph_user" "bench_users" {
count = 100
user_principal_name = "benchuser${count.index}@l0wdev.onmicrosoft.com"
display_name = "bench user ${count.index}"
mail_nickname = "benchuser${count.index}"
account_enabled = true
}
resource "msgraph_group" "bench_groups" {
count = 10
display_name = "bench group ${count.index}"
mail_nickname = "benchgroup${count.index}"
}
msgraph_group_member×(100+9)
CODE EDITOR
resource "msgraph_group_member" "bench_group_user_members" {
count = 100
group_id = msgraph_group.bench_groups[count.index % 10].id
member_id = msgraph_user.bench_users[count.index].id
}
resource "msgraph_group_member" "bench_group_group_members" {
count = 9
group_id = msgraph_group.bench_groups[count.index].id
member_id = msgraph_group.bench_groups[count.index + 1].id
}
ベンチマークテスト結果
100 users, 10 groups, 109 memberships (単位: 秒)
Terraform
azuread provider
Terraform
msgraph provider
msgraph.go
逐次処理プログラム
並列度 作成 削除 作成 削除 作成 削除
×1 >1000? ? 103.473 107.952 82.119 42.548
×10
(デフォルト)
125.191 12.832 12.568 12.632
×100 30.266 10.745 7.550 7.943
備考 遅すぎるため
並列度 ×1 は未計測
速い! シングルスレッドにつき
並列度は ×1 のみ
https://github.com/yaegashi/terraform-provider-msgraph/tree/master/tests/benchmark
ベンチマークテスト考察
msgraph は azuread に比べてとても速い
▪ MS Graph のサーバはとても高速で頑健
▪ Azure AD Graph のサーバはたまにリクエストが失敗するらしい?
– azuread provider では対策としてリソース作成ごとに GET して確認しているようだ
– msgraph provider では何もしていないがエラーらしいエラーは起きたことがない
Terraform のワークフローエンジンの威力
▪ 宣言的なリソース定義のおかげで、作るのも壊すのも最速の手順で実行してくれる
▪ 命令的なプログラムや構成管理ツールに対する Terraform の優位点
msgraph: Conclusion
msgraph まとめ
msgraph provider とその周辺の話題を紹介しました
▪ Terraform の Azure 対応状況について
▪ API について: Azure AD Graph と MS Graph
▪ ライブラリについて: Azure SDK for Go と msgraph.go
▪ azuread と msgraph の使用法の比較・ベンチマークテスト
Azure を使っている方は msgraph をぜひ使ってみてください!
msgraph これから
正式リリースに向けた作業
▪ 利用者向けドキュメントの整備
▪ Terraform Registry への登録
https://registry.terraform.io
Better azuread alternative を目指す
▪ azuread provider が持つ機能はすべて実装したい
▪ OneDrive や Teams など Microsoft 365 リソースに対応したい
Thank You!
hugs@hashicorp.com
learn.hashicorp.com
discuss.hashicorp.com
25
hugs@hashicorp.com
learn.hashicorp.com
discuss.hashicorp.com
26

More Related Content

What's hot

cocos2d-xとCocosBuilderでゲームを作ってみよう
cocos2d-xとCocosBuilderでゲームを作ってみようcocos2d-xとCocosBuilderでゲームを作ってみよう
cocos2d-xとCocosBuilderでゲームを作ってみよう
Tomoaki Shimizu
 

What's hot (20)

msgraph-sshpubkey
msgraph-sshpubkeymsgraph-sshpubkey
msgraph-sshpubkey
 
Cocos2d-x(JS) ハンズオン #10「3D機能とVR機能」
Cocos2d-x(JS) ハンズオン #10「3D機能とVR機能」Cocos2d-x(JS) ハンズオン #10「3D機能とVR機能」
Cocos2d-x(JS) ハンズオン #10「3D機能とVR機能」
 
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料
Nuxt.js入門 2018/02/02 Vue.js入門勉強会@渋谷 発表資料
 
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
 
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
Cocos2d-x(JS) ハンズオン #08「様々な画像描画方法」
 
Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」
Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」
Cocos2d-x(JS) ハンズオン #02 「画像表示とアクション」
 
Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」
Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」
Cocos2d-x(JS) ハンズオン #06「3rd SDKの導入を簡単にするSDKBOX」
 
Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」
Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」
Cocos2d-x(JS) ハンズオン #09「ラベル・テキストボックス」
 
Cc dx lib72-p
Cc dx lib72-pCc dx lib72-p
Cc dx lib72-p
 
Cocos2d xで簡単なゲームを作ってみよう!
Cocos2d xで簡単なゲームを作ってみよう!Cocos2d xで簡単なゲームを作ってみよう!
Cocos2d xで簡単なゲームを作ってみよう!
 
Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」
Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」
Cocos2d-x(JS) ハンズオン #03「複数あるボタンの使い分け」
 
「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)
「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)
「釣り★スタ」でのCocos2d-JSを使ってのアプリアップデート事例 (1)
 
React VR ことはじめ
React VR ことはじめReact VR ことはじめ
React VR ことはじめ
 
Rancher で Docker 利用!
Rancher で Docker 利用!Rancher で Docker 利用!
Rancher で Docker 利用!
 
Cocos2d-x実践講座 in 鹿児島
Cocos2d-x実践講座 in 鹿児島Cocos2d-x実践講座 in 鹿児島
Cocos2d-x実践講座 in 鹿児島
 
cocos2d-xとCocosBuilderでゲームを作ってみよう
cocos2d-xとCocosBuilderでゲームを作ってみようcocos2d-xとCocosBuilderでゲームを作ってみよう
cocos2d-xとCocosBuilderでゲームを作ってみよう
 
Cocos2d-x 3D Extension
Cocos2d-x 3D ExtensionCocos2d-x 3D Extension
Cocos2d-x 3D Extension
 
C# でブロックチェーン実装
C# でブロックチェーン実装C# でブロックチェーン実装
C# でブロックチェーン実装
 
Cocos2d-x(JS)の紹介
Cocos2d-x(JS)の紹介Cocos2d-x(JS)の紹介
Cocos2d-x(JS)の紹介
 
Cocos2d-x(JS) ハンズオン #11「2D物理エンジン」
Cocos2d-x(JS) ハンズオン #11「2D物理エンジン」Cocos2d-x(JS) ハンズオン #11「2D物理エンジン」
Cocos2d-x(JS) ハンズオン #11「2D物理エンジン」
 

Similar to msgraph: Terraform provider for Microsoft Graph

Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドMicrosoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Kazumi Hirose
 

Similar to msgraph: Terraform provider for Microsoft Graph (20)

Azure <3 Openness
Azure <3 OpennessAzure <3 Openness
Azure <3 Openness
 
俺とHashiCorp
俺とHashiCorp俺とHashiCorp
俺とHashiCorp
 
Introduction to extensions and other useful features for developing apps usin...
Introduction to extensions and other useful features for developing apps usin...Introduction to extensions and other useful features for developing apps usin...
Introduction to extensions and other useful features for developing apps usin...
 
夏サミ2013 Hadoopを使わない独自の分散処理環境の構築とその運用
夏サミ2013 Hadoopを使わない独自の分散処理環境の構築とその運用夏サミ2013 Hadoopを使わない独自の分散処理環境の構築とその運用
夏サミ2013 Hadoopを使わない独自の分散処理環境の構築とその運用
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Go
 
Ignite 2021秋 recap - 開発者向け新機能紹介
Ignite 2021秋 recap - 開発者向け新機能紹介Ignite 2021秋 recap - 開発者向け新機能紹介
Ignite 2021秋 recap - 開発者向け新機能紹介
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説
 
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドMicrosoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
 
マルチテナント Hadoop クラスタのためのモニタリング Best Practice
マルチテナント Hadoop クラスタのためのモニタリング Best Practiceマルチテナント Hadoop クラスタのためのモニタリング Best Practice
マルチテナント Hadoop クラスタのためのモニタリング Best Practice
 
Parse触ってみた
Parse触ってみたParse触ってみた
Parse触ってみた
 
徳島OSS勉強会第四回 シラサギハンズオン 0925
徳島OSS勉強会第四回 シラサギハンズオン 0925徳島OSS勉強会第四回 シラサギハンズオン 0925
徳島OSS勉強会第四回 シラサギハンズオン 0925
 
シラサギハンズオン 東京
シラサギハンズオン 東京シラサギハンズオン 東京
シラサギハンズオン 東京
 
知っておきたいWordPress開発環境 2016年10月編
知っておきたいWordPress開発環境 2016年10月編知っておきたいWordPress開発環境 2016年10月編
知っておきたいWordPress開発環境 2016年10月編
 
ゆるふわAzure Functions
ゆるふわAzure FunctionsゆるふわAzure Functions
ゆるふわAzure Functions
 
シラサギハンズオン 大阪
シラサギハンズオン 大阪シラサギハンズオン 大阪
シラサギハンズオン 大阪
 
Azure DevOps で始めるスタートダッシュ
Azure DevOps で始めるスタートダッシュAzure DevOps で始めるスタートダッシュ
Azure DevOps で始めるスタートダッシュ
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
 
初めてのPadrino
初めてのPadrino初めてのPadrino
初めてのPadrino
 
多要素認証による Amazon WorkSpaces の利用
多要素認証による Amazon WorkSpaces の利用多要素認証による Amazon WorkSpaces の利用
多要素認証による Amazon WorkSpaces の利用
 

More from yaegashi (7)

go generate 完全入門
go generate 完全入門go generate 完全入門
go generate 完全入門
 
msgraph.go: Go言語で Microsoft Graph プログラミング
msgraph.go: Go言語で Microsoft Graph プログラミングmsgraph.go: Go言語で Microsoft Graph プログラミング
msgraph.go: Go言語で Microsoft Graph プログラミング
 
AnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + αAnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + α
 
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 モジュール 作成・配布・貢献
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 

Recently uploaded (10)

YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 

msgraph: Terraform provider for Microsoft Graph

  • 1. msgraph: Terraform Provider for Microsoft Graph 八重樫 剛史 Takeshi Yaegashi BANDAI NAMCO Studios Inc.
  • 2. 自己紹介 八重樫 剛史 Takeshi Yaegashi 株式会社バンダイナムコスタジオ BANDAI NAMCO Studios Inc. 所属 Linux・Unix・OSS が好きなエンジニア 最近は Go 言語が好き 組み込みシステム開発、ゲームサーバ開発、 CI/CD インフラ開発、 開発環境のクラウドシフトなどの業務に従事 活動場所 ホームページ・ブログ https://l0w.dev GitHub https://github.com/yaegashi GitLab https://gitlab.com/yaegashi Twitter https://twitter.com/hogegashi
  • 4. msgraph の紹介 Terraform provider for Microsoft Graph とは? ▪ Terraform から Microsoft Graph を扱うための非公式のプロバイダです https://github.com/yaegashi/terraform-provider-msgraph ▪ 短く msgraph provider と呼んでいます Microsoft Graph とは? ▪ Microsoft 365 クラウドサービスのバックエンドとなる統一 API です https://developer.microsoft.com/ja-jp/graph ▪ アイデンティティ管理基盤の Azure Active Directory も包含しており、 Azure クラウドサービスの利用とも深い関係があります!
  • 5. Official Terraform providers for Azure Terraform による Azure の対応状況は? ▪ HashiCorp が公式にメンテナンスするプロバイダが 2 つあります – azurerm: Azure Resource Manager https://github.com/terraform-providers/terraform-provider-azurerm – azuread: Azure Active Directory https://github.com/terraform-providers/terraform-provider-azuread
  • 6. azurerm vs. azuread プロバイダ azurerm azuread 開発・保守 HashiCorp HashiCorp ライブラリ Azure SDK for Go Azure SDK for Go API Azure Resource Manager Azure Active Directory Graph 2022/06 終了予定 機能 仮想マシン、ストレージ、 マネージド DB や K8s など Azure のほとんどのサービス ユーザー、グループ、アプリケー ションなどの ID 管理
  • 7. azuread provider をとりまく状況 API: Azure AD Graph の廃止と MS Graph 移行の要請 ▪ Azure AD Graph は古い API - 2022 年 6 月 30 日で廃止のアナウンス ▪ MS Graph は新しい API - Azure AD Graph の機能も包含している ▪ すでに Azure AD Graph への新機能の追加は止まっている Library: azuread provider の Azure SDK for Go への依存 ▪ Azure SDK は Azure AD Graph のみに対応しており MS Graph は使えない ▪ 公式の MS Graph SDK には Go 言語のサポートがない
  • 8. azuread provider issues Microsoft Graph でなければ対応できない案件が過半を占める
  • 9. 状況に一石を投じる msgraph.go msgraph.go とは? ▪ 非公式の Go 言語用 MS Graph ライブラリです https://github.com/yaegashi/msgraph.go ▪ 会社の Office 365 をいじるために Go 言語でツールを自作したのが始まり ▪ Go Conference 2019 Autumn で発表
  • 10. msgraph provider の誕生 Terraform provider の開発 ▪ terraform-plugin-sdk を使用する https://github.com/hashicorp/terraform-plugin-sdk ▪ msgraph.go のようなライブラリがあれば Terraform provider 開発は容易 msgraph provider を開発する意義 ▪ azuread provider の補完と代替 ▪ Azure SDK for Go の代わりに msgraph.go を使用 ▪ Azure AD Graph では実現できないことを MS Graph で実現する
  • 11. azuread vs. msgraph プロバイダ azuread msgraph 開発・保守 HashiCorp コミュニティ ライブラリ Azure SDK for Go (Microsoft) msgraph.go (コミュニティ) API Azure Active Directory Graph 2022/06 終了予定 Microsoft Graph 機能 ユーザー、グループ、アプリケー ションなどの ID 管理 ID 管理、ファイル、メール、カレン ダー、サイト、チームなどの Microsoft 365 サービスのリソー スすべて (予定)
  • 13. azuread_user vs. msgraph_user CODE EDITOR resource "azuread_user" "azuread_user_1" { user_principal_name = "azureaduser1@l0wdev.onmicrosoft.com" display_name = "AzureAD User 1" mail_nickname = "azureaduser1" password = "Secret123456!" } resource "msgraph_user" "msgraph_user_1" { user_principal_name = "msgraphuser1@l0wdev.onmicrosoft.com" display_name = "MSGraph User 1" mail_nickname = "msgraphuser1" password = "Secret123456!" account_enabled = true }
  • 14. azuread_group vs. msgraph_group CODE EDITOR resource "azuread_group" "azuread_group_1" { name = "AzureAD Group 1" // members = [azuread_user.azuread_user_1.id] } resource "azuread_group_member" "azuread_group_member_1" { group_object_id = azuread_group.azuread_group_1.id member_object_id = azuread_user.azuread_user_1.id } resource "msgraph_group" "msgraph_group_1" { display_name = "MSGraph Group 1" mail_nickname = "msgraphgroup1" } resource "msgraph_group_member" "msgraph_group_member_1" { group_id = msgraph_group.msgraph_group_1.id member_id = msgraph_user.msgraph_user_1.id }
  • 15. azuread_application vs. ... CODE EDITOR resource "azuread_application" "azuread_app" { name = "AzureAD App" homepage = "http://localhost:8080" reply_urls = ["http://localhost:8080"] 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 "azuread_application_password" "azuread_app_password" { application_object_id = azuread_application.azuread_app.id description = "AzureAD App Password" value = "Secret123456!" end_date = "2100-01-01T00:00:00Z" }
  • 16. ... vs. msgraph_application CODE EDITOR resource "msgraph_application" "msgraph_app" { display_name = "MSGraph App" sign_in_audience = "AzureADMyOrg" redirect_uris = ["http://localhost:8080"] 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 "msgraph_application_password" "msgraph_app_password" { application_id = msgraph_application.msgraph_app.id // Object ID display_name = "MSGraph App Password" end_date_time = "2100-01-01T00:00:00Z" }
  • 18. msgraph_user×100, msgraph_group×10 CODE EDITOR resource "msgraph_user" "bench_users" { count = 100 user_principal_name = "benchuser${count.index}@l0wdev.onmicrosoft.com" display_name = "bench user ${count.index}" mail_nickname = "benchuser${count.index}" account_enabled = true } resource "msgraph_group" "bench_groups" { count = 10 display_name = "bench group ${count.index}" mail_nickname = "benchgroup${count.index}" }
  • 19. msgraph_group_member×(100+9) CODE EDITOR resource "msgraph_group_member" "bench_group_user_members" { count = 100 group_id = msgraph_group.bench_groups[count.index % 10].id member_id = msgraph_user.bench_users[count.index].id } resource "msgraph_group_member" "bench_group_group_members" { count = 9 group_id = msgraph_group.bench_groups[count.index].id member_id = msgraph_group.bench_groups[count.index + 1].id }
  • 20. ベンチマークテスト結果 100 users, 10 groups, 109 memberships (単位: 秒) Terraform azuread provider Terraform msgraph provider msgraph.go 逐次処理プログラム 並列度 作成 削除 作成 削除 作成 削除 ×1 >1000? ? 103.473 107.952 82.119 42.548 ×10 (デフォルト) 125.191 12.832 12.568 12.632 ×100 30.266 10.745 7.550 7.943 備考 遅すぎるため 並列度 ×1 は未計測 速い! シングルスレッドにつき 並列度は ×1 のみ https://github.com/yaegashi/terraform-provider-msgraph/tree/master/tests/benchmark
  • 21. ベンチマークテスト考察 msgraph は azuread に比べてとても速い ▪ MS Graph のサーバはとても高速で頑健 ▪ Azure AD Graph のサーバはたまにリクエストが失敗するらしい? – azuread provider では対策としてリソース作成ごとに GET して確認しているようだ – msgraph provider では何もしていないがエラーらしいエラーは起きたことがない Terraform のワークフローエンジンの威力 ▪ 宣言的なリソース定義のおかげで、作るのも壊すのも最速の手順で実行してくれる ▪ 命令的なプログラムや構成管理ツールに対する Terraform の優位点
  • 23. msgraph まとめ msgraph provider とその周辺の話題を紹介しました ▪ Terraform の Azure 対応状況について ▪ API について: Azure AD Graph と MS Graph ▪ ライブラリについて: Azure SDK for Go と msgraph.go ▪ azuread と msgraph の使用法の比較・ベンチマークテスト Azure を使っている方は msgraph をぜひ使ってみてください!
  • 24. msgraph これから 正式リリースに向けた作業 ▪ 利用者向けドキュメントの整備 ▪ Terraform Registry への登録 https://registry.terraform.io Better azuread alternative を目指す ▪ azuread provider が持つ機能はすべて実装したい ▪ OneDrive や Teams など Microsoft 365 リソースに対応したい