デプロイ パイプラインから Bicep コードを発行する

完了

テンプレート スペックまたは Bicep モジュールの発行プロセスを自動化する場合は、通常は手動で行うすべての作業を確実に自動化してパイプライン内で実行できるようにする必要があります。 このユニットでは、前に学習した原則を適用して、テンプレート スペックと Bicep モジュールをデプロイ パイプラインから発行します。

テンプレート スペックとモジュール

Bicep では、コードを簡単に再利用できます。 Bicep コードをデプロイ間で再利用するための 2 つの一般的なアプローチは次のとおりです。

  • テンプレート スペック。これは、完全なソリューションのデプロイ用に最適化されています。 たとえば、会社の仕様に従って完全な仮想マシンをデプロイするために、セキュリティ強化された一連のリソースを定義したとします。 このコードをテンプレート スペックとして発行できます。それにより、同僚はそのテンプレート スペックを使って、Azure portal からでも完全な仮想マシンをデプロイできます。
  • モジュール。これは、他のデプロイのコンポーネントになるように設計されています。 たとえば、ストレージ アカウントを作成する Bicep ファイルを作成したとします。 他の多くのデプロイでもストレージ アカウントが必要になる可能性があるため、その Bicep ファイルをレジストリに発行し、それを組織のデプロイ全体でモジュールとして使用できます。

テンプレート スペックと Bicep モジュールのどちらを使用するかは、次の基準で判断するとよいでしょう。テンプレートをそのまま組織全体でデプロイする場合には、テンプレート スペックが適していると考えられます。 一方、そのテンプレートを複数の親テンプレート内で再利用したい場合は、Bicep モジュールの方が都合がよいと考えられます。

パイプラインで再利用可能なコードを検証する

通常の Bicep デプロイとは異なり、テンプレート スペックまたはモジュールを作成する場合は、そのリソースを直接 Azure にデプロイすることはしません。 代わりに、テンプレート スペックまたはモジュールを発行します。 それにより、そのテンプレート スペックまたはモジュールを別のデプロイで使用できます。 "その" デプロイにより、定義したリソースがデプロイされます。 結果として、テンプレート スペックや Bicep モジュールを検証およびテストする方法は、通常の Bicep デプロイで使うプロセスとは異なる可能性があります。

Bicep コードをリンティングすることをお勧めします。 リンターが構文上の問題を検出し、推奨される方法に従っていない場合は警告を表示します。

リンティング以外にも、プレフライト検証を使用してテンプレート スペックとモジュールをテストすることも検討できます。 あるいは、テンプレート スペックとモジュールを Azure にデプロイし、それによって作成されたリソースが想定どおりに動作することをテストすることさえ検討できます。 ただし、次の 2 つの理由で、これらの種類のテストをデプロイ パイプラインから実行することは困難な場合があります。

  • プレフライト検証とデプロイには、リソースをデプロイするための Azure 環境が必要です。 モジュールのデプロイやテストに使用するための専用の Azure サブスクリプションまたはリソース グループを維持することが必要になる場合があります。
  • 多くのテンプレート スペックとモジュールでは、一連のパラメーターを指定する必要があります。 テンプレート スペックまたはモジュールがデプロイされるときに使用するパラメーターのテスト セットを作成することが必要になる場合があります。

テンプレート スペックとモジュールをデプロイしてテストするパイプライン ステップを含めるかどうかは、お客様が判断する必要があります。 この Microsoft Learn モジュールでは、Bicep コードをリントしますが、他の形式のテストは含めません。 テンプレート スペックとモジュールをテストする場合は、それらを Azure にデプロイする方法を検討してください。 また、リソースをデプロイするための専用のサブスクリプションまたはリソース グループを使うかどうかも検討してください。

ヒント

自動化されたパイプラインで Bicep ファイルをテストする方法の詳細については、「Azure Pipelines を使用して Bicep コードをテストする」を確認することをお勧めします。

認証と承認

テンプレート スペックを自分で Azure に発行する場合は、Microsoft Entra ユーザーに、そのテンプレート スペック リソースが含まれているリソース グループへのアクセス権を付与する必要があります。 同様に、Bicep モジュールをレジストリに発行する場合は、Microsoft Entra ユーザーに、その Bicep モジュールのために組織で使っている Azure Container Registry インスタンスに書き込むためのアクセス許可が必要です。

自動化されたデプロイ パイプラインを操作する場合も、同じ原則が適用されます。 ただし、実際にデプロイを実行しているわけではないため、パイプラインのサービス プリンシパルに、テンプレート スペックを発行するためのリソース グループ、またはモジュールを発行するためのコンテナー レジストリへの適切なアクセス権が確実に与えられるようにする必要があります。

ヒント

モジュールをレジストリに発行する場合は、おそらく、デプロイを実行しているサービス プリンシパルに多くのアクセス許可は必要ありません。 レジストリで Microsoft Entra 認可が使われている場合、サービス プリンシパルには、レジストリに対する AcrPush アクセス許可のみが必要です。

セキュリティの最小特権の原則を使用することを検討してください。 パイプラインのサービス プリンシパルに、リソース グループまたはサブスクリプションではなく、コンテナー レジストリへのアクセス権のみを与えます。

パイプラインからテンプレート スペックとモジュールを発行する

Azure CLI を使用して自身のコンピューターからテンプレート スペックを発行する場合は、次のようなコマンドを使用します。

az ts create \
  --name StorageWithoutSAS \
  --resource-group MyResourceGroup \
  --location westus3 \
  --display-name "Storage account with SAS disabled" \
  --description "This template spec creates a storage account, which is preconfigured to disable SAS authentication." \
  --version 1 \
  --template-file main.bicep

次の Azure CLI コマンドをパイプライン ステップに変換できます。

- task: AzureCLI@2
  name: Publish
  displayName: Publish template spec
  inputs:
    azureSubscription: $(ServiceConnectionName)
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az ts create \
        --name StorageWithoutSAS \
        --resource-group MyResourceGroup \
        --location westus3 \
        --display-name "Storage account with SAS disabled" \
        --description "This template spec creates a storage account, which is preconfigured to disable SAS authentication." \
        --version 1 \
        --template-file main.bicep

パイプラインでは、テンプレート スペックを発行するときに使用するのと同じプロセスが使用されます。

同様に、Azure CLI を使用して自身のコンピューターから Bicep モジュールを発行する場合は、次のようなコマンドを使用します。

az bicep publish \
   --file module.bicep \
   --target 'br:toycompany.azurecr.io/mymodules/myqueue:2'

この Azure CLI コマンドをパイプライン ステップに変換することもできます。

- task: AzureCLI@2
  name: Publish
  displayName: Publish Bicep module
  inputs:
    azureSubscription: $(ServiceConnectionName)
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az bicep publish \
        --file module.bicep \
        --target 'br:toycompany.azurecr.io/mymodules/myqueue:2'

ヒント

この例では、Bicep レジストリのホスト名 (toycompany.azurecr.io) がパイプライン ステップ定義に埋め込まれています。 これはあまり良い方法ではありません。 環境変数を使用して、次のような構成設定を設定できます。 その動作については、この Microsoft Learn モジュールで、この後確認します。

このユニットでは、パイプラインからテンプレート スペックを発行する方法について説明しました。

モジュールまたはテンプレート スペックを使用する

前の Microsoft Learn トレーニング モジュールでは、テンプレート スペックで定義されているリソースをデプロイする方法と、レジストリに格納されている Bicep モジュールを使う方法を学習しました。 テンプレート スペックとモジュールを手動で発行する場合も、デプロイ パイプラインから発行する場合も、同じ方法で使用してデプロイします。

たとえば、az deployment group create Azure CLI コマンドを使用してテンプレート スペックまたは Bicep ファイルをリソース グループにデプロイしたり、Azure PowerShell で New-AzResourceGroupDeployment コマンドレットをデプロイしたりします。