クイックスタート: Bicep を使用して Azure Key Vault とシークレットを作成する

Azure Key Vault は、キー、パスワード、証明書、その他のシークレットなどのシークレットのセキュリティで保護されたストアを提供するクラウド サービスです。 このクイック スタートでは、Bicep ファイルをデプロイしてキー コンテナーとシークレットを作成するプロセスについて説明します。

Bicep は、宣言型構文を使用してAzure リソースをデプロイするドメイン固有言語 (DSL) です。 簡潔な構文、信頼性の高いタイプ セーフ、およびコードの再利用のサポートが提供されます。 Bicepは、Azureのコードとしてのインフラストラクチャ ソリューションに最適な作成エクスペリエンスを提供します。

[前提条件]

  • Azure サブスクリプションがない場合は、開始する前に free アカウントを作成します。

Bicep ファイルを確認する

このクイック スタートで使用するテンプレートは、Azure クイック スタート テンプレートから取得します。

@description('Specifies the name of the key vault.')
param keyVaultName string

@description('Specifies the Azure location where the key vault should be created.')
param location string = resourceGroup().location

@description('Specifies whether Azure Virtual Machines are permitted to retrieve certificates stored as secrets from the key vault.')
param enabledForDeployment bool = false

@description('Specifies whether Azure Disk Encryption is permitted to retrieve secrets from the vault and unwrap keys.')
param enabledForDiskEncryption bool = false

@description('Specifies whether Azure Resource Manager is permitted to retrieve secrets from the key vault.')
param enabledForTemplateDeployment bool = false

@description('Specifies the Azure Active Directory tenant ID that should be used for authenticating requests to the key vault. Get it by using Get-AzSubscription cmdlet.')
param tenantId string = subscription().tenantId

@description('Specifies whether the key vault is a standard vault or a premium vault.')
@allowed([
  'standard'
  'premium'
])
param skuName string = 'standard'

@description('Specifies all secrets {"secretName":"","secretValue":""} wrapped in a secure object.')
@secure()
param secretsObject object

resource kv 'Microsoft.KeyVault/vaults@2023-07-01' = {
  name: keyVaultName
  location: location
  properties: {
    enabledForDeployment: enabledForDeployment
    enabledForTemplateDeployment: enabledForTemplateDeployment
    enabledForDiskEncryption: enabledForDiskEncryption
    enableRbacAuthorization: true
    tenantId: tenantId
    enableSoftDelete: true
    softDeleteRetentionInDays: 90
    enablePurgeProtection: true
    sku: {
      name: skuName
      family: 'A'
    }
    networkAcls: {
      defaultAction: 'Allow'
      bypass: 'AzureServices'
    }
  }
}

resource secrets 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = [for secret in secretsObject.secrets: {
  name: secret.secretName
  parent: kv
  properties: {
    value: secret.secretValue
  }
}]

output location string = location
output name string = kv.name
output resourceGroupName string = resourceGroup().name
output resourceId string = kv.id

Bicep ファイルには、次の 2 つのAzure リソースが定義されています。

  • Microsoft。KeyVault/vaults: AZURE RBAC 承認が有効になっている Azure キー コンテナーを作成します (enableRbacAuthorization: true)。
  • Microsoft。KeyVault/vaults/secrets: 1 つ以上のキー コンテナー シークレットを作成し、secretsObject.secrets 配列を反復処理します。

Bicep ファイルをデプロイする

  1. Bicep ファイルを main.bicep として、ローカル コンピューターに保存します。

  2. 値を指定するパラメーター ファイル ( secretsObjectなど) を作成します。

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "keyVaultName": { "value": "<vault-name>" },
        "secretsObject": {
          "value": {
            "secrets": [
              { "secretName": "adminpassword", "secretValue": "<your-secret-value>" }
            ]
          }
        }
      }
    }
    
  3. Azure CLI または Azure PowerShell を使って Bicep ファイルをデプロイします。

    az group create --name myResourceGroup --location eastus
    az deployment group create --resource-group myResourceGroup --template-file main.bicep --parameters @main.parameters.json
    

    <vault-name>キー コンテナーの名前に置き換えます。これは、vault.azure.net名前空間内でグローバルに一意である必要があります。 <your-secret-value>を格納するシークレット値に置き換えます。 secretsObjectsecureObjectとして宣言されているため、その値はログに記録されず、エコーバックもされません。

    デプロイが完了すると、デプロイが成功したことを示すメッセージが表示されます。

Key Vault RBAC ロールを割り当てる

このBicep ファイルによって作成されたキー コンテナーは、承認にAzure RBAC を使用します。 データ プレーンを介して (たとえば、Azure CLIやAzure PowerShellを使用して) シークレットにアクセスするには、適切なロールを自分自身に割り当てる必要があります。

echo "Enter your key vault name:" &&
read keyVaultName &&
az role assignment create --role "Key Vault Secrets Officer" \
    --assignee-object-id $(az ad signed-in-user show --query id -o tsv) \
    --scope $(az keyvault show --name $keyVaultName --query id -o tsv)

ロールの割り当てが反映されるまでに 1 ~ 2 分かかる場合があります。

デプロイされているリソースを確認する

Azure ポータルを使用してキー コンテナーとシークレットを確認するか、次のAzure CLIまたはAzure PowerShellスクリプトを使用して作成されたシークレットを一覧表示できます。

echo "Enter your key vault name:" &&
read keyVaultName &&
az keyvault secret list --vault-name $keyVaultName &&
echo "Press [ENTER] to continue ..."

リソースをクリーンアップする

不要になったら、Azure ポータル、Azure CLI、またはAzure PowerShellを使用して、リソース グループとそのリソースを削除します。

az group delete --name myResourceGroup

リソース グループを削除するとキー コンテナーも削除されますが、キー コンテナーは論理削除状態となり、保持期間 (デフォルトでは 90 日間) 中は復元可能です。 ボールト名はその期間中グローバルで予約されたままとなり、さらに消去保護が有効になっているため、ボールトを早期に完全に削除することはできません。 標準のキー コンテナーの場合、論理削除されたコンテナーには料金は発生しません。 詳細については、「Key Vault ソフト削除の概要」を参照してください。

次のステップ

このクイック スタートでは、Bicepを使用してキー コンテナーとシークレットを作成し、デプロイを検証しました。 Key VaultとBicepの詳細については、以下の記事に進んでください。