演習 - ARM テンプレート テスト ツールキットを使用して、テンプレートに優れたプラクティスを適用する
あなたは、Tailwind Traders 社の開発チームの一員です。 その作業の一環として、クラウドにリソースをデプロイして管理するために Azure Resource Manager (ARM) テンプレートを作成する必要があります。 リソースをデプロイする前に、テンプレートがいくつかの適切なプラクティスに従っていることを確認する必要があります。 あなたは、あらゆる問題を修正できるように、テンプレートの分析に役立つ ARM テンプレート テスト ツールキットを使用することにしました。
テスト環境を設定する
このツールは PowerShell モジュールです。 これを実行できるようにするには、次の手順に従います。
- PowerShell モジュールをインストールします。 このタスクの実行方法は、Linux、Mac、Windows のいずれを使用しているかによって異なります。
- モジュールをダウンロードします。 このモジュールは GitHub リポジトリでホストされています。 そこからダウンロードすることも、
git clone
コマンドを使用してフェッチすることもできます。 - モジュールをインポートします。 このステップは、PowerShell セッションに入る単なる 1 行の命令で、これにより ARM-TTK コマンドが使用できるようになります。
PowerShell をインストールする
PowerShell をインストールするには、「Linux への PowerShell のインストール」の手順に従います。
ターミナルで
pwsh
を実行して、インストールを確認します。pwsh
次のような内容が出力されます。
PowerShell 7.0.3 Copyright (c) Microsoft Corporation. All rights reserved. https://aka.ms/powershell Type 'help' to get help.
テスト ツールキットをダウンロードする
テスト ツールキットは、GitHub リポジトリにあります。 次の操作のいずれかを選択します。
git clone
を実行して、リポジトリをクローンします。git clone https://github.com/Azure/arm-ttk.git
ブラウザーから、リポジトリを .zip ファイルとしてダウンロードします。
テスト ツールキットを調べる
テスト ツールキットを選択したディレクトリにダウンロードしました。 ディレクトリ構造を見てみましょう。 (git clone
コマンドを実行する代わりに .zip ファイルをダウンロードすることを選択した場合は、ファイルが解凍されていることを確認してください。)ARM テスト ツールキットのディレクトリに移動すると、次のようなディレクトリ構造になっているはずです。
-| arm-ttk/
-| unit-tests/
-| CODE_OF_CONDUCT.md
-| LICENCE.md
-| README.md
-| SECURITY.md
テスト ツールキットは、サブディレクトリ /arm-ttk にあります。
テンプレート ファイルを作成する
ディレクトリを選択して、azuredeploy.json という名前のファイルを作成します。
警告
選択したディレクトリは空で、サブディレクトリが含まれていないことを確認してください。
次のような内容を指定します。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for the resources."
}
}
},
"resources": [{
"location": "westus"
}]
}
テンプレート ファイルの場所を記録しておきます。 ターミナルでコマンド pwd
を実行して、パスを出力できます。 このパスは、後でテスト ツールキットを実行するときにパラメーターとして使用します。
テスト ツールキットを実行し、テンプレートの問題を検出して修正する
Visual Studio Code と統合ターミナルを開始することをお勧めします。
デプロイ テンプレートが含まれているパスでテスト ツールキットを実行し、テンプレートを変更することによって検出されたエラーを修正します。
警告
この演習では、1 つのテンプレート ファイルをスキャンします。 テスト ツールキットにより、指定したディレクトリの下にあるすべてのファイルがスキャンされます。 この動作は、デプロイに複数のファイルが含まれている可能性があるためです。 azuredeploy.json が配置されているディレクトリの下に JSON ファイルがないことを確認してください。
ターミナルで、azuredeploy.json ファイルが置かれているパスに移動します。 次のコマンドを実行して Visual Studio Code を開始します。
code .
Note
Visual Studio Code がパス上にない場合は、手動で Visual Studio Code を開き、テンプレート ディレクトリを開きます。
Visual Studio Code で、上部のメニューから [ターミナル]>[新しいターミナル] を選択して統合ターミナルを開きます。 ターミナルで次のコマンドを実行して、PowerShell シェルを開始します。
pwsh
次のような出力が表示されるはずです。
PowerShell 7.0.3 Copyright (c) Microsoft Corporation. All rights reserved. https://aka.ms/powershell Type 'help' to get help.
テンプレートを分析する
Import-Module
を実行して、どこからでもテストを実行できるようにします。Note
モジュールをインポートする前に、path/to/arm-ttk/arm-ttk.psd1 をダウンロードしたテスト ツールキットへのパスに置き換えます。
Import-Module path/to/arm-ttk/arm-ttk.psd1
ヒント
ツールを Downloads ディレクトリにダウンロードまたはクローンした場合、パスは "/Users/<ユーザー>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1" のようになります。
これで、ツールを使用する準備が整いました。 同じ PowerShell セッションを使用している限り、インポート コマンドをもう一度実行する必要はありません。
Test-AzTemplate
を実行し、パラメーター-TemplatePath
でテンプレート ファイルのパスを指定します (ファイル名は除く)。Test-AzTemplate -TemplatePath .
次のような出力がターミナルに表示されます。
Validating deploy\azuredeploy.json deploymentTemplate [+] adminUsername Should Not Be A Literal (4 ms) [+] apiVersions Should Be Recent (2 ms) [+] artifacts parameter (1 ms) [+] DependsOn Best Practices (2 ms) [+] Deployment Resources Must Not Be Debug (2 ms) [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms) [+] DeploymentTemplate Schema Is Correct (1 ms) [+] Dynamic Variable References Should Not Use Concat (1 ms) [+] IDs Should Be Derived From ResourceIDs (3 ms) [+] Location Should Not Be Hardcoded (1 ms) [+] ManagedIdentityExtension must not be used (2 ms) [+] Min And Max Value Are Numbers (1 ms) [+] Outputs Must Not Contain Secrets (4 ms) [-] Parameters Must Be Referenced (2 ms) Unreferenced parameter: location [+] Parameters Property Must Exist (1 ms) [+] providers apiVersions Is Not Permitted (1 ms) [+] ResourceIds should not contain (1 ms) [-] Resources Should Have Location (8 ms) Resource Location must be an expression or 'global' [+] Secure String Parameters Cannot Have Default (1 ms) [+] Template Should Not Contain Blanks (1 ms) [+] Variables Must Be Referenced (1 ms) [+] Virtual Machines Should Not Be Preview (3 ms) [+] VM Images Should Use Latest Version (1 ms) [+] VM Size Should Be A Parameter (3 ms)
出力で、2 つのテストが失敗していることを確認します。Resources Should Have Location と Parameters Must Be Referenced です。 プレフィックス
[-]
は失敗したテストを示します。何が起こっているのかを理解するために、azuredeploy.json ファイルを開きます。 次のようになります。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "location": { "type": "string", "defaultValue": "[resourceGroup().location]", "metadata": { "description": "Location for the resources." } } }, "resources": [{ "location": "westus" }] }
次の 2 つの理由により、テストが失敗しています。
- location パラメーターが使用されていません。 このエラー メッセージは、たとえば、過去にパラメーターを使用して、そのクリーンアップを忘れていることを示している可能性があります。 または、使用する必要があるのに、コードの更新を忘れているのかもしれません。
- location プロパティに、ハードコーディングされた文字列 westus が設定されています。 デプロイ時に入力パラメーターを使用してリソースの場所を制御できるようにしたいので、このオプションの使用はよいプラクティスとは見なされません。
テンプレートに修正を適用する
失敗したテストを修正するにはどうすればよいでしょうか。
テストで示されているように、westus を global というテキストに置き換えることができます。 しかし、それでは問題の 1 つが修正されるだけです。 多くの場合、location パラメーターを使用し、リソースの場所をその値に設定します。
その理由は 2 つあります。 location パラメーターはデプロイのパラメーターとして設定できるだけでなく、デプロイの実行時に location パラメーターの設定を省略した場合に、defaultValue として resourceGroup().location に設定される合理的なフォールバックにもなります。
resources 配列で最初のリソース項目を探し、次の内容を置き換えます。
"resources": [{ "location": "westus" }]
次のような内容にします。
"resources": [{ "location": "[parameters('location')]" }]
統合ターミナルでテスト ツールをもう一度実行して、修正内容を検証します。
Test-AzTemplate -TemplatePath .
これで、すべてのテストに合格したことが出力で示されるようになります。
Validating deploy\azuredeploy.json deploymentTemplate [+] adminUsername Should Not Be A Literal (6 ms) [+] apiVersions Should Be Recent (2 ms) [+] artifacts parameter (1 ms) [+] DependsOn Best Practices (1 ms) [+] Deployment Resources Must Not Be Debug (1 ms) [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms) [+] DeploymentTemplate Schema Is Correct (1 ms) [+] Dynamic Variable References Should Not Use Concat (1 ms) [+] IDs Should Be Derived From ResourceIDs (4 ms) [+] Location Should Not Be Hardcoded (1 ms) [+] ManagedIdentityExtension must not be used (1 ms) [+] Min And Max Value Are Numbers (1 ms) [+] Outputs Must Not Contain Secrets (1 ms) [+] Parameters Must Be Referenced (1 ms) [+] Parameters Property Must Exist (1 ms) [+] providers apiVersions Is Not Permitted (1 ms) [+] ResourceIds should not contain (1 ms) [+] Resources Should Have Location (1 ms) [+] Secure String Parameters Cannot Have Default (1 ms) [+] Template Should Not Contain Blanks (1 ms) [+] Variables Must Be Referenced (1 ms) [+] Virtual Machines Should Not Be Preview (4 ms) [+] VM Images Should Use Latest Version (1 ms) [+] VM Size Should Be A Parameter (4 ms)
Success! テスト ツールを実行し、エラーを検出して修正できました。
「macOS への PowerShell のインストール」の手順に従います。
ターミナルで
pwsh
を実行して、インストールを確認します。pwsh
次のような内容が出力されます。
PowerShell 7.0.3 Copyright (c) Microsoft Corporation. All rights reserved. https://aka.ms/powershell Type 'help' to get help.
テスト ツールキットをダウンロードする
テスト ツールキットは、GitHub リポジトリにあります。 次の操作のいずれかを選択します。
git clone
を実行して、リポジトリをクローンします。git clone https://github.com/Azure/arm-ttk.git
ブラウザーから、リポジトリを .zip ファイルとしてダウンロードします。
テスト ツールキットを調べる
テスト ツールキットを選択したディレクトリにダウンロードしました。 ディレクトリ構造を見てみましょう。 (git clone
コマンドを実行する代わりに .zip ファイルをダウンロードすることを選択した場合は、ファイルが解凍されていることを確認してください。)ARM テスト ツールキットのディレクトリに移動すると、次のようなディレクトリ構造になっているはずです。
-| arm-ttk/
-| unit-tests/
-| CODE_OF_CONDUCT.md
-| LICENCE.md
-| README.md
-| SECURITY.md
テスト ツールキットは、サブディレクトリ /arm-ttk にあります。
テンプレート ファイルを作成する
ディレクトリを選択して、azuredeploy.json という名前のファイルを作成します。
警告
選択したディレクトリは空で、サブディレクトリが含まれていないことを確認してください。
次のような内容を指定します。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for the resources."
}
}
},
"resources": [{
"location": "westus"
}]
}
テンプレート ファイルの場所を記録しておきます。 ターミナルでコマンド pwd
を実行して、パスを出力できます。 このパスは、後でテスト ツールキットを実行するときにパラメーターとして使用します。
テスト ツールキットを実行し、テンプレートの問題を検出して修正する
Visual Studio Code と統合ターミナルを開始することをお勧めします。
デプロイ テンプレートが含まれているパスでテスト ツールキットを実行し、テンプレートを変更することによって検出されたエラーを修正します。
警告
この演習では、1 つのテンプレート ファイルをスキャンします。 テスト ツールキットにより、指定したディレクトリの下にあるすべてのファイルがスキャンされます。 この動作は、デプロイに複数のファイルが含まれている可能性があるためです。 azuredeploy.json が配置されているディレクトリの下に JSON ファイルがないことを確認してください。
ターミナルで、azuredeploy.json ファイルが置かれているパスに移動します。 次のコマンドを実行して Visual Studio Code を開始します。
code .
Note
Visual Studio Code がパス上にない場合は、手動で Visual Studio Code を開き、テンプレート ディレクトリを開きます。
Visual Studio Code で、上部のメニューから [ターミナル]>[新しいターミナル] を選択して統合ターミナルを開きます。 ターミナルで次のコマンドを実行して、PowerShell シェルを開始します。
pwsh
次のような出力が表示されるはずです。
PowerShell 7.0.3 Copyright (c) Microsoft Corporation. All rights reserved. https://aka.ms/powershell Type 'help' to get help.
テンプレートを分析する
Import-Module
を実行して、どこからでもテストを実行できるようにします。Note
モジュールをインポートする前に、path/to/arm-ttk/arm-ttk.psd1 をダウンロードしたテスト ツールキットへのパスに置き換えます。
Import-Module path/to/arm-ttk/arm-ttk.psd1
ヒント
ツールを Downloads ディレクトリにダウンロードまたはクローンした場合、パスは "/Users/<ユーザー>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1" のようになります。
これで、ツールを使用する準備が整いました。 同じ PowerShell セッションを使用している限り、インポート コマンドをもう一度実行する必要はありません。
Test-AzTemplate
を実行し、パラメーター-TemplatePath
でテンプレート ファイルのパスを指定します (ファイル名は除く)。Test-AzTemplate -TemplatePath .
次のような出力がターミナルに表示されます。
Validating deploy\azuredeploy.json deploymentTemplate [+] adminUsername Should Not Be A Literal (4 ms) [+] apiVersions Should Be Recent (2 ms) [+] artifacts parameter (1 ms) [+] DependsOn Best Practices (2 ms) [+] Deployment Resources Must Not Be Debug (2 ms) [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms) [+] DeploymentTemplate Schema Is Correct (1 ms) [+] Dynamic Variable References Should Not Use Concat (1 ms) [+] IDs Should Be Derived From ResourceIDs (3 ms) [+] Location Should Not Be Hardcoded (1 ms) [+] ManagedIdentityExtension must not be used (2 ms) [+] Min And Max Value Are Numbers (1 ms) [+] Outputs Must Not Contain Secrets (4 ms) [-] Parameters Must Be Referenced (2 ms) Unreferenced parameter: location [+] Parameters Property Must Exist (1 ms) [+] providers apiVersions Is Not Permitted (1 ms) [+] ResourceIds should not contain (1 ms) [-] Resources Should Have Location (8 ms) Resource Location must be an expression or 'global' [+] Secure String Parameters Cannot Have Default (1 ms) [+] Template Should Not Contain Blanks (1 ms) [+] Variables Must Be Referenced (1 ms) [+] Virtual Machines Should Not Be Preview (3 ms) [+] VM Images Should Use Latest Version (1 ms) [+] VM Size Should Be A Parameter (3 ms)
上記の出力は、2 つのテストの失敗を示しています。Resources Should have Location と Parameters Must Be Referenced です。 プレフィックス
[-]
は失敗したテストを示します。何が起こっているのかを理解するために、azuredeploy.json ファイルを開きます。 次のようになります。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "location": { "type": "string", "defaultValue": "[resourceGroup().location]", "metadata": { "description": "Location for the resources." } } }, "resources": [{ "location": "westus" }] }
次の 2 つの理由により、テストが失敗しています。
- location パラメーターが使用されていません。 このエラー メッセージは、たとえば、過去にパラメーターを使用して、そのクリーンアップを忘れていることを示している可能性があります。 または、使用する必要があるのに、コードの更新を忘れているのかもしれません。
- location プロパティに、ハードコーディングされた文字列 westus が設定されています。 デプロイ時に入力パラメーターを使用してリソースの場所を制御できるようにしたいので、このオプションの使用はよいプラクティスとは見なされません。
テンプレートに修正を適用する
失敗したテストを修正するにはどうすればよいでしょうか。
テストで示されているように、westus を global というテキストに置き換えることができます。 しかし、それでは問題の 1 つが修正されるだけです。 多くの場合、location パラメーターを使用し、リソースの場所をその値に設定します。
その理由は 2 つあります。 location パラメーターはデプロイのパラメーターとして設定できるだけでなく、デプロイの実行時に location パラメーターの設定を省略した場合に、defaultValue として resourceGroup().location に設定される合理的なフォールバックにもなります。
resources 配列で最初のリソース項目を探し、次の内容を置き換えます。
"resources": [{ "location": "westus" }]
次のような内容にします。
"resources": [{ "location": "[parameters('location')]" }]
統合ターミナルでテスト ツールをもう一度実行して、修正内容を検証します。
Test-AzTemplate -TemplatePath .
これで、すべてのテストに合格したことが出力で示されるようになります。
Validating deploy\azuredeploy.json deploymentTemplate [+] adminUsername Should Not Be A Literal (6 ms) [+] apiVersions Should Be Recent (2 ms) [+] artifacts parameter (1 ms) [+] DependsOn Best Practices (1 ms) [+] Deployment Resources Must Not Be Debug (1 ms) [+] DeploymentTemplate Must Not Contain Hardcoded Uri (1 ms) [+] DeploymentTemplate Schema Is Correct (1 ms) [+] Dynamic Variable References Should Not Use Concat (1 ms) [+] IDs Should Be Derived From ResourceIDs (4 ms) [+] Location Should Not Be Hardcoded (1 ms) [+] ManagedIdentityExtension must not be used (1 ms) [+] Min And Max Value Are Numbers (1 ms) [+] Outputs Must Not Contain Secrets (1 ms) [+] Parameters Must Be Referenced (1 ms) [+] Parameters Property Must Exist (1 ms) [+] providers apiVersions Is Not Permitted (1 ms) [+] ResourceIds should not contain (1 ms) [+] Resources Should Have Location (1 ms) [+] Secure String Parameters Cannot Have Default (1 ms) [+] Template Should Not Contain Blanks (1 ms) [+] Variables Must Be Referenced (1 ms) [+] Virtual Machines Should Not Be Preview (4 ms) [+] VM Images Should Use Latest Version (1 ms) [+] VM Size Should Be A Parameter (4 ms)
Success! テスト ツールを実行し、エラーを検出して修正できました。
- 「Windows への PowerShell のインストール」の手順に従います。
- Visual Studio Code から、PowerShell 拡張機能をインストールします。
テスト ツールキットをダウンロードする
テスト ツールキットは、GitHub リポジトリにあります。 次の操作のいずれかを選択します。
git clone
を実行して、リポジトリをクローンします。git clone https://github.com/Azure/arm-ttk.git
ブラウザーから、リポジトリを .zip ファイルとしてダウンロードします。
テスト ツールキットを調べる
テスト ツールキットを選択したディレクトリにダウンロードしました。 ディレクトリ構造を見てみましょう。 (git clone
コマンドを実行する代わりに .zip ファイルをダウンロードすることを選択した場合は、ファイルが解凍されていることを確認してください。)ARM テスト ツールキットのディレクトリに移動すると、次のようなディレクトリ構造になっているはずです。
-| arm-ttk\
-| unit-tests\
-| CODE_OF_CONDUCT.md
-| LICENCE.md
-| README.md
-| SECURITY.md
テスト ツールキットは、サブディレクトリ \arm-ttk にあります。
テンプレート ファイルを作成する
適当なディレクトリ (C:\Temp など) を選択して、azuredeploy.json という名前のファイルを作成します。
警告
選択したディレクトリは空で、サブディレクトリが含まれていないことを確認してください。
次のような内容を指定します。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Location for the resources."
}
}
},
"resources": [{
"location": "westus"
}]
}
テンプレート ファイルの場所を記録しておきます。 このディレクトリ パス (C:\Temp など) は、後でテスト ツールキットを実行するときにパラメーターとして使用します。
テスト ツールキットを実行し、テンプレートの問題を検出して修正する
Visual Studio Code と統合ターミナルを開始することをお勧めします。
デプロイ テンプレートが含まれているパスでテスト ツールキットを実行し、テンプレートを変更することによって検出されたエラーを修正します。
警告
この演習では、1 つのテンプレート ファイルをスキャンします。 テスト ツールキットにより、指定したディレクトリの下にあるすべてのファイルがスキャンされます。 この動作は、デプロイに複数のファイルが含まれている可能性があるためです。 azuredeploy.json が配置されているディレクトリの下に JSON ファイルがないことを確認してください。
ターミナルで、azuredeploy.json ファイルが置かれているパスに移動します。 次のコマンドを実行して Visual Studio Code を開始します。
code .
Note
Visual Studio Code がパス上にない場合は、手動で Visual Studio Code を開き、テンプレート ディレクトリを開きます。
Visual Studio Code でコマンド パレットを開き、次のコマンドを選択します: PowerShell: Show Integrated Console。
テンプレートを分析する
PowerShell ターミナルで
Import-Module
を実行します。Note
モジュールをインポートする前に、path\to\arm-ttk\arm-ttk.psd1 をダウンロードしたテスト ツールキットへのパスに置き換えます。
Import-Module path\to\arm-ttk\arm-ttk.psd1
上記のコマンドによって、テスト ツールキット モジュールの場所が指定されます。
ヒント
ツールを Downloads ディレクトリにダウンロードまたはクローンした場合、パスは "C:\Users\<ユーザー>\Downloads\arm-ttk\arm-ttk\arm-ttk.psd1" のようになります。
これで、ツールを使用する準備が整いました。 同じ PowerShell セッションを使用している限り、インポート コマンドをもう一度実行する必要はありません。
注意
新しい PowerShell セッションを開始する場合、
Import-Module
コマンドをもう一度実行する必要があります。PowerShell ターミナルで
Test-AzTemplate
を実行して、テストの実行を開始します。Test-AzTemplate -TemplatePath .
次のような出力がターミナルに表示されます。
Validating deploy\azuredeploy.json JSONFiles Should Be Valid [+] JSONFiles Should Be Valid (16 ms) Fail : 0 Total : 1 Pass : 1 adminUsername Should Not Be A Literal [+] adminUsername Should Not Be A Literal (6 ms) apiVersions Should Be Recent In Reference Functions [+] apiVersions Should Be Recent In Reference Functions (10 ms) apiVersions Should Be Recent [+] apiVersions Should Be Recent (7 ms) artifacts parameter [+] artifacts parameter (5 ms) CommandToExecute Must Use ProtectedSettings For Secrets [+] CommandToExecute Must Use ProtectedSettings For Secrets (7 ms) DependsOn Best Practices [+] DependsOn Best Practices (6 ms) Deployment Resources Must Not Be Debug [+] Deployment Resources Must Not Be Debug (5 ms) DeploymentTemplate Must Not Contain Hardcoded Uri [+] DeploymentTemplate Must Not Contain Hardcoded Uri (5 ms) DeploymentTemplate Schema Is Correct [+] DeploymentTemplate Schema Is Correct (4 ms) Dynamic Variable References Should Not Use Concat [+] Dynamic Variable References Should Not Use Concat (4 ms) IDs Should Be Derived From ResourceIDs [+] IDs Should Be Derived From ResourceIDs (6 ms) deploymentTemplate [-] Location Should Not Be Hardcoded (13 ms) Location value of 'westus' on resource '' must be an expression or 'global'. Line: 14, Column: 9 ManagedIdentityExtension must not be used [+] ManagedIdentityExtension must not be used (5 ms) Min And Max Value Are Numbers [+] Min And Max Value Are Numbers (5 ms) Outputs Must Not Contain Secrets [+] Outputs Must Not Contain Secrets (5 ms) Parameter Types Should Be Consistent [+] Parameter Types Should Be Consistent (9 ms) deploymentTemplate [-] Parameters Must Be Referenced (6 ms) Unreferenced parameter: location Line: 5, Column: 9 Password params must be secure [+] Password params must be secure (11 ms) providers apiVersions Is Not Permitted [+] providers apiVersions Is Not Permitted (5 ms) ResourceIds should not contain [+] ResourceIds should not contain (5 ms) deploymentTemplate [-] Resources Should Have Location (5 ms) Resource Location must be an expression or 'global' Resources Should Not Be Ambiguous [+] Resources Should Not Be Ambiguous (7 ms) Secure Params In Nested Deployments [+] Secure Params In Nested Deployments (10 ms) Secure String Parameters Cannot Have Default [+] Secure String Parameters Cannot Have Default (7 ms) Template Should Not Contain Blanks [+] Template Should Not Contain Blanks (5 ms) URIs Should Be Properly Constructed [+] URIs Should Be Properly Constructed (8 ms) Variables Must Be Referenced [+] Variables Must Be Referenced (5 ms) Virtual Machines Should Not Be Preview [+] Virtual Machines Should Not Be Preview (8 ms) VM Images Should Use Latest Version [+] VM Images Should Use Latest Version (5 ms) VM Size Should Be A Parameter [+] VM Size Should Be A Parameter (5 ms) Fail : 3 Total : 31 Pass : 28
上記の出力は、3 つのテストの ”場所をハードコーディングしない”、”パラメーターを参照する必要がある”、”リソースに場所が必要” がどのように失敗するかを示しています。 プレフィックス
[-]
は失敗したテストを示します。何が起こっているのかを理解するために、azuredeploy.json ファイルを開きます。 次のようになります。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "location": { "type": "string", "defaultValue": "[resourceGroup().location]", "metadata": { "description": "Location for the resources." } } }, "resources": [{ "location": "westus" }] }
次の 2 つの理由により、テストが失敗しています。
- location パラメーターが使用されていません。 このエラー メッセージは、たとえば、過去にパラメーターを使用して、そのクリーンアップを忘れていることを示している可能性があります。 または、使用する必要があるのに、コードの更新を忘れているのかもしれません。
- location プロパティに、ハードコーディングされた文字列 westus が設定されています。 デプロイ時に入力パラメーターを使用してリソースの場所を制御できるようにしたいので、このオプションの使用はよいプラクティスとは見なされません。
テンプレートに修正を適用する
失敗したテストを修正するにはどうすればよいでしょうか。
テストで示されているように、westus を global というテキストに置き換えることができます。 しかし、それでは問題の 1 つが修正されるだけです。 多くの場合、location パラメーターを使用し、リソースの場所をその値に設定します。
その理由は 2 つあります。 location パラメーターはデプロイのパラメーターとして設定できるだけでなく、デプロイの実行時に location パラメーターの設定を省略した場合に、defaultValue として resourceGroup().location に設定される合理的なフォールバックにもなります。
resources 配列で最初のリソース項目を探し、次の内容を置き換えます。
"resources": [{ "location": "westus" }]
次のような内容にします。
"resources": [{ "location": "[parameters('location')]" }]
Test-AzTemplate
を実行して、もう一度テスト ツールを実行します。Test-AzTemplate -TemplatePath .
これで、すべてのテストに合格したことが出力で示されるようになります。
Validating deploy\azuredeploy.json JSONFiles Should Be Valid [+] JSONFiles Should Be Valid (83 ms) Fail : 0 Total : 1 Pass : 1 adminUsername Should Not Be A Literal [+] adminUsername Should Not Be A Literal (36 ms) apiVersions Should Be Recent In Reference Functions [+] apiVersions Should Be Recent In Reference Functions (57 ms) piVersions Should Be Recent [+] apiVersions Should Be Recent (67 ms) artifacts parameter [+] artifacts parameter (19 ms) CommandToExecute Must Use ProtectedSettings For Secrets [+] CommandToExecute Must Use ProtectedSettings For Secrets (93 ms) DependsOn Best Practices [+] DependsOn Best Practices (52 ms) Deployment Resources Must Not Be Debug [+] Deployment Resources Must Not Be Debug (77 ms) DeploymentTemplate Must Not Contain Hardcoded Uri [+] DeploymentTemplate Must Not Contain Hardcoded Uri (18 ms) DeploymentTemplate Schema Is Correct [+] DeploymentTemplate Schema Is Correct (73 ms) Dynamic Variable References Should Not Use Concat [+] Dynamic Variable References Should Not Use Concat (72 ms) IDs Should Be Derived From ResourceIDs [+] IDs Should Be Derived From ResourceIDs (15 ms) Location Should Not Be Hardcoded [+] Location Should Not Be Hardcoded (24 ms) ManagedIdentityExtension must not be used [+] ManagedIdentityExtension must not be used (143 ms) Min And Max Value Are Numbers [+] Min And Max Value Are Numbers (23 ms) Outputs Must Not Contain Secrets [+] Outputs Must Not Contain Secrets (160 ms) Parameter Types Should Be Consistent [+] Parameter Types Should Be Consistent (13 ms) Parameters Must Be Referenced [+] Parameters Must Be Referenced (13 ms) Password params must be secure [+] Password params must be secure (12 ms) providers apiVersions Is Not Permitted [+] providers apiVersions Is Not Permitted (79 ms) ResourceIds should not contain [+] ResourceIds should not contain (12 ms) Resources Should Have Location [+] Resources Should Have Location (17 ms) Resources Should Not Be Ambiguous [+] Resources Should Not Be Ambiguous (17 ms) Secure Params In Nested Deployments [+] Secure Params In Nested Deployments (17 ms) Secure String Parameters Cannot Have Default [+] Secure String Parameters Cannot Have Default (16 ms) Template Should Not Contain Blanks [+] Template Should Not Contain Blanks (83 ms) URIs Should Be Properly Constructed [+] URIs Should Be Properly Constructed (108 ms) Variables Must Be Referenced [+] Variables Must Be Referenced (111 ms) Virtual Machines Should Not Be Preview [+] Virtual Machines Should Not Be Preview (16 ms) VM Images Should Use Latest Version [+] VM Images Should Use Latest Version (22 ms) VM Size Should Be A Parameter [+] VM Size Should Be A Parameter (133 ms) Fail : 0 Total : 31 Pass : 31
Success! テスト ツールを実行し、エラーを検出して修正できました。
これで、テンプレートに対するテストを実行する準備が整いました。