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

完了

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

Azure リソースを Bicep に移行するための推奨ワークフローの変換と移行のフェーズを示す図。

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

変換フェーズ

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

変換フェーズは、次の 2 つのステップで構成されます。このステップは順番に完了します。

  1. Azure リソースの構成を記録する。
  2. 必要に応じて、 decompile コマンドを使用して JSON 表現を Bicep に変換します。

JSON に逆コンパイルされた JSON テンプレートと、JSON テンプレートにエクスポートされた Azure リソースを示す図。その後逆コンパイルされます。

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

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

Azure がリソースを表す方法

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

すべての Azure クライアントとライブラリからの要求を受け入れる Resource Manager を示す図。

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

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

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

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

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

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

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

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

Azure portal からリソースを手動でデプロイしたことがある場合は、[確認と作成] タブで自動化用のテンプレートをダウンロードするオプションに気付いた可能性があります。このオプションは、ポータルでリソースを作成するときに設定した名前とプロパティに基づく JSON ARM テンプレートを保存します。

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

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

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

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

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

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

Visual Studio Code の Bicep 拡張機能には、Azure リソース の Bicep 表現をキャプチャする [リソースの挿入] コマンドが含まれています。 このコマンドは、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. 不足しているリソースを特定して再作成します。

テンプレートを Bicep に移行する手順を示す図。

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

新しい Bicep ファイルを作成するのは良い習慣です。 変換フェーズで作成したファイルは参照ポイントですが、最終的なファイルとして扱ったり、as-is展開したりしないでください。

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

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

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

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

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

Azure リソース エクスプローラー

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

リソース エクスプローラーが入力された検索ボックスを示す Azure portal のスクリーンショット。

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

Azure リソース エクスプローラーを示す Azure portal のスクリーンショット。

リソースを選択すると、次の例のように 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'
  }
}

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

ヒント

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

ARM テンプレート リファレンス

ARM テンプレートリファレンスは、AZURE リソースの ARM テンプレート構造、リソースの種類、API バージョン、およびプロパティ定義に関する情報のソースです。 このドキュメントでは、Bicep 形式と JSON 形式の両方の例を示します。

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

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

Azure クイック スタート テンプレート リポジトリは、コミュニティが提供するテンプレートのコレクションです。 検索可能なテンプレートのこのリポジトリには、多くの Azure リソースとソリューションの例が用意されています。 一部のクイック スタートでは、JSON ARM テンプレートと Bicep ARM テンプレートの両方を表示できます。 これらのテンプレートを参照ポイントとして使用して、デプロイ用のテンプレートをビルドして検証できます。

Azure App Service プランとアプリをビルドするテンプレートを見つけたいとします。 各クイック スタート テンプレートには、テンプレートを Azure に直接デプロイするか、GitHub でテンプレートを表示するオプションがあります。

基本的な Linux Web アプリをデプロイする Azure クイック スタート テンプレートを示すスクリーンショット。

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