Azure Developer CLI (azd) では、階層型プロビジョニングがサポートされています。これを使用して、 azure.yaml ファイルで複数のプロビジョニング レイヤーを定義できます。 各レイヤーは、独自のコードとしてのインフラストラクチャ (IaC) テンプレートのセットを指します。 CLI は、レイヤー間の依存関係に従って、一度に 1 つずつレイヤーをプロビジョニングします。 個々のレイヤーを個別にプロビジョニングまたは破棄することもできます。
この機能は、あるレイヤー内のリソースが別のレイヤーのリソースに依存する複雑な依存関係シナリオを解決します。 IaC と命令型フック スクリプトを混在させる代わりに、階層型プロビジョニングでは、すべてを宣言型に保ちます。
注
レイヤード プロビジョニングは現在、ベータ機能です。 バージョン管理戦略の詳細を確認します。
階層型プロビジョニングを使用する場合
単一の azd provision デプロイでインフラストラクチャのニーズをすべて 1 つの手順で処理できない場合は、階層型プロビジョニングを使用します。 次の場合は、階層型プロビジョニングの使用を検討してください。
- 循環依存関係: 一部のリソースは、プライベート エンドポイントを構成する前に存在する必要がある仮想ネットワークなど、最初に作成する必要がある他のリソースを参照する必要があります。
- 基本インフラストラクチャはアプリケーション インフラストラクチャとは異なります。共有ネットワーク、セキュリティ、または ID リソースは、アプリケーションごとのリソースとは別に管理します。
- 独立したライフサイクル管理が必要です。さまざまなインフラストラクチャ コンポーネントを異なる時間に更新して破棄します。 たとえば、ネットワーク レイヤーは有効期間が長く、アプリケーション レイヤーは頻繁に再デプロイされます。
- 個別のインフラストラクチャ グループを持つ Monorepo プロジェクト: 1 つのリポジトリには、それぞれが独自のインフラストラクチャ テンプレートを持つ複数の独立したサービス (イベント ハブ、コンテナー アプリ、関数アプリなど) が含まれています。
azure.yaml でレイヤーを構成する
infra ファイルの [azure.yaml] セクションの下にレイヤーを定義します。 各レイヤーには、 name と、そのレイヤーの IaC テンプレートを含むディレクトリを指す path が必要です。
name: my-app
infra:
layers:
- name: networking
path: ./infra/networking
- name: application
path: ./infra/application
services:
api:
project: ./src/api
language: js
host: containerapp
Important
レイヤー処理順序:azd provision は、依存関係に基づいてレイヤーを処理します。 Bicepレイヤーとカスタムプロバイダーまたは拡張プロバイダーの場合、azdは環境変数とレイヤー出力参照のパラメーター ファイル (*.bicepparamと*.parameters.json) をスキャンして依存関係を推測し、azure.yamlに記載されている順序に厳密に従うのではなく、それに応じてレイヤーを並べ替えます。 推定または宣言された依存関係がないレイヤーは、一覧の順序で実行されます。
azd down は対応する逆順に従うため、依存するレイヤーの前に依存レイヤーが削除されます。
azdが推論できない順序を宣言するには、dependsOn プロパティを使用します。
レイヤーのプロパティ
各レイヤーでは、次のプロパティがサポートされています。
| プロパティ | 必須 | Description |
|---|---|---|
name |
イエス | レイヤーの一意の名前。 コマンドを使用して特定のレイヤーを対象とする場合は、この名前を使用します。 |
path |
イエス | このレイヤーの IaC テンプレートを含むディレクトリへの相対パス。 |
module |
いいえ | レイヤーのディレクトリ内のモジュールの名前。 既定値は main です。 |
provider |
いいえ | このレイヤーの IaC プロバイダー (bicep または terraform)。 指定しない場合は、ルート infra.provider から継承します。 |
dependsOn |
いいえ | このレイヤーが依存する他のレイヤーの名前。 順序が重要であり、かつ azd がパラメーター参照から依存関係を推論できない場合は、このプロパティを使用します。 |
Important
infra.layersを定義する場合、ルート レベルの infra セクション (path、module、deploymentStacks) で他のプロパティを宣言することはできません。 各レイヤー内のすべてのインフラストラクチャ構成を指定する必要があります。
ディレクトリの構造
階層型プロビジョニングを使用する一般的なプロジェクトには、次のディレクトリ構造が含まれる場合があります。
my-app/
├── azure.yaml
├── infra/
│ ├── networking/
│ │ └── main.bicep
│ └── application/
│ └── main.bicep
└── src/
└── api/
└── ...
各レイヤー ディレクトリには、プロジェクトの標準 azdinfra ディレクトリと同様に、独自の IaC テンプレートの完全なセットが含まれています。
レイヤーのプロビジョニングと管理
すべてのレイヤーを一度にプロビジョニングすることも、特定のレイヤーを名前でターゲットにすることもできます。 次のセクションでは、レイヤーの状態をプロビジョニング、破棄、更新するための一般的なコマンドについて説明します。
すべてのレイヤーをプロビジョニングする
引数を指定せずに azd provision を実行して、すべてのレイヤーをプロビジョニングします。
azd provision
azd は各レイヤーを一度に 1 つずつ処理し、それに依存するレイヤーが開始される前にレイヤーが完了することを確認します。 Bicep レイヤーとカスタム プロバイダーまたは拡張プロバイダーの場合、azdは、*.bicepparam ファイルと*.parameters.json ファイル内の環境変数およびレイヤー出力参照からの依存関係を推測するため、実行順序はazure.yamlに記載されている順序とは異なる場合があります。 推定または宣言された依存関係がないレイヤーは、一覧に示されている順序で実行されます。 このプロセスでは、依存リソースを参照するレイヤーがデプロイされる前に、依存リソースが存在することが保証されます。
特定のレイヤーをプロビジョニングする
特定のレイヤーのみをプロビジョニングするには、レイヤー名を引数として渡します。
azd provision networking
このコマンドは、 networking レイヤーで定義されているリソースのみをデプロイします。 特定のレイヤーのプロビジョニングは、次の場合に役立ちます。
- 開発中は、1 つのレイヤーを反復処理しています。
- 他のレイヤーを再デプロイせずに、1 つのレイヤーを更新する必要があります。
- 既存のインフラストラクチャの上に新しいレイヤーを設定します。
すべてのレイヤーを破棄する
引数を指定せずに azd down を実行して、すべてのレイヤーからリソースを破棄します。 複数のレイヤーが存在する場合、 azd はプロビジョニング順序とは 逆 の順序で処理されるため、依存している基本リソースの前に依存リソースが削除されます。
azd down
特定のレイヤーを破棄する
特定のレイヤーのみを破棄するには、レイヤー名を引数として渡します。
azd down application
このコマンドを実行すると、 application レイヤーによってデプロイされたリソースのみが削除され、他のレイヤーはそのまま残ります。
環境の状態を更新する
--layerで azd env refresh フラグを使用して、特定のレイヤーから環境の状態を更新できます。
azd env refresh --layer networking
このコマンドは、指定されたレイヤーの最新のデプロイに基づいて環境変数と出力を更新します。
例: 複数のサービスを含む Monorepo
次の例は、イベント ハブ、複数のコンテナーを実行するコンテナー アプリ、および Azure Function App を含む monorepo の階層型プロビジョニングを示しています。
name: logging-app
infra:
layers:
- name: eventhub
path: ./infra/eventhub
- name: aca
path: ./infra/aca
- name: functionapp
path: ./infra/functionapp
services:
functionapp:
resourceName: ${site_name}
language: dotnet
project: ./src/function/functionapp.csproj
host: appservice
resourceGroup: ${rg_name}
対応するディレクトリ構造:
logging-app/
├── azure.yaml
├── infra/
│ ├── eventhub/
│ │ └── main.bicep
│ ├── aca/
│ │ └── main.bicep
│ └── functionapp/
│ └── main.bicep
└── src/
└── function/
└── functionapp.csproj
この構成では、次のことができます。
- Event Hub インフラストラクチャのみをプロビジョニングします。
azd provision eventhub - Container App インフラストラクチャのみをプロビジョニングします。
azd provision aca - すべてを順番にプロビジョニングします。
azd provision - Function App レイヤーのみを破棄します。
azd down functionapp
例: 基本レイヤーとアプリケーション レイヤー
一般的なパターンでは、共有インフラストラクチャまたは基本インフラストラクチャがアプリケーションごとのインフラストラクチャから分離されます。
name: my-app
infra:
layers:
- name: base
path: ./infra/base
- name: app
path: ./infra/app
services:
web:
project: ./src/web
language: js
host: containerapp
base レイヤーは、ネットワーク、ID、監視などの共有リソースを作成します。
app レイヤーは、基本リソースを参照するアプリケーション固有のリソース (Container App 環境やコンテナー アプリなど) を作成します。
開発中は、基本レイヤーを 1 回プロビジョニングし、アプリケーション レイヤーを反復処理できます。
azd provision base
azd provision app
azd provision app # re-provision only the app layer after changes
例: 混合 IaC プロバイダー
各レイヤーは、異なる IaC プロバイダーを使用できます。 たとえば、Bicep をネットワークに使用し、アプリケーション レイヤーに Terraform を使用できます。
name: my-app
infra:
layers:
- name: networking
path: ./infra/networking
provider: bicep
- name: application
path: ./infra/application
provider: terraform
組み込みの非Bicep プロバイダー (Terraform、Pulumi、ARM、およびテスト プロバイダー) は、依存関係の推論に対して不透明です。これは、azdが他のレイヤーへの参照の入力を分析できないためです。 これらのレイヤー間、またはそれらのレイヤーと他のレイヤーの間で並べ替える場合は常に、明示的な dependsOn プロパティを使用します。
name: my-app
infra:
layers:
- name: networking
path: ./infra/networking
provider: bicep
- name: application
path: ./infra/application
provider: terraform
dependsOn:
- networking
考慮事項と制限事項
- すべてのレイヤーをプロビジョニングすると、
azdは依存関係に基づいてそれらを 1 つずつ処理します。 Bicep レイヤーとカスタム プロバイダーまたは拡張プロバイダーの場合、azdは、*.bicepparamファイルと*.parameters.jsonファイル内の環境変数およびレイヤー出力参照からの依存関係を推論します。 推定または宣言された依存関係のないレイヤーは、定義した順序で実行されます。 - 組み込みの非Bicep プロバイダー (Terraform、Pulumi、ARM、およびテスト プロバイダー) は、依存関係の推論では不透明です。 これらのレイヤーを含む順序が重要な場合は、明示的な
dependsOnプロパティを使用します。 - 順序が重要であり、かつ
dependsOnがパラメーター参照から依存関係を推論できない場合は、明示的なazdも必要です。 たとえば、1 つのレイヤーのpostprovisionフックが別のレイヤーで使用する値を生成する場合は、dependsOnを使用します。これは、フックによって生成された値が*.bicepparamまたは*.parameters.jsonファイルの出力参照として表示されないためです。 - すべてのレイヤーを破棄すると、
azdはプロビジョニング順序とは逆に処理されます。- 複数のレイヤーが同じ Azure リソース グループにリソースをデプロイし、既定のリソース グループベースの削除動作を使用している場合、azd down を実行すると共有リソースが削除される可能性があります。
- 階層化インフラストラクチャの独立した追跡と削除を許可するには、コマンド
azd config set alpha.deployment.stacks onを実行してデプロイ スタックを有効にします。
- 複数のレイヤーを一度にプロビジョニングするときに、
--previewフラグを使用することはできません。 プレビュー モードを使用する<layer>名を指定します。 - レイヤーは、IaC の観点から独立して動作します。 別のレイヤーの 1 つのレイヤーからの出力を参照するには、各レイヤーのデプロイ後に設定
azd環境変数を使用します。*.bicepparamまたは*.parameters.jsonファイルからこれらの環境変数を参照すると、レイヤー間の順序をazd推論することもできます。 - すべての標準
azdプロビジョニング機能 (デプロイ状態のキャッシュ、フック、パラメーター、Bicep、または Terraform) は、個々のレイヤー内で動作します。- コマンド レベルのフック (
preprovision、postprovisionなど) は、レイヤーごとに 1 回呼び出されます。 複数のレイヤーが定義されている場合、フックは、レイヤーが処理される順序で各レイヤーに対して実行されます。
- コマンド レベルのフック (