スクリプトで使用する変数を設定する
チュートリアルのこのステップでは、変数を操作する方法について説明します。
- Azure CLI コマンドを実行し、出力を変数に格納します。
- ローカル JSON ファイルを読み取り、プロパティの値を変数に格納します。
変数には次のような一般的なユース ケースがあります。
- リソース ID など、既存の Azure リソースに関する情報を取得します。
- パスワードなど、Azure CLI コマンドから出力を取得します。
- 開発、ステージ、運用の ID など、環境情報に関する JSON オブジェクトを取得します。
その後、Azure CLI で変数を使って、構築と破棄のジョブを大規模に実行できます。
前提条件
- ストレージ アカウント レベルで
reader
以上のアクセス許可を持つリソース グループとストレージ アカウントにアクセスできます。
JMESPath クエリを使用してコマンドの出力を取得する
既存の Azure リソースに関する情報を取得するには、show
コマンドの --query
パラメーターを使います。 JMESPath クエリが実行されて、Azure リソースの 1 つ以上のプロパティの値が返されます。
ヒント
--query
の構文は、大文字と小文字が区別され、"環境に固有" です。 空の結果を受け取る場合は、大文字と小文字を確認してください。 「Bash、PowerShell、Cmd での Azure CLI 構文の違いについて学習する」で学習した規則を適用して、引用符に関するエラーを防いでください
--output
パラメーターを指定しないと、これらの例では、「Azure CLI の環境を準備する」で設定した json
の既定の出力構成が使われます
Azure リソースの JSON ディクショナリのプロパティを取得する
「Bash、PowerShell、Cmd での Azure CLI 構文の違いについて学習する」で作成したストレージ アカウントを使って、新しいストレージ アカウントの primaryEndpoints
を取得します。
az storage account show --resource-group <msdocs-tutorial-rg-00000000> \
--name <msdocssa000000000> \
--query primaryEndpoints
コンソールへの JSON ディクショナリの出力:
{
"blob": "https://msdocssa00000000.blob.core.windows.net/",
"dfs": "https://msdocssa00000000.dfs.core.windows.net/",
"file": "https://msdocssa00000000.file.core.windows.net/",
"internetEndpoints": null,
"microsoftEndpoints": null,
"queue": "https://msdocssa00000000.queue.core.windows.net/",
"table": "https://msdocssa00000000.table.core.windows.net/",
"web": "https://msdocssa00000000.z13.web.core.windows.net/"
}
個々の JSON オブジェクトを取得する
配列 (リスト) で個々のプロパティを取得するには、ストレージ アカウントのプロパティのコンマ区切りリストを指定します。
az storage account show --resource-group <msdocs-tutorial-rg-00000000> \
--name <msdocssa000000000> \
--query "[id, primaryLocation, primaryEndpoints.blob, encryption.services.blob.lastEnabledTime]"
コンソールへの JSON 配列の出力:
[
"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/msdocs-tutorial-rg-00000000/providers/Microsoft.Storage/storageAccounts/ msdocssa000000000",
"eastus",
"https://msdocssa000000000.blob.core.windows.net/",
"yyyy-mm-ddT19:11:56.399484+00:00"
]
プロパティの名前を変更する
中かっこ ({}
) とコンマ区切りのリストを使って、プロパティの名前を変更します。 新しいプロパティ名にスペースを含めることはできません。 この例では、table
形式で出力が返されます。
az storage account show --resource-group <msdocs-tutorial-rg-00000000> \
--name <msdocssa000000000> \
--query "{saName:name, saKind:kind, saMinTLSVersion:minimumTlsVersion}" \
--output table
コンソールへのテーブルの出力。 --output table
では、各列の最初の文字が大文字になります。
SaName SaKind SaMinTLSversion
----------------- --------- -----------------
msdocssa000000000 StorageV2 TLS1_0
クエリ結果をフィルター処理する
引用符について学んだことと、--query
について学んだばかりのことを組み合わせます。 これらの例では、フィルターを適用します。
Bash では、等号 (=
) 記号の前後にスペースを入れることはできません。 変数の値は引用符を使って囲むこともできるため、msdocs-tutorial-rg-00000000
と "msdocs-tutorial-rg-00000000"
はどちらも正しい書き方です。
rgName="<msdocs-tutorial-rg-00000000>"
# Get a list of all Azure storage accounts that allow blob public access.
# Notice the backticks and escape characters needed for boolean values.
az storage account list --resource-group $rgName \
--query "[?allowBlobPublicAccess == \`true\`].name"
# Get a list of Azure storage accounts that were created in the last 30 days. Return the results as a table.
saDate=$(date +%F -d "-30days")
az storage account list --resource-group $rgName \
--query "[?creationTime >='$saDate'].{saName:name, createdTimeStamp:creationTime}" \
--output table
# Get a list of Azure storage accounts created in this tutorial
az storage account list --resource-group $rgName \
--query "[?contains(name, 'msdocs')].{saName:name, saKind:kind, saPrimaryLocation:primaryLocation, createdTimeStamp:creationTime}" \
--output table
出力を変数に格納する新しい Azure リソースを作成する
変数にコマンドの出力を格納する方法を学んでおくと、保護する必要があるシークレットを出力する Azure リソースを作成するときに役に立ちます。 たとえば、サービス プリンシパルの作成、資格情報のリセット、Azure キー コンテナーのシークレットの取得などを行うときに、コマンドの出力を保護する必要があります。
新しい Azure キー コンテナーとシークレットを作成して、コマンドの出力を変数に返します。 Azure キー コンテナーの名前はグローバルに一意にする必要があるため、この例では $RANDOM
識別子を使います。 Azure Key Vault の名前付け規則について詳しくは、「Azure Key Vault の一般的なエラー コード」をご覧ください。
これは学習のためのチュートリアルなので、これらの例では echo
を使って変数の値を検証します。 運用レベルの環境では、シークレットとパスワードの値には echo
を使わないでください。
# Set your variables.
let "randomIdentifier=$RANDOM*$RANDOM"
rgName="<msdocs-tutorial-rg-00000000>"
kvName="msdocs-kv-$randomIdentifier"
location="eastus"
# Set your default output to none
az config set core.output=none
# Create a new Azure Key Vault returning the Key Vault ID
myNewKeyVaultID=$(az keyvault create --name $kvName --resource-group $rgName --location $location --query id --output tsv)
echo "My new Azure Kev Vault ID is $myNewKeyVaultID"
# Wait about 1 minute for your Key Vault creation to complete.
# Create a new secret returning the secret ID
kvSecretName="<myKVSecretName>"
kvSecretValue="<myKVSecretValue>"
myNewSecretID=$(az keyvault secret set --vault-name $kvName --name $kvSecretName --value $kvSecretValue --query id --output tsv)
echo "My new secret ID is $myNewSecretID"
# Reset your default output to json
az config set core.output=json
JSON ファイルの内容を取得して変数に格納する
この次のセクションは、オンボード チュートリアルの "発展タスク" です。 ただし、開発、ステージング、運用の各環境で Azure リソースを管理するときは、構成ファイルの読み取りが必要になることがよくあります。
Azure CLI のスキルをさらに伸ばす準備はできていますか。 次の JSON または任意の内容を含む JSON ファイルを作成します。 このテキスト ファイルをローカル ドライブに保存します。 Azure Cloud Shell で作業している場合は、メニュー バーの upload/download files
アイコンを使って、テキスト ファイルをクラウド ストレージ ドライブに格納します。
{
"environments": {
"dev": [
{
"id": "1",
"kv-secretName": "dev1SecretName",
"status": "inactive",
},
{
"id": "2",
"kv-secretName": "dev2SecretName",
"status": "active"
}
],
"stg": {
"id": "3",
"kv-secretName": "dev3SecretName"
},
"prod": {
"id": "4",
"kv-secretName": "dev4SecretName"
}
}
}
Azure CLI コマンドでさらに使うために、JSON ファイルの内容を変数に格納します。 この例では、msdocs-tutorial.json
をお使いのファイルの名前に変更してください。 出力がログ ファイルに保存されるため、運用レベルのスクリプトには echo
コマンドを保存しないでください。
この Bash スクリプトは、Azure Cloud Shell でテストされており、お使いの環境にインストールされている必要がある Bash jq に依存します。
# Show the contents of a file in the console
fileName="msdocs-tutorial.json"
cat $fileName | jq
# Get a JSON dictionary object
stgKV=$(jq -r '.environments.stg."kv-secretName"' $fileName)
echo $stgKV
# Filter a JSON array
devKV=$(jq -r '.environments.dev[] | select(.status=="active") | ."kv-secretName"' $fileName)
echo $devKV
"jq コマンドが見つからない" というエラーが表示されましたか。 これは、このスクリプトが Bash の jq コマンドに依存しているためです。 環境に jq をインストールするか、Azure Cloud Shell でこのスクリプトを実行してください。
これで、環境に固有の Azure Key Vault シークレット名が変数に格納され、それを使って Azure リソースに接続できるようになりました。 これと同じ方法は、Azure CLI スクリプトを再利用する場合に、Azure VM と SQL Server の接続文字列の IP アドレスに適しています。
詳細を取得する
このチュートリアル手順で説明したテーマのいずれかについてさらなる詳細が必要ですか? 次の表のリンクを使用してさらに学習してください。
サブジェクト | 詳細情報 |
---|---|
変数 | 詳細な例については、Azure CLI の正しい使い方に関する記事の「別のコマンドへ値を渡す」をご覧ください |
変数のことがよくわかる概要については、「Azure CLI のコマンドで変数を使用する方法」をご覧ください。 | |
クエリ実行 | さまざまな例については、「JMESPath クエリを使用して Azure CLI コマンドの出力に対してクエリを実行する方法」をご覧ください。 |
Bash での --query の使用について詳しくは、「Bash を Azure CLI で使用する方法について説明します」をご覧ください。 |
|
Azure Key Vault | Azure Key Vault について |
Azure のロールベースのアクセス制御を使用して Key Vault のキー、証明書、シークレットへのアクセス権を提供する。 | |
Azure Key Vault の一般的なエラー コード | |
PowerShell | リファレンスのリンク: Get-Content、Where-Object、Select-Object |
次の手順
変数を使って Azure CLI コマンドの出力と JSON プロパティの値を格納する方法がわかったので、スクリプトを使って Azure リソースを削除する方法を学習する次のステップに進んでください。
Azure CLI