다음을 통해 공유


사용자 지정 공급자를 사용하여 리소스 확장

이 자습서에서는 Microsoft.CustomProviders/associations 리소스 종류를 사용하여 Azure Resource Manager API를 확장하는 사용자 지정 리소스 공급자를 Azure에 배포합니다. 이 자습서에서는 사용자 지정 리소스 공급자 인스턴스가 위치한 리소스 그룹 외부에 있는 기존 리소스를 확장하는 방법을 보여줍니다. 이 자습서에서 사용자 지정 리소스 공급자는 Azure 논리 앱을 기반으로 하지만, 아무 공용 API 엔드포인트를 사용해도 됩니다.

필수 조건

이 자습서를 완료하려면 다음 사항을 검토해야 합니다.

리소스 온보딩 시작

이 자습서에서는 사용자 지정 리소스 공급자연결이라는 두 가지를 배포해야 합니다. 원한다면 프로세스를 단순화하기 위해 두 가지를 모두 배포하는 단일 템플릿을 사용해도 됩니다.

이 템플릿은 다음 리소스를 사용합니다.

{
    "$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 Portal로 이동합니다.

  2. 모든 서비스에서 또는 주 검색 상자를 사용하여 템플릿을 검색합니다.

    Screenshot of the search bar in Azure portal with 'templates' entered as the search query.

  3. 다음과 같이 템플릿 창에서 추가를 선택합니다.

    Screenshot of the Templates pane in Azure portal with the Add button highlighted.

  4. 일반 아래에서 새 템플릿의 이름설명을 입력합니다.

    Screenshot of the General section in Azure portal where the user enters a Name and Description for the new template.

  5. 이 문서의 "리소스 온보딩 시작" 섹션에서 JSON 템플릿을 복사하여 Resource Manager 템플릿을 만듭니다.

    Screenshot of the Azure portal where the user pastes the JSON template into the ARM Template section.

  6. 추가를 선택하여 템플릿을 만듭니다. 새 템플릿이 표시되지 않으면 새로 고침을 선택합니다.

  7. 새로 만든 템플릿을 선택하고 배포를 선택합니다.

    Screenshot of the Azure portal showing the newly created template with the Deploy button highlighted.

  8. 필수 필드의 설정을 입력하고 구독 및 리소스 그룹을 선택합니다. 사용자 지정 리소스 공급자 Id 상자는 비워 놓아도 됩니다.

    설정 이름 필수 여부 설명
    위치 템플릿에서 리소스의 위치입니다.
    논리 앱 이름 아니요 논리 앱의 이름입니다.
    사용자 지정 리소스 공급자 이름 아니요 사용자 지정 리소스 공급자 이름입니다.
    사용자 지정 리소스 공급자 ID 아니요 연결 리소스를 지원하는 기존 사용자 지정 리소스 공급자입니다. 여기서 값을 지정하는 경우 논리 앱 및 사용자 지정 리소스 공급자 배포를 건너뛰게 됩니다.
    연결 이름 아니요 연결 리소스의 이름입니다.

    샘플 매개 변수:

    Screenshot of the Azure portal displaying the template parameters input fields for the custom resource provider deployment.

  9. 배포로 이동하여 배포가 끝나기를 기다립니다. 다음 스크린샷과 유사한 내용이 보일 것입니다. 새 연결 리소스가 출력으로 표시됩니다.

    Screenshot of the Azure portal showing a successful deployment with the new association resource as an output.

    다음은 숨겨진 형식 표시가 선택된 리소스 그룹입니다.

    Screenshot of the resource group in Azure portal with Show hidden types selected, displaying the custom resource provider deployment.

  10. 논리 앱 실행 기록 탭을 검색하여 연결 만들기 호출을 확인합니다.

    Screenshot of the Logic app Runs history tab in Azure portal showing the calls for the association create.

추가 연결 배포

사용자 지정 리소스 공급자 인프라를 설정한 후에는 더 많은 연결을 쉽게 배포할 수 있습니다. 추가 연결을 위한 리소스 그룹은 사용자 지정 리소스 공급자 인프라를 배포한 리소스 그룹과 같을 필요가 없습니다. 연결을 만들려면 지정된 사용자 지정 리소스 공급자 ID에 대한 Microsoft.CustomProviders/resourceproviders/write 권한이 있어야 합니다.

  1. 이전 배포의 리소스 그룹에서 사용자 지정 리소스 공급자 Microsoft.CustomProviders/resourceProviders 리소스로 이동합니다. 숨겨진 형식 표시 확인란을 선택해야 합니다.

    Screenshot of the Azure portal displaying the custom resource provider resource in the resource group with Show hidden types selected.

  2. 사용자 지정 리소스 공급자의 리소스 ID 속성을 복사합니다.

  3. 모든 서비스에서 또는 주 검색 상자를 사용하여 템플릿을 검색합니다.

    Screenshot of the search bar in Azure portal with 'templates' entered as the search query.

  4. 다음과 같이 이전에 만든 템플릿을 선택하고 배포를 선택합니다.

    Screenshot of the Azure portal showing the previously created template with the Deploy button highlighted.

  5. 필수 필드의 설정을 입력한 다음, 구독 및 다른 리소스 그룹을 선택합니다. 사용자 지정 리소스 공급자 Id 설정의 경우 이전에 배포한 사용자 지정 리소스 공급자에서 복사한 리소스 ID를 입력합니다.

  6. 배포로 이동하여 배포가 끝나기를 기다립니다. 이제 다음과 같이 새 연결 리소스만 배포됩니다.

    Screenshot of the Azure portal displaying the successful deployment of the new associations resource.

논리 앱 실행 기록으로 돌아가서 논리 앱에 대한 다른 호출이 수행되었는지 확인할 수 있습니다. 만든 각 연결에 대한 추가 기능을 보강하도록 논리 앱을 업데이트할 수 있습니다.

다음 단계

이 문서에서는 Microsoft.CustomProviders/associations 리소스 종류를 사용하여 Azure Resource Manager API를 확장하는 사용자 지정 리소스 공급자를 Azure에 배포합니다. 사용자 지정 리소스 공급자에 대한 학습을 계속하려면 다음을 참조하세요.