スクリプトで使用する変数を設定する

チュートリアルのこのステップでは、変数を操作する方法について説明します。

  • 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-ContentWhere-ObjectSelect-Object

次の手順

変数を使って Azure CLI コマンドの出力と JSON プロパティの値を格納する方法がわかったので、スクリプトを使って Azure リソースを削除する方法を学習する次のステップに進んでください。