カスタム リソース プロバイダーを使用してリソースを拡張する

このチュートリアルでは、Microsoft.CustomProviders/associations リソースの種類を使用して、Azure Resource Manager API を拡張するカスタム リソース プロバイダーを Azure にデプロイします。 このチュートリアルでは、カスタム リソース プロバイダー インスタンスが配置されているリソース グループの外にある既存のリソースを拡張する方法を示します。 このチュートリアルでは、カスタム リソース プロバイダーは Azure Logic Apps によって提供されていますが、任意のパブリック API エンドポイントを使用してもかまいません。

前提条件

このチュートリアルを完了するには、以下をレビューすることが必要です:

リソース オンボードの概要

このチュートリアルでは、カスタム リソース プロバイダーその関連付けの 2 つの部品をデプロイする必要があります。 プロセスを簡単にするために、必要に応じて、両方をデプロイする単一のテンプレートを使用できます。

テンプレートでは、次のリソースが使用されます。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string",
            "allowedValues": [
                "australiaeast",
                "eastus",
                "westeurope"
            ],
            "metadata": {
                "description": "Location for the resources."
            }
        },
        "logicAppName": {
            "type": "string",
            "defaultValue": "[uniqueString(resourceGroup().id)]",
            "metadata": {
                "description": "Name of the logic app to be created."
            }
        },
        "customResourceProviderName": {
            "type": "string",
            "defaultValue": "[uniqueString(resourceGroup().id)]",
            "metadata": {
                "description": "Name of the custom resource provider to be created."
            }
        },
        "customResourceProviderId": {
            "type": "string",
            "defaultValue": "",
            "metadata": {
                "description": "The resource ID of an existing custom resource provider. Provide this to skip deployment of new logic app and custom resource provider."
            }
        },
        "associationName": {
            "type": "string",
            "defaultValue": "myAssociationResource",
            "metadata": {
                "description": "Name of the custom resource that is being created."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2021-04-01",
            "condition": "[empty(parameters('customResourceProviderId'))]",
            "name": "customProviderInfrastructureTemplate",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {
                        "logicAppName": {
                            "type": "string",
                            "defaultValue": "[parameters('logicAppName')]"
                        }
                    },
                    "resources": [
                        {
                            "type": "Microsoft.Logic/workflows",
                            "apiVersion": "2019-05-01",
                            "name": "[parameters('logicAppName')]",
                            "location": "[parameters('location')]",
                            "properties": {
                                "state": "Enabled",
                                "definition": {
                                    "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
                                    "actions": {
                                        "Switch": {
                                            "cases": {
                                                "Case": {
                                                    "actions": {
                                                        "CreateCustomResource": {
                                                            "inputs": {
                                                                "body": {
                                                                    "properties": "@addProperty(triggerBody().Body['properties'], 'myDynamicProperty', 'myDynamicValue')"
                                                                },
                                                                "statusCode": 200
                                                            },
                                                            "kind": "Http",
                                                            "type": "Response"
                                                        }
                                                    },
                                                    "case": "CREATE"
                                                }
                                            },
                                            "default": {
                                                "actions": {
                                                    "DefaultHttpResponse": {
                                                        "inputs": {
                                                            "statusCode": 200
                                                        },
                                                        "kind": "Http",
                                                        "type": "Response"
                                                    }
                                                }
                                            },
                                            "expression": "@triggerBody().operationType",
                                            "type": "Switch"
                                        }
                                    },
                                    "contentVersion": "1.0.0.0",
                                    "outputs": {},
                                    "parameters": {},
                                    "triggers": {
                                        "CustomProviderWebhook": {
                                            "inputs": {
                                                "schema": {}
                                            },
                                            "kind": "Http",
                                            "type": "Request"
                                        }
                                    }
                                }
                            }
                        },
                        {
                            "type": "Microsoft.CustomProviders/resourceProviders",
                            "apiVersion": "2018-09-01-preview",
                            "name": "[parameters('customResourceProviderName')]",
                            "location": "[parameters('location')]",
                            "properties": {
                                "resourceTypes": [
                                    {
                                        "name": "associations",
                                        "mode": "Secure",
                                        "routingType": "Webhook,Cache,Extension",
                                        "endpoint": "[[listCallbackURL(concat(resourceId('Microsoft.Logic/workflows', parameters('logicAppName')), '/triggers/CustomProviderWebhook'), '2019-05-01').value]"
                                    }
                                ]
                            }
                        }
                    ],
                    "outputs": {
                        "customProviderResourceId": {
                            "type": "string",
                            "value": "[resourceId('Microsoft.CustomProviders/resourceProviders', parameters('customResourceProviderName'))]"
                        }
                    }
                }
            }
        },
        {
            "type": "Microsoft.CustomProviders/associations",
            "apiVersion": "2018-09-01-preview",
            "name": "[parameters('associationName')]",
            "location": "global",
            "properties": {
                "targetResourceId": "[if(empty(parameters('customResourceProviderId')), reference('customProviderInfrastructureTemplate').outputs.customProviderResourceId.value, parameters('customResourceProviderId'))]",
                "myCustomInputProperty": "myCustomInputValue",
                "myCustomInputObject": {
                    "Property1": "Value1"
                }
            }
        }
    ],
    "outputs": {
        "associationResource": {
            "type": "object",
            "value": "[reference(parameters('associationName'), '2018-09-01-preview', 'Full')]"
        }
    }
}

カスタム リソース プロバイダー インフラストラクチャのデプロイ

テンプレートの最初の部分では、カスタム リソース プロバイダー インフラストラクチャがデプロイされます。 このインフラストラクチャには、関連付けリソースの効果が定義されています。 カスタム リソース プロバイダーについてよくご存じでない場合は、「Azure カスタム リソース プロバイダーの概要」を参照してください。

カスタム リソース プロバイダー インフラストラクチャをデプロイしましょう。 前のテンプレートをコピー、保存、デプロイするか、Azure portal を使用して手順に沿ってインフラストラクチャをデプロイします。

  1. Azure ポータルにアクセスします。

  2. [すべてのサービス] 内か、または主要な検索ボックスを使用して、テンプレートを検索します。

    検索クエリとして 'templates' が入力されている Azure portal の検索バーのスクリーンショット。

  3. [テンプレート] ウィンドウ上で [追加] を選択します。

    [追加] ボタンが強調表示された Azure portal の [テンプレート] ペインのスクリーンショット。

  4. [全般] の下で、新しいテンプレートの [名前][説明] を入力します。

    ユーザーが新しいテンプレートの [名前] と [説明] を入力する Azure portal の [一般] セクションのスクリーンショット。

  5. この記事の「リソース オンボードの概要」セクションの JSON テンプレートをコピーして、Resource Manager テンプレートを作成します。

    ユーザーが JSON テンプレートを [ARM テンプレート] セクションに貼り付けを行う Azure portal のスクリーンショット。

  6. [追加] を選択して、テンプレートを作成します。 新しいテンプレートが表示されない場合は、 [更新] を選択します。

  7. 新しく作成されたテンプレートを選択して、 [デプロイ] を選択します。

    新しく作成されたテンプレートが表示され、[デプロイ] ボタンが強調表示されている Azure portal のスクリーンショット。

  8. 必須フィールドに設定を入力し、サブスクリプションとリソース グループを選択します。 [Custom Resource Provider Id](カスタム リソース プロバイダー ID) ボックスは空のままにできます。

    設定名 必須 説明
    場所 はい テンプレート内のリソースの場所。
    ロジック アプリ名 いいえ ロジック アプリの名前。
    カスタム リソース プロバイダー名 いいえ カスタム リソース プロバイダーの名前。
    カスタム リソース プロバイダー ID いいえ 関連付けリソースをサポートする既存のカスタム リソース プロバイダー。 ここに値を指定すると、ロジック アプリとカスタム リソース プロバイダーのデプロイはスキップされます。
    関連付けの名前 いいえ 関連付けリソースの名前。

    サンプル パラメーター:

    カスタム リソース プロバイダー デプロイのためのテンプレート パラメータ入力フィールドが表示されている Azure portal のスクリーンショット。

  9. デプロイへ移動し、完了するまで待ちます。 次のような画面が表示されます。 新しい関連付けリソースが出力として表示されます。

    新しい関連リソースが出力となっている成功したデプロイが表示されている Azure portal のスクリーンショット。

    次に、 [非表示の型の表示] が選択されている状態で、リソース グループを示します。

    [非表示の型を表示] が選択され、カスタム リソースプロバイダー デプロイが表示されている Azure portal のリソース グループのスクリーンショット。

  10. ロジック アプリの [実行の履歴] タブを調べて、関連付けの作成の呼び出しを確認します。

    関連の作成の呼び出しが表示されている Azure portal の [ロジック アプリ実行履歴] タブのスクリーンショット。

追加の関連付けをデプロイする

カスタム リソース プロバイダー インフラストラクチャをセットアップすると、以降はより多くの関連付けを簡単にデプロイできます。 追加の関連付け用のリソース グループを、カスタム リソース プロバイダー インフラストラクチャをデプロイしたリソース グループと同じにする必要はありません。 関連付けを作成するには、指定されたカスタム リソース プロバイダー ID 上で Microsoft.CustomProviders/resourceproviders/write アクセス許可を保持している必要があります。

  1. 前のデプロイのリソース グループ内にあるカスタム リソース プロバイダーの Microsoft.CustomProviders/resourceProviders リソースに移動します。 [非表示の型の表示] チェック ボックスを選択することが必要になります:

    [非表示の型を表示] が選択され、リソース グループ内のカスタム リソース プロバイダー リソースが表示されている Azure portal のスクリーンショット。

  2. カスタム リソース プロバイダーのリソース ID プロパティをコピーします。

  3. [すべてのサービス] 内か、または主要な検索ボックスを使用して、テンプレートを検索します。

    検索クエリとして 'templates' が入力されている Azure portal の検索バーのスクリーンショット。

  4. 以前に作成されたテンプレートを選択して、 [デプロイ] を選択します。

    以前に作成されたテンプレートが表示され、[デプロイ] ボタンが強調表示されている Azure portal のスクリーンショット。

  5. 必須フィールドに設定を入力し、サブスクリプションと別のリソース グループを選択します。 [カスタム リソース プロバイダー ID] 設定に、先にデプロイしたカスタム リソース プロバイダーからコピーしたリソース ID を入力します。

  6. デプロイへ移動し、完了するまで待ちます。 この際、新しい関連付けリソースのみをデプロイする必要があります。

    新しい関連リソースの成功したデプロイが表示されている Azure portal のスクリーンショット。

ロジック アプリの [実行履歴] に戻って、ロジック アプリへの別の呼び出しが行われたことを確認できます。 ロジック アプリを更新して、作成された関連付けごとに追加の機能を拡張できます。

次のステップ

このアーティクルでは、Microsoft.CustomProviders/associations リソースの種類を使用して、Azure Resource Manager API を拡張するカスタム リソース プロバイダーを Azure にデプロイします。 カスタム リソース プロバイダーについて引き続き学習するには、次を参照してください。