練習 - ARM テンプレートでシークレットを管理する
前の演習では、Linux 仮想マシンをプロビジョニングする基本的な Azure Resource Manager (ARM) テンプレートを実行しました。 ここでは、同様のプロセスに従います。
今回は、パスワードをパラメーターとして渡す代わりに、パスワードを Azure Key Vault に格納します。 確実に ARM テンプレートでパスワードにアクセスできるようにするには、サブスクリプション内のキー コンテナーのシークレットを参照するパラメーター ファイルを作成します。
Azure Key Vault をデプロイする
Note
サンドボックスには制限があるため、ここでは Azure portal から Azure Key Vault にキー コンテナーを作成します。 通常は、New-AzKeyVault
コマンドレットを使用して、Azure PowerShell からキー コンテナーを作成します。
キー コンテナーを作成し、デプロイ時のアクセスを許可します。 そのためには次を行います。
キー コンテナーの名前を保持する PowerShell 変数を作成します。
$KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
$KVNAME
を実行してその値を出力します。$KVNAME
出力は次のようになります (表示される値は異なります)。
tailwind-secrets5978564
次のステップで使いやすい場所に値をコピーします。
サンドボックスをアクティブ化したときと同じアカウントを使用して、Azure portal にサインインします。
Azure portal のメニューまたは [ホーム] ページから [リソースの作成] を選択します。
検索ボックスに「Key Vault」と入力します。
一覧から [Key Vault] を選び、[作成] を選択してキー コンテナーの構成を始めます。
作成ペインで、次の値を指定します。
- [リソース グループ]:
リソース グループの名前 。 - [キー コンテナー名]:
$KVNAME
の値 (例: tailwind-secrets5978564)。
- [リソース グループ]:
[Review + create](レビュー + 作成) を選択します。
[作成] を選択します これには 1 分ほどかかることがあります。 リソースが作成されたら、[リソースに移動] を選択します。
[設定] で [アクセスの構成] を選択します。 [Azure Resource Manager (テンプレート デプロイ用)] オプションを有効にして、[適用] を選択します。
PowerShell セッションから
ConvertTo-SecureString
コマンドレットを実行し、結果をsecretSecureString
変数に代入します。$secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
次の
Set-AzKeyVaultSecret
コマンドを実行して、キー コンテナーにシークレットを作成します。 そのシークレットの名前はvmPassword
で、値はinsecurepassword123!
となります。$secret = Set-AzKeyVaultSecret -VaultName $KVNAME -Name vmPassword -SecretValue $secretSecureString
パラメーター ファイルを作成する
ここでは、VM の名前、管理者のユーザー名、およびキー コンテナー内の VM パスワードへの参照を含むパラメーター ファイルを作成します。
コマンド ラインからテンプレートにパラメーターを渡すことができます。 パラメーター ファイルは、デプロイの間にパラメーターを ARM テンプレートに渡す別の方法であることを思い出してください。 パラメーター ファイルを使用して、テンプレートからキー コンテナーのシークレットにアクセスできます。
次の
Get-AzKeyVault
コマンドを実行して、キー コンテナーの ID を出力します。Get-AzKeyVault -VaultName $KVNAME | Select-Object -ExpandProperty ResourceId
次のような内容が出力されます。
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
次のステップのために出力を記録しておきます。
Visual Studio Code で、azuredeploy.json が格納されているディレクトリに azuredeploy.parameters.json という名前のファイルを作成します。
次の内容を azuredeploy.parameters.json に追加します。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "adminUsername": { "value": "azureuser" }, "vmName": { "value": "vm2" }, "adminPasswordOrKey": { "reference": { "keyVault": { "id": "" }, "secretName": "vmPassword" } } } }
id
(空の文字列) の値を、前のステップでコピーした値に置き換えます。 そのうえでファイルを保存します。
Linux VM のデプロイ
ここでは、前の演習でデプロイしたのと同じ ARM テンプレートをデプロイします。 今回は、キー コンテナー内の VM パスワードを参照するパラメーター ファイルを指定します。
次のコマンド
New-AzResourceGroupDeployment
を実行します。New-AzResourceGroupDeployment ` -TemplateFile "./azuredeploy.json" ` -TemplateParameterFile "./azuredeploy.parameters.json" ` -dnsLabelPrefix ("vm2-" + (Get-Random -Count 1 -Maximum 9999999))
前の演習では、キーと値の各ペアをコマンド ラインから直接指定しました。 ここでは、
"./azuredeploy.parameters.json"
を指定してパラメーター ファイルを提供します。dnsLabelPrefix
には、vm2-
の後に乱数を付けたものが設定されます。 これは、DNS 名が前の演習で使用した DNS 名と異なるものになるようにするために必要です。
デプロイを検証する
VM がプロビジョニングされていて、SSH 経由で接続できることを確認します。 次の手順に従います。
Invoke-Expression
コマンドを実行して、SSH 経由で VM に接続します。Invoke-Expression (Get-AzResourceGroupDeployment -Name azuredeploy -ResourceGroupName <rgn>your resource group</rgn>).outputs.sshCommand.value
メッセージが表示されたら、「
yes
」と入力して接続を続けます。 次に、管理者パスワードinsecurepassword123!
を入力します。重要
実際には、パスワードは安全に保持しておきます。 一般にパスワードを使用するより安全な公開キー認証を使用することもできます。
VM への SSH 接続から、
hostname
を実行して VM のホスト名を出力します。hostname
VM の内部ホスト名
vm1
が表示されます。vm2
exit
を実行して、SSH セッションを終了します。exit
お疲れさまでした。 Key Vault からシークレット情報を読み取るパラメーター ファイルを使用するように、デプロイを拡張しました。
Azure Key Vault をデプロイする
Azure Key Vault で、キー コンテナーを作成し、セキュリティで保護されたシークレットとして VM パスワードを追加します。 そのためには次を行います。
キー コンテナーの名前を保持する Bash 変数を作成します。
KVNAME=tailwind-secrets$RANDOM
キー コンテナーの名前は一意である必要があります。
$RANDOM
の部分により、キー コンテナー名がランダムな一連の数字で終了することが保証されます。次の
az keyvault create
コマンドを実行して、キー コンテナーを作成します。az keyvault create \ --name $KVNAME \ --enabled-for-template-deployment true
--enabled-for-template-deployment
引数により、Azure Resource Manager (ARM) テンプレートでキー コンテナーからシークレットを取得することが許可されます。次の
az keyvault secret set
コマンドを実行して、キー コンテナーにシークレットを作成します。 そのシークレットの名前はvmPassword
で、値はinsecurepassword123!
となります。az keyvault secret set \ --vault-name $KVNAME \ --name vmPassword \ --value 'insecurepassword123!'
パラメーター ファイルを作成する
ここでは、VM の名前、管理者のユーザー名、およびキー コンテナー内の VM パスワードへの参照を含むパラメーター ファイルを作成します。
コマンド ラインからテンプレートにパラメーターを渡すことができます。 パラメーター ファイルは、デプロイの間にパラメーターを ARM テンプレートに渡す別の方法であることを思い出してください。 パラメーター ファイルを使用して、テンプレートからキー コンテナーのシークレットにアクセスできます。
次の
az keyvault show
コマンドを実行して、キー コンテナーの ID を出力します。az keyvault show \ --name $KVNAME \ --query id \ --output tsv
次のような内容が出力されます。
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
次のステップのために出力を記録しておきます。
Visual Studio Code で、azuredeploy.json が格納されているディレクトリに azuredeploy.parameters.json という名前のファイルを作成します。
次の内容を azuredeploy.parameters.json に追加します。
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "adminUsername": { "value": "azureuser" }, "vmName": { "value": "vm2" }, "adminPasswordOrKey": { "reference": { "keyVault": { "id": "" }, "secretName": "vmPassword" } } } }
id
(空の文字列) の値を、前のステップでコピーした値に置き換えます。 そのうえでファイルを保存します。
Linux VM のデプロイ
ここでは、前の演習でデプロイしたのと同じ ARM テンプレートをデプロイします。 今回は、キー コンテナー内の VM パスワードを参照するパラメーター ファイルを指定します。
次の az deployment group create
コマンドを実行して、テンプレートをデプロイします。
az deployment group create \
--template-file azuredeploy.json \
--parameters @azuredeploy.parameters.json dnsLabelPrefix="vm2-$RANDOM"
前の演習では、--parameters
引数でキーと値の各ペアを提供しました。 ここでは、@azuredeploy.parameters.json
を指定してパラメーター ファイルを提供します。
dnsLabelPrefix
には、vm2-
の後に乱数を付けたものが設定されます。 これは、DNS 名が前の演習で使用した DNS 名と異なるものになるようにするために必要です。
デプロイを検証する
前の演習で行ったように、VM がプロビジョニングされていて、SSH 経由で接続できることを確認します。 簡潔にするため、今度は途中の手順を一部省略します。
次のように実行し、SSH 経由で VM に接続します。
$(az deployment group show \ --name azuredeploy \ --query properties.outputs.sshCommand.value \ --output tsv)
メッセージが表示されたら、「
yes
」と入力して接続を続けます。 次に、管理者パスワードinsecurepassword123!
を入力します。VM への SSH 接続から、
hostname
を実行して VM のホスト名を出力します。hostname
VM の内部ホスト名
vm2
が表示されます。vm2
exit
を実行して、SSH セッションを終了します。exit
お疲れさまでした。 Key Vault からシークレット情報を読み取るパラメーター ファイルを使用するように、デプロイを拡張しました。