リソースを Bicep ファイルに変換して移行する

完了

Bicep への移行プロセスを開始する際には、構造化されたプロセスに従って確実に Bicep ファイルで Azure リソースを正しく記述することが重要です。 Bicep コードがベスト プラクティスに従っていること、および完全にテストされており、以降のデプロイで安全に使用できることを確認する必要があります。 このユニットでは、Bicep 移行の最初の 2 つのフェーズ (変換フェーズと移行フェーズ) について学習します。

Diagram that shows the convert and migrate phases of the recommended workflow for migrating Azure resources to Bicep.

これら 2 つのフェーズの主な焦点は、後でリファクタリングしてテストする前に、新しい Bicep ファイルを準備することです。

変換フェーズ

リソースを Bicep に移行する "変換" フェーズの目標は、Azure リソースの初期表現を取得することです。 このフェーズで作成する Bicep ファイルは完全ではなく、すぐに使用することはできません。 ただし、このファイルを移行の出発点として使用することができます。

変換フェーズは次の 2 つのステップで構成されることが考えられ、これらを順に実行します。

  1. Azure リソースの表現をキャプチャする。
  2. 必要に応じて、decompile コマンドを使用して JSON 表現を Bicep に変換する。

Diagram that shows a JSON template decompiled to JSON, and Azure resources that are exported to a JSON template, which is then decompiled.

Bicep に変換する既存の JSON テンプレートがある場合、既にソース テンプレートがあるため、最初のステップは簡単です。 それを Bicep に逆コンパイルする方法については、このユニットで学習します。

Azure portal または別のツールを使用してデプロイされた Azure リソースを変換する場合、リソース定義をキャプチャする必要があります。 リソース定義をエクスポートして Bicep に変換するか、Visual Studio Code で Insert Resource コマンドを使用して、Azure リソースの Bicep 表現を挿入することができます。

Azure でリソースを表現する方法

Azure Resource Manager は、Azure 内でリソースをデプロイおよび管理するときに使用されるサービスです。 Azure にデプロイされたすべてのリソースは、リソースのデプロイに使用した方法に関係なく、Resource Manager によって追跡されます。 Resource Manager と対話するには、Azure portal、Azure CLI、Azure PowerShell、Resource Manager REST API、Azure SDK を使用できます。

Diagram that shows Resource Manager accepting requests from all Azure clients and libraries.

Azure には、コントロール プレーンとデータ プレーンの 2 種類の操作があります。 "コントロール プレーン" 操作は、サブスクリプション内でリソースを管理するために使用します。 "データ プレーン" 操作は、リソースによって公開されている機能にアクセスするために使用します。 たとえば、仮想マシンの作成にはコントロール プレーン操作を使用しますが、リモート デスクトップ プロトコル (RDP) を使って仮想マシンに接続するときは、データ プレーン操作を使用します。

既存のリソースを JSON テンプレートにエクスポートする

Azure リソースの作成方法に関係なく、各リソースに関する情報は、Resource Manager によって JSON 形式で使用できるようになります。 リソースの JSON 表現のコピーを要求する場合、リソースを "エクスポート" します。 エクスポートした JSON ファイルは、Bicep に逆コンパイルできます。

Resource Manager には、Azure リソースをテンプレートにエクスポートするための方法が複数用意されています。 Azure portal、Azure CLI、Azure PowerShell コマンドレットを使用して、単一のリソース、複数のリソース、リソース グループ全体をエクスポートできます。

エクスポート プロセスはコントロール プレーン操作です。つまり、Azure リソースの構成のみがエクスポートされます。 たとえば、仮想マシンをエクスポートする場合、仮想マシンのハード ドライブ上のデータはエクスポートされません。 また、ストレージ アカウントをエクスポートするときは、ストレージ アカウントの BLOB と他のコンテンツはエクスポート プロセスに含まれません。

既存のリソースをエクスポートするときは、いくつかのことを考慮する必要があります。

  • エクスポートされたリソース定義は、そのリソースの現在の状態のスナップショットです。 これには、最初のデプロイ以降にリソースに加えられたすべての変更が含まれます。
  • エクスポートされたテンプレートには、通常は Bicep 定義から省略される既定のリソース プロパティが含まれる場合があります。 たとえば、エクスポート プロセスでは、Azure によって自動的に設定される読み取り専用プロパティが追加される場合があります。 これらのプロパティは読み取り専用であるため、含めても意味がありません。 Bicep に移行する際には、これらのプロパティをリソース定義から削除して、混乱を招く可能性のある不要なコードが Bicep ファイルに含まれないようにすることを検討してください。
  • エクスポートされたテンプレートには、テンプレートを再利用可能にするために必要なパラメーターが必ずしもすべて含まれていないことがあります。 テンプレートをエクスポートすると、多くのプロパティがテンプレートにハードコーディングされます。 パラメーターを追加する方法については、このモジュールで後ほど説明します。
  • 一部のリソースはこのアプローチを使用してエクスポートできないため、Bicep ファイルで、手動で定義する必要があります。 これらのリソースを再作成する方法については、このユニットで後ほど学習します。

デプロイを JSON テンプレートに保存する

Azure portal からリソースを手動でデプロイしたことがある場合、[確認および作成] タブの [オートメーション用のテンプレートをダウンロードする] オプションに気付いているかもしれません。このオプションにより、portal でリソースを作成するときに設定した名前とプロパティに基づいて JSON ARM テンプレートが保存されます。

Resource Manager では、リソースの "デプロイ" も追跡されます。 デプロイ操作には、Azure portal のリソース作成エクスペリエンスによって送信された変更、および ARM テンプレートのデプロイが含まれます。 通常、Azure portal、Azure PowerShell コマンドレット、Azure CLI、またはその他のツールを使用して行われた既存のリソースへの変更では、デプロイは作成されません。

互換性のあるツールを使用してデプロイが作成された場合、リソース グループのデプロイ履歴からデプロイ テンプレートにアクセスできます。 デプロイを保存するには、Azure portal、Azure CLI、または Azure PowerShell を使用できます。

この方法を使用してテンプレートを保存するときは、いくつかのことを考慮する必要があります。

  • 保存されたテンプレートには、デプロイ時のリソースの状態が表示されます。 これには、デプロイ後に加えられた変更は含まれません。
  • デプロイに複数のリソースが含まれている場合、特定のリソースを選択して含めることも除外することもできません。 この操作により、初期デプロイに含まれたすべてのリソースの定義がダウンロードされます。 ただし、プロセスの移行フェーズに移ったときに、不要なリソースを手動で無視できます。
  • テンプレートには、デプロイに必要なリソース プロパティのみが含まれます。
  • テンプレートには、複数の環境にテンプレートを再デプロイするために使用できるパラメーターが含まれる場合があります。 ただし、これらのパラメーターがニーズに適していることを確認する必要があります。
  • テンプレートには関係のないプロパティは含まれていないはずですが、それでも、必要なものがすべてテンプレートに含まれていることを確認し、不要なプロパティをすべて削除する必要があります。

Note

ただし、既存のリソースのエクスポート、またはデプロイの保存のいずれかによってリソースをエクスポートする場合、エクスポートされたファイルは開始点として扱い、直接使用しないでください。 代わりに、最終的なテンプレートの開始点として使用します。

既存のリソースを Bicep に挿入する

Visual Studio Code の Bicep 拡張機能には、Azure リソースの Bicep 表現をキャプチャする Insert Resource コマンドが含まれています。 このコマンドでは、Azure からリソースの JSON 定義を読み取り、読み取り専用として認識されるプロパティを削除して、JSON を Bicep に逆コンパイルします。 エクスポート機能と同様に、生成された Bicep コードは、最終的な Bicep ファイルの開始点として使用できます。

リソースをインポートするには、Visual Studio Code コマンド パレットを開きます。 Windows と Linux の場合は Ctrl + Shift + P キー、macOS の場合は ⌘ + Shift + P キーを使います。

ソース JSON ARM テンプレートを逆コンパイルする

Azure リソースを Bicep に移行するための 2 番目のステップは、JSON ARM テンプレートと Azure リソースを Bicep テンプレートに変換することです。 Bicep ツールには、テンプレートを変換する decompile コマンドが含まれています。 decompile コマンドは、Azure CLI または Bicep CLI のいずれかから呼び出すことができます。

逆コンパイル プロセスは、JSON から Bicep への完全なマッピングを保証するものではありません。 生成された Bicep ファイルを使用してリソースをデプロイする前に、テンプレートのベスト プラクティスを満たすようにファイルを修正することが必要な場合があります。 それを移行の開始点と考えてください。 逆コンパイル プロセス中に発生する問題の修正方法については、このモジュールで後ほど学習します。

テンプレートを逆コンパイルすると、変換フェーズが完了します。 これで、開始点となる有効な Bicep ファイルが完成します。

移行フェーズ

リソースを Bicep に移行する "移行" フェーズの目標は、デプロイ可能な Bicep ファイルの最初のドラフトを作成し、移行のスコープ内にあるすべての Azure リソースを確実に定義することです。

移行フェーズは、3 つのステップで構成され、それらを順に完了します。

  1. 新しい空の Bicep ファイルを作成する。
  2. 逆コンパイルされたテンプレートから各リソースをコピーする。
  3. 不足しているリソースを特定して再作成する。

Diagram that shows the steps for migrating a template to Bicep.

新しい Bicep ファイルを作成する

新しい Bicep ファイルを作成することをお勧めします。 "変換" フェーズで作成したファイルは、参照できる参照点ですが、最終版として扱ったり、そのままデプロイしたりすることはできません。

リソースを新しい Bicep ファイルにコピーする

変換された Bicep ファイルから新しい Bicep ファイルに各リソースを個別にコピーします。 このプロセスは、リソースごとに問題を解決し、テンプレートのサイズが大きくなるとともに生じる混乱を回避するのに役立ちます。

サポートされていないリソースを再作成する

すべての Azure リソースの種類を、Azure portal、Azure CLI、または Azure PowerShell を使用してエクスポートできるわけではありません。 たとえば、DependencyAgentWindowsMMAExtension (Microsoft Monitoring Agent) などの仮想マシン拡張機能は、エクスポートできないリソースの種類です。

Azure portal、Azure CLI、または Azure PowerShell を使用してリソースをエクスポートしようとしたときに、サポートされていないリソースの種類が含まれていると、詳細なエラー メッセージが生成されます。 仮想マシン拡張機能など、新しい Bicep ファイルでエクスポートされなかったすべてのリソースを作成し直す必要があります。 Azure Resource Explorer、ARM テンプレート リファレンス、Azure クイックスタート テンプレートなど、複数のツールとアプローチから選択してリソースを再作成できます。

Azure Resource Explorer

Azure Resource Explorer は、Azure portal に埋め込まれているツールです。 ポータルでは特定のリソースの種類は表示されませんが、Resource Explorer ではリソースの JSON 表現が提供されます。 Resource Explorer にアクセスするには、検索ボックスで検索します。

Screenshot of the Azure portal that shows the search box with resource explorer entered.

結果ペインには、サブスクリプションに登録されているリソース プロバイダーの一覧と、ユーザーが表示するためのアクセス許可を持っているすべてのリソース、リソース グループ、サブスクリプションの詳細が表示されます。 リソースの JSON 表現を表示するには、ペインの左側にある階層を選択します。

Screenshot of the Azure portal that shows Azure Resource Explorer.

リソースを選択すると、次の例のように、JSON 表現を表示できます。

{
    "name": "DependencyAgentWindows",
    "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/rg-app-prod-truckline/providers/Microsoft.Compute/virtualMachines/vm-prod-001/extensions/DependencyAgentWindows",
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "location": "eastus",
    "properties": {
        "autoUpgradeMinorVersion": true,
        "provisioningState": "Succeeded",
        "publisher": "Microsoft.Azure.Monitoring.DependencyAgent",
        "type": "DependencyAgentWindows",
        "typeHandlerVersion": "9.10"
    }
}

JSON 表現を使用して、Bicep リソースを定義できます。

resource dependencyAgentWindows 'Microsoft.Compute/virtualMachines/extensions@2022-08-01' = {
  parent: virtualMachine
  name: 'DependencyAgentWindows'
  location: 'eastus'
  properties: {
    autoUpgradeMinorVersion: true
    publisher: 'Microsoft.Azure.Monitoring.DependencyAgent'
    type: 'DependencyAgentWindows'
    typeHandlerVersion: '9.10'
  }
}

Note

JSON 表現には、provisioningState という名前のプロパティが含まれています。 provisioningState プロパティは読み取り専用であり、Azure によって自動的に設定されるため、Bicep のリソース定義には含まれません。

ヒント

Visual Studio Code 用の Bicep 拡張機能は、Bicep で Azure リソースを定義するのに役立ちます。 たとえば、リソースの Bicep 表現には API バージョンが含まれていますが、エクスポートされた JSON バージョンには含まれていません。 Visual Studio Code でリソースの種類の入力を始めると、API のバージョンが自動的に提示されます。

Resource Manager テンプレート リファレンス

ARM テンプレート リファレンスは、ARM テンプレート構造、リソースの種類、API バージョン、Azure リソースのプロパティ定義に関する情報源です。 そのドキュメントでは、Bicep と JSON 両方の形式の例が提供されています。

Microsoft.Web/serverfarms や API のバージョンなど、特定のリソース プロバイダーとリソースの種類を選択できます。 必須のリソース プロパティとオプションのリソース プロパティを確認できます。 プロパティの動作を理解するのに役立つプロパティの説明を表示することもできます。

Azure のクイック スタート テンプレート

Azure クイックスタート テンプレート リポジトリは、コミュニティによって提供されたテンプレートのコレクションです。 検索可能なテンプレートから成るこのリポジトリには、多くの Azure リソースとソリューションの例が用意されています。 一部のクイックスタートでは、JSON ARM テンプレートと Bicep ARM テンプレートの両方を表示できます。 これらのテンプレートは、デプロイ用のテンプレートを自分で作成して検証するのに役立つ基点として使用できます。

Azure App Service プランとアプリを構築するテンプレートを探しているとします。 各クイックスタート テンプレートには、テンプレートを Azure に直接デプロイするか、GitHub でテンプレートを表示するためのオプションがあります。

Screenshot that shows an Azure Quickstart Template that deploys a basic Linux web app.

Azure クイックスタート テンプレートはコミュニティの投稿であることに留意してください。 Azure サービスには定期的に機能が追加されるため、一部の例は最新でない可能性があります。 この例には、テンプレートを使用するために必要のないリソースやプロパティが含まれている場合もあります。 それでも、クイックスタート テンプレートのリポジトリは、便利なリソースであり、ARM テンプレートを使用してリソースをデプロイする方法を理解するのに役立ちます。