🦾

Logic Apps の ARM テンプレート化

2025/02/13に公開

はじめに

Azure では各種リソースをコード化する場合、ARM テンプレートがよく使われます。一から作成するのは難しいため、実際に Azure ポータルでリソースを作成して [テンプレートのエクスポート] 機能を使用するのですが、Logic Apps の場合は各コネクタで使用する API 接続情報が含まれてしまうため、そのまま再利用ができません。
そこで ARM テンプレートでデプロイできるように加工する方法を整理します。

課題

作成済みの Logic Apps の ARM テンプレートをエクスポートすると、以下のように API 接続の情報が含まれています。


既存で API 接続のリソースが存在すれば、それを指定するように加工すればよいのですが、存在しない環境にデプロイする場合は API 接続リソースも一緒に作成する必要があります。ちなみに既存の API 接続は以下の手順で確認できます。

ARM テンプレートを加工

以下のようなフォーマットを準備します。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "PlaybookName": {
            "type": "string",
            "metadata": {
                "description": "Name of the Logic Apps resource to be created"
            }
        },
        "Location": {
            "defaultValue": "[resourceGroup().location]",
            "type": "string",
            "metadata": {
                "description": "Location of the Logic Apps resource to be created"
            }
        }
    },
    "variables": {
        "azureblob": "[concat('azureblob-', parameters('PlaybookName'))]",
        "office365": "[concat('office365-', parameters('PlaybookName'))]",

        //---<追加する API 接続のリソース名用の変数を追記>---

    },
    "resources": [
        {
            "type": "Microsoft.Web/connections",
            "apiVersion": "2016-06-01",
            "name": "[variables('azureblob')]",
            "location": "[parameters('Location')]",
            "kind": "V1",
            "properties": {
                "displayName": "[parameters('PlaybookName')]",
                "customParameterValues": {
                },
                "parameterValueSet": {
                    "name": "managedIdentityAuth",
                    "values": {}
                },
                "api": {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/azureblob')]"
                }
            }
        },
        {
            "type": "Microsoft.Web/connections",
            "apiVersion": "2016-06-01",
            "name": "[variables('office365')]",
            "location": "[parameters('Location')]",
            "properties": {
                "displayName": "[parameters('PlaybookName')]",
                "customParameterValues": {},
                "api": {
                    "id": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/office365')]"
                }
            }
        },
        {
            "type": "Microsoft.Web/connections",
            "apiVersion": "2016-06-01",
            "name": "[variables('指定した変数名')]",
            "location": "[parameters('Location')]",
            "kind": "V1",
            "properties": {
                "displayName": "[parameters('PlaybookName')]",

                //---<既存の API 接続からエクスポートしたテンプレートを参考にプロパティを指定>---

                "api": {
                        "id": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/xxxxxxx')]"
                        //---<xxxxxxx の箇所は既存 API 接続で確認、Azure Monitor であれば azuremonitorlogs、Sentinel であれば azuresentinel など>---
                }
            }
        },
        {
            "type": "Microsoft.Logic/workflows",
            "apiVersion": "2017-07-01",
            "name": "[parameters('PlaybookName')]",
            "location": "[parameters('Location')]",
            "identity": {
                "type": "SystemAssigned"
            },
            "dependsOn": [
                "[resourceId('Microsoft.Web/connections', variables('azureblob'))]",
                "[resourceId('Microsoft.Web/connections', variables('office365'))]"
            ],
            "properties": {
                "state": "Enabled",
                "definition": {

                //---<Logic Apps の ARM テンプレートの "defenition" を入れる>---

                },
                "parameters": {
                    "$connections": {
                        "value": {
                            "azureblob": {
                                "connectionId": "[resourceId('Microsoft.Web/connections', variables('azureblob'))]",
                                "connectionName": "[variables('azureblob')]",
                                "id": "[concat('/subscriptions/', subscription().subscriptionId,'/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/azureblob')]",
                                "connectionProperties": {
                                    "authentication": {
                                        "type": "ManagedServiceIdentity"
                                    }
                                }
                            },
                            "office365": {
                                "connectionId": "[resourceId('Microsoft.Web/connections', variables('office365'))]",
                                "connectionName": "[variables('office365')]",
                                "id": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/office365')]"
                            }
                        }
                    }
                }
            }
        }
    ]
}

上記を参考にいくつか加工していきます。

  • "definition": {} の箇所にエクスポートした Logic Apps のテンプレート内の "definition": {} の内容を追加します。
  • "definition": {} 内で指定されている connection 名が異なる場合は修正します。 (例:上記のoffice365 の場合、"name": "@parameters('$connections')['office365']['connectionId']" と指定されている)
  • 使用している connection が他にある場合は "variables": の箇所に追記し、 "type": "Microsoft.Web/connections" のデプロイを追加します。
  • 追加でデプロイするための情報は API 接続のページで [テンプレートのエクスポート] を開いて確認します。デフォルトで勝手に指定される項目っぽいものを除いてプロパティを決めていきます。
  • 一部テンプレートには表示されない内容があり、デプロイエラーになる場合があるので、エラーの内容と JSON ビューを確認してプロパティを追記します。


デプロイ後

デプロイした後、API 接続情報を更新していきます。特に認証情報が必要なケースは以下のようにエラーになっています。


[API 接続] から該当の API 接続を選択し、[API 接続の編集] を開きます。


[承認] ボタンをクリックします。認証が必要な場合にはダイアログが表示されますので、認証情報を入力します。


[保存] をクリックします。[ロジック アプリ デザイナー] に戻り、エラーが解消していることを確認します。

まとめ

Logic Apps を ARM テンプレート エクスポートでは API 接続情報が含まれてしまい、そのままでは再利用できない課題があります。そのため、今回はエクスポートしたテンプレートを加工し、必要な API 接続を定義・追加することで対応する方法を説明しています。使う API 接続によっては上記でうまくいかないケースもあると思いますので、その場合はデプロイ エラーのメッセージ各や必要に応じてサポートへの問い合わせを実施ください。

Microsoft (有志)

Discussion