Bicep パラメーターを使用して、環境間の違いに対応する
Bicep パラメーターについてはすでに学習しました。 パラメーターを使用することで、Bicep ファイルのデプロイごとに異なる値を指定することができます。
パラメーターは、環境ごとの違いをサポートするために一般的に使用されています。 たとえば、非運用環境では、Azure リソースの安価な SKU をデプロイしたいと思うことでしょう。 運用環境の場合は、パフォーマンスが優れた SKU をデプロイすることと思います。 また、各環境のリソースに対して異なる名前を使用する必要があるかもしれません。
Bicep ファイルをデプロイする際には、各パラメーターに値を指定します。 パイプラインから各パラメーターに値を指定する方法と、各環境に別個の値を指定する方法にはいくつかの選択肢があります。 このユニットでは、Bicep パラメーターの値をデプロイ パイプラインで指定する方法について学習します。
パラメーター ファイル
パラメーター ファイルは、各環境で使用するパラメーター値を一覧表示する JSON 形式のファイルです。 デプロイを送信する際に、パラメーター ファイルを Azure Resource Manager に送信します。
パラメーター ファイルの例を次に示します。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"reviewApiUrl": {
"value": "https://sandbox.contoso.com/reviews"
}
}
}
パラメーター ファイルは、Bicep ファイルとともにお使いの Git リポジトリにコミットできます。 そうすれば、デプロイを実行するパイプライン テンプレート内でパラメーター ファイルを参照できます。
パラメーター ファイルのために、環境に基づく一貫した名前付けのルールを確立するのが理想的です。 たとえば、パラメーター ファイルに、parameters.ENVIRONMENT_NAME.json という名前を付けることができます (例: parameters.Production.json)。 そうすれば、パイプライン テンプレート パラメーターを使用して自動的に正しいパラメーター ファイルを選択できます。
parameters:
- name: environmentType
type: string
- name: serviceConnectionName
type: string
- name: resourceGroupName
type: string
- stage: Deploy
jobs:
- deployment: DeployWebsite
displayName: Deploy Website
environment: Website
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: AzureCLI@2
name: DeployBicepFile
displayName: Deploy Bicep file
inputs:
azureSubscription: ${{parameters.serviceConnectionName}}
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
az deployment group create \
--resource-group ${{parameters.resourceGroupName}} \
--template-file deploy/main.bicep \
--parameters deploy/azuredeploy.parameters.${{parameters.environmentType}}.json
パラメーター ファイルを使用する際には、パイプライン YAML ファイルに、デプロイのステップに個別に渡す必要があるパラメーターの一覧を含める必要はありません。 これは、大量のパラメーターがある場合に役立ちます。
パラメーター ファイルは、パラメーター値を単一の JSON ファイル内でまとめて保持します。 パラメーター ファイルは Git リポジトリにあるので、他のコードと同様にバージョン管理できます。
重要
パラメーター ファイルは、セキュリティで保護された値に対して使用するべきではありません。 パラメーター ファイルのシークレットの値を保護する方法はないため、Git リポジトリには絶対にシークレットをコミットすべきではありません。
パイプライン変数
Azure Pipelines ではパイプライン変数を保存することができます。これは、環境ごとに異なる場合がある値に対して便利です。 また、一度だけ定義して、パイプライン全体で再利用したい値にも便利です。 Azure Pipelines では、変数を定義するいくつかの方法がサポートされています。
YAML ファイルで定義された変数
YAML ファイル内で、変数を定義して値を設定できます。 これは、同じ値を複数回再利用したい場合に便利です。 とはいえ、Bicep パラメーター ファイルと同様、YAML ファイルもシークレットには適していません。
Web インターフェイスで定義された変数
Azure DevOps Web インターフェイスを使用して変数を定義できます。 変数の値はいつでも変更でき、パイプラインは更新された値を次回の実行時に読み取ります。
Web インターフェイスを使用して定義された変数はシークレットとしてマーク付けできます。そうすると、Azure Pipelines はパイプライン ログから変数の値を隠します。 つまり、Bicep ファイルが @secure()
デコレーターとともにパラメーターとして受け取る値として保存できます。
警告
既定では、Azure Pipelines ではパイプライン ログでシークレット変数の値が難読化されますが、同様に優れたプラクティスにも従う必要があります。 パイプライン ステップでは、シークレットを含むすべての変数の値にアクセスできます。 セキュリティで保護された変数が安全に処理されないステップがパイプラインに含まれている場合は、シークレット変数がパイプライン ログに表示される可能性があります。
変数グループ
また、変数のセットである変数グループを定義することもできます。 変数と同じように、Azure DevOps Web インターフェイスを使用してこれらのグループを定義します。 シークレットを安全に保護するために変数グループを使用することもできます。 変数グループは、同じ Azure DevOps プロジェクトの複数のパイプラインで再利用することも可能です。
他の変数とは異なり、変数グループは次のように、variables
セクションで group
キーワードを使用してパイプラインに明示的にインポートする必要があります。
variables:
- group: MyVariableGroup
パイプライン テンプレートを使用する場合、変数グループに名前を付けて、テンプレート パラメーターを使用して簡単に読み込めるようにすることができます。 たとえば、パイプラインを 2 つの環境にデプロイする場合、各環境に対して変数のセットを定義する必要があります。 次のように、変数グループには環境名を含む名前を付けることもできます。
環境名 | 変数グループ名 |
---|---|
テスト | ToyWebsiteTest |
Production | ToyWebsiteProduction |
これらの変数グループそれぞれで、各環境に対して同じ名前と異なる値を持つ変数を追加できます。
パイプライン テンプレート ファイルは、{{ parameters.PARAMETER_NAME }}
マクロを使用してインポートする変数グループを選択します。
parameters:
- name: environmentType
type: string
default: 'Test'
variables:
- group: ToyWebsite${{ parameters.environmentType }}
Key Vault 変数グループ
変数グループを Azure Key Vault にリンクすることができます。 キー コンテナーのシークレットは、変数グループの変数として利用できるようになります。 そうすれば、通常の変数であるかのように、シークレットをパイプラインで利用できるようになります。
Key Vault により、シークレットをよりセキュリティで保護された形で管理することができます。 また、これらの値はセキュリティ チームが管理できるようになり、パイプラインへのアクセスを、使用するシークレットから分離することもできます。
変数グループをキー コンテナーにリンクするには追加のステップが必要になります。 これらのステップには、シークレットをキー コンテナーから読み取るためのアクセス許可を持つサービス接続を作成することが含まれます。 概要ユニットには、Key Vault 変数グループを構成する方法についての詳細へのリンクがあります。
パイプラインで変数を使用する
変数をどのように定義するかに関わりなく、パイプラインでその値にアクセスするには $(VariableName)
構文を使用します。 たとえば、Bicep デプロイを実行する場合、変数を使用してパラメーターの値を指定します。
- stage: Deploy
jobs:
- deployment: DeployWebsite
displayName: Deploy Website
environment: Website
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: AzureCLI@2
name: DeployBicepFile
displayName: Deploy Bicep file
inputs:
azureSubscription: MyServiceConnection
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
az deployment group create \
--resource-group $(ResourceGroupName) \
--template-file deploy/main.bicep \
--parameters environmentType=$(EnvironmentType)
最適な手法はどれか
デプロイで Bicep ファイルが必要とするパラメーターを扱ういくつかの方法について学習しました。 どの手法をいつ使うべきかを理解することは大切です。
不必要なパラメーターを避ける
パラメーターは、Bicep ファイルを再利用するのに役立ちますが、パラメーターを定義しすぎてしまうことがあります。 Bicep ファイルをデプロイする際には、各パラメーターに対して値を指定する必要があります。 複数の環境に対する複雑なデプロイでは、大量のパラメーター値を管理するのは難しくなります。
可能な場合にはパラメーターをオプションにして、ほとんどの環境に適用される既定値を使用してください。 そうすれば、パイプラインがパラメーターの値を渡す必要はなくなります。
また、リソースが他のリソースに接続する際に、Bicep でパラメーターが使用されることがよくあります。 たとえば、ストレージ アカウントに接続する必要がある Web サイトがある場合、ストレージ アカウント名とアクセス キーを指定する必要があります。 キーはセキュリティで保護された値です。 とはいえ、リソースのこの組み合わせをデプロイする際には、次のような他の手法についても検討してください。
- Web サイトのマネージド ID を使用してストレージ アカウントにアクセスする。 マネージド ID を作成すると、Azure によってその資格情報が自動的に生成され、管理されます。 この手法により、接続設定が簡略化されます。 このことは、シークレットを扱う必要がまったくないことを意味しているため、最も安全なオプションです。
- ストレージ アカウントと Web サイトを、同じ Bicep テンプレートでまとめてデプロイする。 Bicep モジュールを使用して、Web サイトとストレージ アカウントをまとめて保持する。 こうすると、ストレージ アカウント名とキーの値を、パラメーターとして渡すのではなく、Bicep コード内で自動的に探すことができます。
- ストレージ アカウントの詳細を、シークレットとしてキー コンテナーに追加する。 こうすると、Web サイトのコードはアクセス キーを資格情報コンテナーから直接読み込みます。 この手法の場合、キーをパイプラインで管理する必要はまったくなくなります。
少数のパラメーターに対して変数グループを使用する
Bicep ファイルで使うパラメーターの数が少しだけの場合、変数グループを使うことを検討してください。 変数グループのシークレットおよび非シークレットの値の両方を保存できます。
大量のパラメーターに対してパラメーター ファイルを使用する
Bicep ファイルで大量のパラメーターを使用する場合、各環境に対してセキュリティで保護されていない値をまとめて保持するために、パラメーター ファイルを使用することを検討してください。 そうすれば、値を変更する必要がある場合、パラメーター ファイルを更新して変更をコミットできます。
この手法の場合、各パラメーターの値を明示的に設定する必要がないため、パイプラインのステップが簡潔になります。
シークレットを安全に保存する
シークレットは、適切な方法で保存し、扱う必要があります。 管理するシークレットの数が少しだけの場合、多くの場合は Azure Pipelines の変数と変数グループで十分です。 しかし、大量のシークレット、多くの異なる環境、アクセスの制御の制限など、もっと複雑な要件があるかもしれません。 こうした状況では、各環境のシークレットを別個のキー コンテナーで保存することを検討してください。 変数グループを使用して資格情報コンテナーをパイプラインにリンクする。
セキュリティで保護されたパラメーターの場合、各パラメーターをデプロイ ステップに明示的に渡す必要があります。
手法を組み合わせる
複数の手法を組み合わせてパラメーターを扱うのは、一般的な方法です。 たとえば、ほとんどのパラメーター値をパラメーター ファイルに保存し、変数グループを使って、セキュリティで保護された値を設定することができます。 次の例はこの組み合わせを示しています。
variables:
- group: MyVariableGroup # This group imports a parameter named MySecureParameter.
stages:
- stage: Deploy
jobs:
- deployment: DeployWebsite
displayName: Deploy Website
environment: Website
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: AzureCLI@2
name: DeployBicepFile
displayName: Deploy Bicep file
inputs:
azureSubscription: MyServiceConnection
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
az deployment group create \
--resource-group ${{parameters.resourceGroupName}} \
--template-file deploy/main.bicep \
--parameters deploy/azuredeploy.parameters.${{parameters.environmentName}}.json \
mySecureParameter=$(MySecureParameter)
サービス接続の名前を指定する方法には、特別なルールがあります。 このルールは、複数の環境にデプロイされるパイプラインで名前を使用する方法に影響を与えます。 たとえば、変数グループ内で定義された変数を、サービス接続名を指定するために使用することはできません。 パイプライン テンプレート パラメーターを使用して、使用するサービス接続の名前を指定できます。