AzureにおけるAPIの使い方
本記事では、以下2つのAPIを叩くスタート地点までのやり方をまとめようと思います。
Azure Resource Manager REST API
Microsoft Graph API
azコマンドでも大抵のことはできますが、一部の操作はAPIでしか実施できない場合もあり、使い方を知っていると役立つ場面があります。
事前準備
APIの認証に必要なアクセストークンを取得するには、ログインしておく必要があります。
az login
URLと認証コードが表示されるので、アクセスしてアカウントを選択、ログイン認証を行います。
スクリプトによる自動化に組み込む場合はサービスプリンシパルを使うと思いますが、その場合は、以下のようになります。
az login --service-principal -u {application_id} -p {client_secret} --tenant {tenant_id} --allow-no-subscriptions
--allow-no-subscriptions オプションによって、サービスプリンシパルが参照可能なサブスクリプションがない場合でもログインできるようになります。
Azure Resource Manager REST API
こちらはAzureのリソースを管理するためのAPIです。
ログインしたら、アクセストークンを取得します。
token=$(az account get-access-token --query accessToken --output tsv)
手動でAPIを叩く分には、変数に入れなくても使えますが、非常に長い文字列なので、変数化した方がいいでしょう。
トークンを取得したら、APIを叩きます。
基本的に以下のような形式です。
curl -s -H "Authorization: Bearer $token" -H 'Content-Type: application/json' -X GET https://management.azure.com{resource_id}?api-version=2021-04-01
{resource_id} はAzureのリソース個々に振られたIDです。
/subscriptions から始まるもので、ポータルのプロパティ画面やjson表示の画面で確認できます。
api-version はリソースの種類によってまちまちなようなので、必要に応じて変更します。
結果はjson形式で返ってくるので、jqコマンドなどでの分析が可能です。
APIを叩くことより、その後の分析の方が難しいのではないかと思います。
Azure Resource Manager REST API おまけ
curl -s -H "Authorization: Bearer $token" -H 'Content-Type: application/json' -X GET https://management.azure.com/subscriptions/{subscription_id}/resourceGroups/{resource_group_name}/resources?api-version=2021-04-01
リソースグループの全リソースの情報を取得する方法です。
curl -s -H "Authorization: Bearer $token" -H 'Content-Length: 0' -X POST {url}
AzureにはPOSTメソッドのAPIもありますが、POSTの場合、実際にPOSTするデータがない場合でも、'Content-Length: 0' を付ける必要があります。
Microsoft Graph API
こちらはEntra IDを管理するためのAPIです。
まずはアクセストークンを取得します。
token=$(az account get-access-token --resource https://graph.microsoft.com --query accessToken --output tsv)
Azure Resource Managerの場合とほとんど同じですが、--resource でGraphを指定しています。それによって、Graph API用のアクセストークンが取得できます。
ユーザ一覧を取得するAPIの叩き方は、以下のようになります。
curl -H "Authorization: Bearer $token" -H "Content-Type: application/json" https://graph.microsoft.com/v1.0/users
Entra IDの管理には適切な権限が付与されている必要があり、Azureのリソースに対して最高レベルの権限があるユーザアカウントでも、Entra IDの一部の情報にはアクセスできなかったりします。
ユーザに権限を付与する方法はよく分からないのですが、サービスプリンシパルであれば、Entra IDのサービスプリンシパルの画面にて、APIのアクセス許可を設定することができます。
ユーザアカウントでの権限不足エラーがどうしても解消できない場合は、自動化するつもりがなくても、サービスプリンシパルを試してみるといいかもしれません。
補足:azコマンドが使えない場合
アクセストークンの取得はazコマンドで行う形で書いてきましたが、場合によってはazコマンドを使うことができないこともあります。
その場合は、アクセストークンの取得もcurlで行うことができます。
サービスプリンシパルを使用する場合、以下のコマンドでアクセストークンを取得することができます。
(2つ書きましたが、POSTするデータの扱いが異なるだけで、結果はどちらでも同じです。)
curl -F 'client_id={application_id}' -F 'scope={url_for_resource_type}/.default' -F 'client_secret={client_secret}' -F 'grant_type=client_credentials' -X POST https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token
curl -H "Content-Type: application/x-www-form-urlencoded" -d "client_id={application_id}&client_secret={client_secret}&grant_type=client_credentials&scope={url_for_resource_type}/.default" -X POST https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token
{url_for_resource_type} は使用したいAPIの種類に応じて設定します。
Azure Resource Manager REST API であれば、
https://management.azure.com
Microsoft Graph API であれば、
https://graph.microsoft.com
となります。
curlを実行すると有効期限などの情報を含んだjsonで結果が返るので、jqでアクセストークン部分だけを抜き出します。
jq -r .access_token
アクセストークンを変数に格納する場合は、以下のようになります。
token=`curl -F 'client_id={application_id}' -F 'scope={url_for_resource_type}/.default' -F 'client_secret={client_secret}' -F 'grant_type=client_credentials' -X POST https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token | jq -r .access_token`
token=`curl -H "Content-Type: application/x-www-form-urlencoded" -d "client_id={application_id}&client_secret={client_secret}&grant_type=client_credentials&scope={url_for_resource_type}/.default" -X POST https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token | jq -r .access_token`