セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ vol.60 Azure REST APIサンプルスクリプト強化版|Azure&Entra IDスクリプト大作戦(7)
2024年11月14日配信
2024年11月14日更新
執筆者:山内 和朗
前々回(vol.58)と前回(vol.59)は、Microsoft Graph REST APIの話でしたが、最後にもう一度、Azure REST APIに戻ります。vol.56では「おまけのサンプルスクリプト」として、詳しい説明はしていませんが、Azure REST APIからリソース情報を取得するPowerShellサンプルスクリプト「getjsonfromazrest.ps1」を紹介しました。このサンプルスクリプト、その後のAzureリソース情報の調査で期待以上の活躍をしてくれたので、今回はこのサンプルスクリプトをさらに強化したいと思います。
おまけのサンプルスクリプト「getjsonfromazrest.ps1」(プレーンテキストで表示)は、あらかじめサービスプリンシパルの「アプリケーション(クライアントID)」「クライアントシークレットの値」「サブスクリプションID」「テナントID」をそれぞれ、スクリプト内の「$clientid」「$clientsecret」「$subscriptionid」「$tenantid」に定義しておくことで、Azure REST APIに接続するためのアクセストークンを取得し、メニューから選択したリクエストURI、またはカスタムURI(いずれもGETのみ)に要求を送信して、応答をJSON形式で取得するように作ってあります。JSON形式で保存したい場合は、パスの入力を求められたときに保存先パスを指定してください。保存先パスの指定に関わらず、スクリプトは結果をPowerShellのオブジェクトとして返します。要求の送信に使用しているPowerShell標準の「Invoke-RestMethod」コマンドレットは、JSON形式で送られてきた応答を、PowerShellオブジェクトに自動変換するからです。サンプルスクリプトでは、保存先パスを指定した場合、「ConvertTo-Json」コマンドレットでJSON形式に戻して保存します。
このサンプルスクリプトは、Azure REST APIからのリソース情報を、PowerShellオブジェト、またはJSONファイル、またはその両方で取得できるものです。スクリプト一回の実行で、JSON形式のテキストファイルでAzureのリソース情報を取得でき、さらにPowerShellオブジェクトを操作して、特定の条件に一致する情報を検索したり、一覧を「Export-Csv」コマンドレットを使用してCSV形式で保存したりすることができます(画面1)。これまでAzureのリソース情報の取得についていろいろと調査する中で、このスクリプトのカスタムURIの実行機能は、簡単に作ったスクリプトにもかかわらず、期待以上に活躍しました。
画面1 おまけのサンプルスクリプト「getjsonfromazrest.ps1」でカスタムURIを入力して実行し、JSONファイルとCSVファイルを作成した例
サンプルスクリプトの強化版「getjsonfromazrest_v2.ps1」(プレーンテキストで表示)のコードの説明を詳しくするつもりはありません。以前のときと同様に、プレーンテキストとしてコピー&ペーストできるようにしておきました。
以前のサンプルスクリプト「getjsonfromazrest.ps1」はメニューから選択できるリクエストURIは3つだけでしたが、サンプルスクリプトの強化版「getjsonfromazrest_v2.ps1」では大幅に増強し、以下のAPIリファレンスで示されている情報の取得に対応しました。サブスクリプション、テナント、リソース、リソースグループ、ストレージアカウント、Azure仮想マシン(VM)およびVM(スケールセットは除く)に関連するリソース関連のものです(画面2)。
Subscriptions - List|REST API(Microsoft Learn)
Tenants - List|REST API(Microsoft Learn)
Resources - List|REST API(Microsoft Learn)
Resource Groups - List|REST API(Microsoft Learn)
Virtual Machines - List|REST API(Microsoft Learn)
Disks - List|REST API(Microsoft Learn)
Virtual Networks - List|REST API(Microsoft Learn)
Network Interfaces - List|REST API(Microsoft Learn)
Public IP Addresses - List|REST API(Microsoft Learn)
Network Security Groups - List|REST API(Microsoft Learn)
Network Interface Load Balancers - List|REST API(Microsoft Learn)
Storage Accounts - List|REST API(Microsoft Learn)
Blob Services - List|REST API(Microsoft Learn)
Blob Containers - List|REST API(Microsoft Learn)
File Services - List|REST API(Microsoft Learn)
File Shares - List|REST API(Microsoft Learn)
Queue - List|REST API(Microsoft Learn)
Table Services - List|REST API(Microsoft Learn)
Storage Task Assignments - List|REST API(Microsoft Learn)
Vaults - List By Resource Group|REST API(Microsoft Learn)
Virtual Machine Size - List|REST API(Microsoft Learn)
Resource Skus - List|REST API(Microsoft Learn)
サンプルスクリプトには含めていませんが、Azure VMの自動シャットダウンの設定の取得には、次のAPIを使用できます。この API を見つけるのには苦労しました。
Global Schedules - List By Resource Group|REST API(Microsoft Learn)
画面2 メニューから選択可能なAPIのリクエストURIは、以前の3つから22に大幅に増強
また、以前はカスタムURIの指定で{subscriptionId}というキーワードを指定できましたが、強化版ではさらに{resourceGroupName}(リソースグループ名)と{location}(場所)と{vmName}(VM名)と{accountName}(ストレージアカウント名)などのキーワードへの対応を追加し、必要に応じて入力を対話的に求めるようにしました(注: 対応しきれていないキーワードが残っている可能性があります。その場合、スクリプトの実行は失敗します)。さらに、APIリファレンスページのクリップボードにコピーする機能で取得した文字列をそのまま貼り付けることができるように、「GET 」から始まる文字列から「GET 」を削除するようにしました。画面3の例は、以下のAPIにアクセスしてVMの状態を取得している例です。このページの「Copy」をクリックして、サンプルスクリプトに対話的に貼り付けて実行すれば、リソースグループ名とVM名の入力が求められます。
Virtual Machines - Instance View|REST API(Microsoft Learn)
画面3 強化版スクリプトでは、Azure REST APIのリファレンスページからコピーしたURIの多くをそのまま入力して実行できる
Subscriptions - ListとTenants - Listのリファレンスページを見ると、前者では「tenantid」(テナントID、ディレクトリ)を、後者では「tenantid」に対応する「displayName」(表示名)、「domains[]」(1つ以上のドメイン名)と「defaultDomain」(既定のドメイン名)の情報を取得できそうに見えます。しかし、実際にはどちらもできませんでした。テナントの表示名やドメイン名は、Azureポータルの「サブスクリプション」ブレードに表示されますが、それらの情報を取得できそうなAPIで取得できないのです。分かるのは、「Tenants - List」へのアクセスに使用しているアカウントに関連付けられた「tenantid」までです。
これまでの連載で説明したように、以前は「Azure Active Directory(Azure AD)」と呼ばれていたAzureで管理されるクラウド向けのID/ディレクトリサービスは、現在は「Microsoft Entra ID」と呼ばれ、以前のようにAzureの配下ではなく、「Microsoft Entra」の配下に移行されました。テナント情報の多くがAzure REST API経由で取得できなくなったことは、おそらくこれが関係しているのでしょう。
私が確認した限りでは、テナントの表示名とドメイン名については、Microsoft Graph REST APIの以下のAPIを使用して取得するしかなさそうです(画面4)。Microsoft Graph REST APIへのアクセスについては、前々回(vol.58)と前回(vol.59)の記事をご覧ください。Azure REST APIとでは、アクセストークンの取得方法や、アプリケーションに対するAPIのアクセス許可設定が必要な点が異なります。テナント情報の取得は、組織のアカウント(ユーザープリンシパル)とアプリケーション(サービスプリンシパル)がサポートされ(Microsoftアカウントは非サポート)、ユーザーやアプリケーション(サービスプリンシパル)に最低でも「CrossTenantInformation.ReadBasic.All」に対する管理者による同意のアクセス許可が必要です。つまり、Azure REST APIからのリソース情報の取得とは、まったく別に行う必要があります。
tenantRelationship: findTenantInformationByTenantId|Microsoft Graph API(Microsoft Learn)
画面4 テナントID以外のテナント情報の取得は、Azure REAT APIではできなくなった模様。Microsoft Graph APIを使用する必要があった
以前はOffice 365(現在のMicrosoft 365)がAzureの中にあるAzure Active Directory(Azure AD、現在のEntra ID)の機能を間借りしていたのに対して、現在はAzure ADがMicrosoft Entraに引っ越してしまい、AzureがEntra ID(旧Azure AD)の機能を間借りしているとイメージすると分かりやすいかもしれません。古くからAzureを使用している方の中には、Azureから情報を取得できるなら組織のユーザーIDやMicrosoft 365アプリの情報も同じ方法で取得できるはずだと思うかもしれませんが、実際にはそうではありません。
応答に含まれるアイテムが大量になる場合Azure REST APIとMicrosoft Graph REST APIはどちらも、リクエストに対する応答の結果セット(アイテム)が多くなる場合、1回の応答ですべての情報を返さない場合があるようです。その場合、nextLinkプロパティに続きの結果を取得するためのURLが示されるそうです。
Azure REST API リファレンス|Azure(Microsoft Learn) |
Azure REST APIやMicrosoft Graph REST APIは、初めて触れてから、まだ数日しかたっておらず(このブログ執筆時点で)、引き続き学び、検証していきますが、この「Azure&Entra IDスクリプト大作戦」シリーズは、ひとまず作戦終了ということにします。
「Azure&Entra IDスクリプト大作戦」シリーズの目次
vol.54 Azure&Entra IDの情報取得、スクリプト大作戦 |