Azure CLI query(JMESPath)マスター|出力から必要な情報を抽出する技
生徒
「Azure CLI(アジュール・シーエルアイ)でコマンドを実行すると、結果がすごく長く返ってきて、どこに何があるか分かりにくいです。特定の情報だけ抜き出す方法はありますか?」
先生
「確かに、初期設定だとJSON形式で大量のデータが表示されますね。そんな時は『query(クエリ)』オプションを使えば、必要な項目だけをフィルタリングして表示させることができますよ。」
生徒
「クエリ…ですか。なんだか難しそうですが、初心者でも使いこなせるでしょうか?」
先生
「大丈夫です!JMESPath(ジェイムズパス)というルールを少し覚えるだけで、エンジニアのように自由自在にデータを操れるようになります。基礎から一緒に学んでいきましょう!」
1. Azure CLIのqueryとJMESPathとは?
Azure CLI(コマンドライン・インターフェース)を利用してリソースの情報を取得する際、標準ではJSON(ジェイソン)という形式で全てのデータが出力されます。しかし、実際の運用では「仮想マシンの名前だけ知りたい」「特定のIPアドレスだけ抽出したい」といった場面が多々あります。
ここで登場するのが--queryオプションです。この背後で動いているのがJMESPath(ジェイムズパス)というクエリ言語です。JMESPathは、複雑な構造を持つデータの中から、特定の条件に一致する値を探し出したり、形を整えたりするための強力なツールです。これを使えるようになると、スクリプト作成や自動化の効率が劇的に向上します。
2. 基本の「き」!特定のプロパティを抽出する
まずは最もシンプルな使い方から学習しましょう。一つの項目だけを取得する方法です。例えば、リソースグループの一覧から「名前」だけを表示させてみます。Azure CLIの出力は基本的に配列(リスト)形式になっていることが多いため、まずはデータの構造を意識することが大切です。
以下のコマンドでは、リソースグループの名前(name)だけを抽出しています。ブラケット([ ])を使うことで、配列の中にある全ての要素に対して処理を行うという意味になります。
az group list --query "[].name"
[
"rg-web-prod",
"rg-db-prod",
"rg-test-environment"
]
このように、余計な情報を削ぎ落として必要な文字だけを表示できました。これがクエリの第一歩です。
3. 複数の項目を同時に取得する方法
名前だけでなく、場所(location)や状態(provisioningState)も一緒に確認したい場合があります。複数の項目を抽出するには、波括弧({ })を使って、新しいオブジェクト(データの塊)を作成します。このとき、表示名:元の名前という形式で、出力結果に独自のラベルを付けることも可能です。
これをマスターすれば、報告書用のリスト作成なども一瞬で終わります。初心者の方は、まずこの「カンマ区切りで複数の値を指定する」方法を覚えましょう。
az group list --query "[].{GroupName:name, Location:location}"
[
{
"GroupName": "rg-web-prod",
"Location": "japaneast"
},
{
"GroupName": "rg-db-prod",
"Location": "japaneast"
}
]
4. 条件指定でデータを絞り込むフィルタリング
全てのデータを表示するのではなく、「東日本リージョン(japaneast)にあるものだけ」といった条件を付けたい時は、?(疑問符)を使ったフィルタリング機能を利用します。これを使いこなすと、大量のリソースの中から特定の対象を即座に見つけ出せるようになります。
条件式の中では、比較演算子(==, !=, <, > など)を使用します。文字列を比較する場合は、シングルクォート(' ')で囲む必要がある点に注意してください。初心者の方がよくつまずくポイントですので、コマンドの書き方をよく見て練習しましょう。
az vm list --query "[?location=='japaneast'].name"
[
"vm-web-01",
"vm-app-01"
]
5. 文字列の検索や部分一致を活用する
完全一致だけでなく、「名前の中に特定の文字が含まれているか」を確認したいこともあります。JMESPathには関数が用意されており、contains関数を使うことで、部分一致による検索が可能です。例えば「prod」という名前が含まれるリソースグループだけを探すといった操作が簡単に行えます。
プログラミング経験がない方でも、この関数の書き方さえ覚えれば、高度な検索がコマンド一行で実現できます。クラウド管理において、命名規則に沿ったリソース管理をしている場合には非常に重宝するテクニックです。
az group list --query "[?contains(name, 'prod')].name"
[
"rg-web-prod",
"rg-db-prod"
]
6. 最初の1つだけを取得するインデックス指定
出力結果が配列である場合、その中の「1番目のデータだけが欲しい」というケースがあります。これはプログラミングの世界で「インデックス」と呼ばれる番号指定で解決できます。番号は0から始まるため、1番目は [0]、2番目は [1] と記述します。
特に自動化スクリプトを組む際、確実に一つの値を特定の変数に入れたい時などに役立ちます。最新のリソースだけを取得したい場合や、存在確認のために最初の要素だけを見る際にも有効な手法です。
az group list --query "[0].name"
"rg-web-prod"
7. 出力形式(TSVやTable)との組み合わせ
ここまではJSON形式での出力を中心に解説しましたが、Azure CLIには --output(または -o)というオプションがあります。これを tsv(タブ区切り)や table(表形式)に設定し、queryと組み合わせることで、人間が読みやすい形式、あるいは他のプログラムで処理しやすい形式に変換できます。
特に tsv 形式は、クォーテーション(" ")が付かない生のデータとして出力されるため、Linuxのシェル変数に代入して再利用する際に非常に便利です。クエリで絞り込み、アウトプットで整形する。この二段構えがAzure CLIマスターへの近道です。
az vm list --query "[].{Name:name, OS:storageProfile.osDisk.osType}" -o table
Name OS
--------- -------
vm-web-01 Linux
vm-db-01 Linux
vm-win-01 Windows
8. 階層の深いデータを掘り進めるドット記法
Azureのリソースデータは、箱の中にさらに箱が入っているような「階層構造(かいそうこうぞう)」になっています。例えば、仮想マシンのネットワーク設定の深い場所にある情報を取得したい場合は、ドット(.)を使って繋いでいきます。これを「ドット記法」と呼びます。
一見複雑に見えるかもしれませんが、データの構造を左から右へ順に辿っていくだけです。もし構造が分からない場合は、一度クエリなしで実行して全体を表示させ、目的の項目がどの項目の中に入っているかを確認しながらパスを組み立てていきましょう。
az vm show -g rg-web-prod -n vm-web-01 --query "storageProfile.osDisk.name"
"osdisk_vmlinux_20260331"
9. 数値計算や最大値・最小値の取得
JMESPathには、単純な抽出だけでなく、計算や統計のような機能も備わっています。例えば、配列の要素数を数える length 関数を使えば、現在リソースグループがいくつ存在するかを即座に数値で知ることができます。わざわざ行数を数える必要はありません。
その他にも、数値データの最大値(max)や最小値(min)を取得する関数などもあります。リソースの使用量やクォータの制限値を確認する際、パッと状況を把握するのに役立ちます。初心者の方も、まずは要素数を数えることから試してみてください。
az group list --query "length(@)"
3
※ここで使っている @(アットマーク)は、現在の出力結果そのものを指す特殊な記号です。
まとめ
Azure CLI(アジュール・シーエルアイ)の運用において、膨大なJSONデータから必要な情報だけを抽出する「query」オプションと「JMESPath(ジェイムズパス)」の活用がいかに重要か、ご理解いただけたでしょうか。クラウド環境の管理は、リソースが増えれば増えるほど情報の整理が困難になります。今回学習した基本のプロパティ抽出から、フィルタリング、関数の利用、そして出力形式の整形までを組み合わせることで、手作業での確認時間を大幅に削減し、ミスを防ぐことが可能になります。
JMESPath活用のポイント再確認
JMESPathを使いこなすためのコツは、データの構造を「階層」として捉えることです。角括弧 [] で配列を走査し、ドット . で深い階層へ潜り、波括弧 {} で新しい形に整える。この一連の流れを意識するだけで、複雑なコマンドもシンプルに構造化できます。また、実務では単に表示するだけでなく、シェルスクリプトやオートメーションツールに値を渡すための「前処理」としてクエリを利用する場面が非常に多くなります。
さらなるステップアップ:応用サンプルコード
ここでは、学んだ内容をさらに深めるために、実戦でよく使われる少し高度なクエリの例を紹介します。例えば、特定のタグが付与されているリソースのみを抽出し、その名前とタグの値を表形式で表示するシナリオです。
az resource list --query "[?tags.Environment=='Production'].{ResourceName:name, CreatedBy:tags.Owner}" -o table
ResourceName CreatedBy
-------------- -----------
sql-prod-db Tanaka
app-prod-srv Sato
storage-prod Suzuki
このように、タグ情報をキーにしてフィルタリングを行う手法は、コスト管理やプロジェクトごとの資産管理において極めて有効です。また、Linuxの環境変数に特定のIDを代入したい場合は、下記のようにクエリと -o tsv を組み合わせるのが定石です。
VM_ID=$(az vm show -g rg-web-prod -n vm-web-01 --query "id" -o tsv)
echo $VM_ID
/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-web-prod/providers/Microsoft.Compute/virtualMachines/vm-web-01
他言語やSQLとの比較で理解を深める
データの抽出という考え方は、C#(シーシャープ)のLINQ(リンク)や、データベース操作で使われるSQL(エスキューエル)とも非常に似ています。例えば、SQLで特定の条件のデータを取得する操作をJMESPathで表現していると考えると、理解がスムーズになります。
まず、元となる仮想マシンの管理用テーブル(イメージ)を確認してみましょう。
id | vm_name | location | status | owner
---+------------+-----------+---------+---------
1 | vm-web-01 | japaneast | running | Tanaka
2 | vm-db-01 | japaneast | stopped | Sato
3 | vm-test-01 | westus | running | Suzuki
4 | vm-app-01 | japaneast | running | Takahashi
このデータに対して、「東日本(japaneast)で稼働中(running)のサーバー名を取得する」という操作をSQLとC#で見てみましょう。
SELECT vm_name
FROM virtual_machines
WHERE location = 'japaneast' AND status = 'running';
vm_name
------------
vm-web-01
vm-app-01
同様のロジックをC#のプログラムで記述する場合は、以下のようになります。
var runningVMs = allVMs
.Where(v => v.Location == "japaneast" && v.Status == "running")
.Select(v => v.VmName);
foreach (var name in runningVMs)
{
Console.WriteLine(name);
}
Azure CLIの --query "[?location=='japaneast' && provisioningState=='Succeeded'].name" という記述も、これらのプログラミング手法と根本的な考え方は同じであることがわかります。
エンジニアが知っておくべき補足事項
最後に、JMESPathを使用する際の注意点として、大文字と小文字の区別(ケースセンシティブ)が挙げられます。Azure CLIの出力プロパティ名は、コマンドによって「CamelCase」だったり「lower-case」だったりすることがあります。クエリがうまく動かない時は、まず -o json で生のデータを確認し、正確なキーの名前を把握することが解決の近道です。
これからもAzure CLIを活用し、効率的でミスのないクラウドインフラ運用のスキルを磨いていきましょう。
生徒
「先生、ありがとうございました!最初は --query の中身が呪文のように見えましたが、分解してみると意外とシンプルなんですね。特に -o tsv と組み合わせて変数に入れる方法は、明日からのスクリプト作成にすぐ使えそうです!」
先生
「その通りです。一つ一つの記号に意味があることを知れば、怖いものはありません。特に [? ... ] のフィルタリングは、大規模な環境になればなるほど必須のテクニックになります。今回、C#のLINQやSQLとの比較も紹介しましたが、何か気づいたことはありますか?」
生徒
「はい!『条件で絞って、必要な形に整形する』という流れは、どんな言語でも共通なんだなと感動しました。JMESPathの contains 関数を使って、特定の名前に一致するリソースを抽出するのも、SQLの LIKE 検索みたいで覚えやすかったです。」
先生
「鋭いですね。その共通点に気づけると、新しい技術の習得も早くなりますよ。ちなみに、もっと複雑な集計が必要になった場合は、出力をJSONのままにして、後段の処理をPythonやPowerShellで細かく制御するという手もありますが、まずはAzure CLI単体でここまでできることを知っておくのが強みになります。」
生徒
「なるほど。まずはこの query オプションを使い倒して、スマートに情報を抜き出せるよう練習します!あ、あと最後に一つ、もし検索結果が空だった場合はどうなるんでしょうか?」
先生
「良い質問ですね。その場合は空の配列 [] や null が返ってきます。自動化の際は、結果が空だった時のエラーハンドリングも考慮しておくと、よりプロフェッショナルなスクリプトになりますよ。これからもどんどん実践していきましょう!」
生徒
「はい、頑張ります!ありがとうございました!」