かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.60 Azure REST APIサンプルスクリプト強化版|Azure&Entra IDスクリプト大作戦(7)

 

 

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
画面1 おまけのサンプルスクリプト「getjsonfromazrest.ps1」でカスタムURIを入力して実行し、JSONファイルとCSVファイルを作成した例

 

スクリプト強化版はURI増強とカスタムURI指定を改善

 

 サンプルスクリプトの強化版「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
画面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
画面3 強化版スクリプトでは、Azure REST APIのリファレンスページからコピーしたURIの多くをそのまま入力して実行できる

 

Azure ADはMicrosoft Entraに引っ越しました

 

 Subscriptions - ListTenants - 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
画面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)
“一部のリスト操作では、応答本文で というプロパティ nextLink が返されます。 このプロパティは、結果が大きすぎて 1 つの応答で返しきれなすぎる場合に表示されます。 通常、リスト操作で 1,000 個を超える項目が返される場合、応答には nextLink プロパティが含まれます。 nextLink が結果に存在しない場合、返される結果は完了です。 nextLink に URL が含まれている場合、返される結果は結果セット全体の一部に過ぎません。”
Microsoft Graph の操作に関するベスト プラクティス|Microsoft Graph(Microsoft Learn)
“リソース コレクションのクエリを実行する場合、Microsoft Graph が返す結果セットは、サーバー側のページ サイズ制限が原因で複数ページになることを想定する必要があります。 要求セットが複数ページにまたがる場合、Microsoft Graph は、結果の次ページへの URL を格納する @odata.nextLink プロパティを応答で返します。”

 

 Azure REST APIやMicrosoft Graph REST APIは、初めて触れてから、まだ数日しかたっておらず(このブログ執筆時点で)、引き続き学び、検証していきますが、この「Azure&Entra IDスクリプト大作戦」シリーズは、ひとまず作戦終了ということにします。

 

 

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_2024fh_TOP5

最新記事