다음을 통해 공유


Azure에서 Service Fabric과 API Management 통합

Service Fabric을 사용하여 Azure API Management를 배포하는 것은 고급 시나리오입니다. API Management는 백 엔드 Service Fabric 서비스에 대한 풍부한 라우팅 규칙 집합을 사용하여 API를 게시해야 하는 경우에 유용합니다. 클라우드 애플리케이션은 일반적으로 사용자, 디바이스 또는 기타 애플리케이션에 대한 단일 수신 지점을 제공하기 위해 프런트 엔드 게이트웨이가 필요합니다. Service Fabric에서 게이트웨이는 ASP.NET Core 애플리케이션, Event Hubs, IoT Hub 또는 Azure API Management와 같은 트래픽을 수신하도록 설계된 상태 비저장 서비스일 수 있습니다.

이 문서에서는 Service Fabric을 사용하여 Azure API Management 를 설정하여 Service Fabric의 백 엔드 서비스로 트래픽을 라우팅하는 방법을 보여 줍니다. 완료되면 VNET에 API Management를 배포하고, 백 엔드 상태 비정상 서비스로 트래픽을 보내도록 API 작업을 구성했습니다. Service Fabric을 사용한 Azure API Management 시나리오에 대한 자세한 내용은 개요 문서를 참조하세요.

비고

Azure Az PowerShell 모듈을 사용하여 Azure와 상호 작용하는 것이 좋습니다. 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Azure로 마이그레이션을 참조하세요.

Availability

중요합니다

이 기능은 필요한 가상 네트워크 지원으로 인해 API Management의 프리미엄개발자 계층에서 사용할 수 있습니다.

필수 조건

시작하기 전에 다음을 수행하십시오.

네트워크 토폴로지

이제 Azure에 보안 Windows 클러스터를 마련했으므로, API Management를 API Management에 지정된 서브넷 및 NSG의 VNET(가상 네트워크)에 배포합니다. 이 문서의 경우 API Management Resource Manager 템플릿은 Windows 클러스터 자습서 에서 설정한 VNET, 서브넷 및 NSG의 이름을 사용하도록 미리 구성됩니다. 이 문서에서는 API Management 및 Service Fabric이 동일한 Virtual Network의 서브넷에 있는 Azure에 다음 토폴로지 배포합니다.

그림 캡션

Azure에 로그인하고 구독 선택

Azure 명령을 실행하기 전에 Azure 계정에 로그인하여 구독을 선택합니다.

Connect-AzAccount
Get-AzSubscription
Set-AzContext -SubscriptionId <guid>
az login
az account set --subscription <guid>

Service Fabric 백 엔드 서비스 배포

트래픽을 Service Fabric 백 엔드 서비스로 라우팅하도록 API Management를 구성하기 전에 먼저 요청을 수락하기 위해 실행 중인 서비스가 필요합니다.

기본 Web API 프로젝트 템플릿을 사용하여 무상태 ASP.NET Core Reliable Service를 만듭니다. 그러면 Azure API Management를 통해 노출하는 서비스에 대한 HTTP 엔드포인트가 만들어집니다.

관리자 권한으로 Visual Studio를 시작하고 ASP.NET Core 서비스를 만듭니다.

  1. Visual Studio에서 파일 -> 새 프로젝트를 선택합니다.

  2. 클라우드에서 Service Fabric 애플리케이션 템플릿을 선택하고 이름을 "ApiApplication"으로 지정합니다.

  3. 상태 비정상 ASP.NET Core 서비스 템플릿을 선택하고 프로젝트 이름을 "WebApiService"로 지정합니다.

  4. Web API ASP.NET Core 2.1 프로젝트 템플릿을 선택합니다.

  5. 프로젝트가 만들어지면, 엔드포인트 리소스 구성의 PackageRoot\ServiceManifest.xml 특성을 삭제하시려면 Port을 열어야 합니다.

    <Resources>
      <Endpoints>
        <Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" />
      </Endpoints>
    </Resources>
    

    포트를 제거하면 Service Fabric이 애플리케이션 포트 범위에서 동적으로 포트를 지정할 수 있으며, 클러스터 리소스 관리자 템플릿의 네트워크 보안 그룹을 통해 열리고 트래픽이 API Management에서 해당 포트로 흐를 수 있습니다.

  6. Visual Studio에서 F5 키를 눌러 웹 API를 로컬로 사용할 수 있는지 확인합니다.

    Service Fabric Explorer를 열고 ASP.NET Core 서비스의 특정 인스턴스로 드릴다운하여 서비스가 수신 대기 중인 기본 주소를 확인합니다. 기본 주소에 /api/values을 추가한 후 브라우저에서 엽니다. 그렇게 하면 웹 API 템플릿의 ValuesController에서 Get 메서드가 호출됩니다. 다음 두 문자열을 포함하는 JSON 배열인 템플릿에서 제공하는 기본 응답을 반환합니다.

    ["value1", "value2"]`
    

    Azure에서 API Management를 통해 노출하는 엔드포인트입니다.

  7. 마지막으로 Azure에서 클러스터에 애플리케이션을 배포합니다. Visual Studio에서 애플리케이션 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다. Azure의 Service Fabric 클러스터에 애플리케이션을 배포할 클러스터 엔드포인트(예 mycluster.southcentralus.cloudapp.azure.com:19000: )를 제공합니다.

이제 명명된 fabric:/ApiApplication/WebApiService ASP.NET Core 상태 비정상 서비스가 Azure의 Service Fabric 클러스터에서 실행되고 있어야 합니다.

Resource Manager 템플릿 다운로드 및 이해

다음 Resource Manager 템플릿 및 매개 변수 파일을 다운로드하여 저장합니다.

network-apim.json 템플릿은 Service Fabric 클러스터가 배포된 가상 네트워크에 새 서브넷 및 네트워크 보안 그룹을 배포합니다.

다음 섹션에서는 apim.json 템플릿에서 정의되는 리소스에 대해 설명합니다. 자세한 내용은 각 섹션 내의 템플릿 참조 설명서에 대한 링크를 따르세요. apim.parameters.json 매개 변수 파일에 정의된 구성 가능한 매개 변수는 이 문서의 뒷부분에서 설정합니다.

Microsoft.ApiManagement/service

Microsoft.ApiManagement/service 는 이름, SKU 또는 계층, 리소스 그룹 위치, 게시자 정보 및 가상 네트워크와 같은 API Management 서비스 인스턴스를 설명합니다.

Microsoft.ApiManagement/service/certificates

Microsoft.ApiManagement/service/certificates는 API Management 보안을 구성합니다. API Management는 클러스터에 대한 액세스 권한이 있는 클라이언트 인증서를 사용하여 서비스 검색을 위해 Service Fabric 클러스터로 인증해야 합니다. 이 문서에서는 Windows 클러스터를 만들 때 이전에 지정한 것과 동일한 인증서를 사용하며, 기본적으로 클러스터에 액세스하는 데 사용할 수 있습니다.

이 문서에서는 클라이언트 인증 및 클러스터 노드 간 보안에 동일한 인증서를 사용합니다. Service Fabric 클러스터에 액세스하도록 구성된 경우 별도의 클라이언트 인증서를 사용할 수 있습니다. Service Fabric 클러스터를 만들 때 지정한 클러스터 인증서의 프라이빗 키 파일(.pfx)의 이름, 암호데이터 (base-64로 인코딩된 문자열)를 제공합니다.

Microsoft.ApiManagement/service/backends

Microsoft.ApiManagement/service/backends 는 트래픽이 전달되는 백 엔드 서비스에 대해 설명합니다.

Service Fabric 백 엔드의 경우 Service Fabric 클러스터는 특정 Service Fabric 서비스 대신 백 엔드입니다. 이렇게 하면 단일 정책이 클러스터에서 둘 이상의 서비스로 라우팅할 수 있습니다. 여기에 있는 URL 필드는 백 엔드 정책에 서비스 이름이 지정되지 않은 경우 모든 요청이 기본적으로 라우팅되는 클러스터 서비스의 정규화된 서비스 이름입니다. 대체 서비스를 사용하지 않으려는 경우 "fabric:/fake/service"와 같은 가짜 서비스 이름을 사용할 수 있습니다. resourceId 는 클러스터 관리 엔드포인트를 지정합니다. clientCertificateThumbprintserverCertificateThumbprints는 클러스터에서 인증하는 데 사용되는 인증서를 식별합니다.

Microsoft.ApiManagement/service/products

Microsoft.ApiManagement/service/products는 제품을 만듭니다. Azure API Management에서 제품에는 하나 이상의 API와 사용 할당량 및 사용 약관이 포함되어 있습니다. 제품이 게시되면 개발자는 제품을 구독하고 제품의 API 사용을 시작할 수 있습니다.

제품에 대한 설명이 포함된 displayName설명을 입력합니다. 이 문서의 경우 구독이 필요하지만 관리자의 구독 승인은 필요하지 않습니다. 이 제품 상태는 "게시"되며 구독자에게 표시됩니다.

Microsoft.ApiManagement/service/apis

Microsoft.ApiManagement/service/api 는 API를 만듭니다. API Management의 API는 클라이언트 애플리케이션에서 호출할 수 있는 작업 집합을 나타냅니다. 작업이 추가되면 API가 제품에 추가되고 게시할 수 있습니다. API가 게시되면 개발자가 구독하고 사용할 수 있습니다.

  • displayName은 API의 모든 이름일 수 있습니다. 이 문서에서는 "Service Fabric 앱"을 사용합니다.
  • 이름은 "service-fabric-app"과 같은 API에 대한 고유하고 설명적인 이름을 제공합니다. 개발자 및 게시자 포털에 표시됩니다.
  • serviceUrl 은 API를 구현하는 HTTP 서비스를 참조합니다. API 관리는 요청을 이 주소로 전달합니다. Service Fabric 백 엔드의 경우 이 URL 값은 사용되지 않습니다. 여기에 값을 넣을 수 있습니다. 이 문서의 경우 예: "http://servicefabric".
  • 경로 는 API Management 서비스의 기본 URL에 추가됩니다. 기본 URL은 API Management 서비스 인스턴스에서 호스트하는 모든 API에 일반적입니다. API Management는 API를 접미사로 구분하므로 지정된 게시자의 모든 API에 대해 접미사가 고유해야 합니다.
  • 프로토콜은 API에 액세스하는 데 사용할 수 있는 프로토콜을 결정합니다. 이 문서에서는 http 및 https를 나열합니다.
  • 경로 는 API의 접미사입니다. 이 문서에서는 "myapp"을 사용합니다.

Microsoft.ApiManagement/service/apis/operations

Microsoft.ApiManagement/service/api/operations API Management의 API를 사용하려면 먼저 작업을 API에 추가해야 합니다. 외부 클라이언트는 Service Fabric 클러스터에서 실행되는 ASP.NET Core 상태 비정상 서비스와 통신하는 작업을 사용합니다.

프런트 엔드 API 작업을 추가하려면 다음 값을 입력합니다.

  • displayName설명 은 작업을 설명합니다. 이 문서에서는 "값"을 사용합니다.
  • 메서드 는 HTTP 동사를 지정합니다. 이 문서에서는 GET을 지정합니다.
  • urlTemplate 은 API의 기본 URL에 추가되고 단일 HTTP 작업을 식별합니다. 이 문서에서는 .NET 백 엔드 서비스를 추가했거나 /api/values Java 백 엔드 서비스를 추가한 경우 사용합니다getMessage. 기본적으로 여기에 지정된 URL 경로는 백 엔드 Service Fabric 서비스로 전송되는 URL 경로입니다. 서비스에서 사용하는 것과 동일한 URL 경로(예: "/api/values")를 사용하는 경우 작업은 추가 수정 없이 작동합니다. 백 엔드 Service Fabric 서비스에서 사용하는 URL 경로와 다른 URL 경로를 여기에 지정할 수도 있습니다. 이 경우 나중에 작업 정책에서 경로 다시 쓰기를 지정해야 합니다.

Microsoft.ApiManagement/service/apis/policies

Microsoft.ApiManagement/service/api/policies 는 모든 항목을 함께 연결하는 백 엔드 정책을 만듭니다. 여기서 요청이 라우팅되는 백 엔드 Service Fabric 서비스를 구성합니다. 이 정책을 모든 API 작업에 적용할 수 있습니다. 자세한 내용은 정책 개요를 참조하세요.

Service Fabric에 대한 백 엔드 구성은 다음과 같은 요청 라우팅 컨트롤을 제공합니다.

  • 서비스 패브릭 서비스 인스턴스 이름을 지정하여 서비스 인스턴스를 선택합니다( 예 "fabric:/myapp/myservice": 하드 코드됨) 또는 HTTP 요청에서 생성됨(예: "fabric:/myapp/users/" + context.Request.MatchedParameters["name"]).
  • Service Fabric 분할 방식을 사용하여 파티션 키를 생성함으로써 파티션을 해결.
  • 상태 저장 서비스 복제본 선택
  • 서비스 위치를 다시 확인하고 요청을 다시 보내기 위한 조건을 지정할 수 있는 해결 다시 시도 조건입니다.

policyContent 는 정책의 Json 이스케이프된 XML 콘텐츠입니다. 이 문서에서는 요청을 이전에 배포된 .NET 또는 Java 상태 비저장 서비스로 직접 라우팅하는 백 엔드 정책을 만듭니다. set-backend-service 인바운드 정책 아래에 정책을 추가합니다. sf-service-instance-name 값을 이전에 .NET 백 엔드 서비스를 배포했거나 fabric:/ApiApplication/WebApiService Java 서비스를 배포한 경우로 fabric:/EchoServerApplication/EchoServerService 바꿉니다. 백 엔드 ID 는 백 엔드 리소스를 참조합니다. 이 경우 Microsoft.ApiManagement/service/backendsapim.json 템플릿에 정의된 리소스입니다. 백 엔드 ID 는 API Management API를 사용하여 만든 다른 백 엔드 리소스를 참조할 수도 있습니다. 이 문서에서는 백 엔드 IDservice_fabric_backend_name 매개 변수의 값으로 설정합니다.

<policies>
  <inbound>
    <base/>
    <set-backend-service
        backend-id="servicefabric"
        sf-service-instance-name="service-name"
        sf-resolve-condition="@(context.LastError?.Reason == "BackendConnectionFailure")" />
  </inbound>
  <backend>
    <base/>
  </backend>
  <outbound>
    <base/>
  </outbound>
</policies>

Service Fabric 백 엔드 정책 특성의 전체 집합은 API Management 백 엔드 설명서를 참조하세요.

매개 변수 설정 및 API Management 배포

배포에 대한 apim.parameters.json 다음 빈 매개 변수를 입력합니다.

매개 변수 가치
apimInstanceName sf-apim
apimPublisherEmail myemail@contosos.com
apimSku Developer
서비스패브릭인증서이름 (serviceFabricCertificateName) sfclustertutorialgroup320171031144217
certificatePassword q6D7nN%6ck@6
serviceFabricCertificateThumbprint C4C1E541AD512B8065280292A8BA6079C3F26F10
서비스 패브릭 인증서 <base-64로 인코딩된 문자열>
url_path /api/values
클러스터 HTTP 관리 엔드포인트 (clusterHttpManagementEndpoint) https://mysfcluster.southcentralus.cloudapp.azure.com:19080
인바운드 정책 <XML 문자열>

certificatePasswordserviceFabricCertificateThumbprint 는 클러스터를 설정하는 데 사용되는 클러스터 인증서와 일치해야 합니다.

serviceFabricCertificate 는 다음 스크립트를 사용하여 생성할 수 있는 base-64로 인코딩된 문자열로 인증서입니다.

$bytes = [System.IO.File]::ReadAllBytes("C:\mycertificates\sfclustertutorialgroup220171109113527.pfx");
$b64 = [System.Convert]::ToBase64String($bytes);
[System.Io.File]::WriteAllText("C:\mycertificates\sfclustertutorialgroup220171109113527.txt", $b64);

inbound_policysf-service-instance-name 값을 이전에 .NET 백 엔드 서비스를 배포했거나 fabric:/ApiApplication/WebApiService Java 서비스를 배포한 경우로 fabric:/EchoServerApplication/EchoServerService 바꿉니다. 백 엔드 ID 는 백 엔드 리소스를 참조합니다. 이 경우 Microsoft.ApiManagement/service/backendsapim.json 템플릿에 정의된 리소스입니다. 백 엔드 ID 는 API Management API를 사용하여 만든 다른 백 엔드 리소스를 참조할 수도 있습니다. 이 문서에서는 백 엔드 IDservice_fabric_backend_name 매개 변수의 값으로 설정합니다.

<policies>
  <inbound>
    <base/>
    <set-backend-service
        backend-id="servicefabric"
        sf-service-instance-name="service-name"
        sf-resolve-condition="@(context.LastError?.Reason == "BackendConnectionFailure")" />
  </inbound>
  <backend>
    <base/>
  </backend>
  <outbound>
    <base/>
  </outbound>
</policies>

다음 스크립트를 사용하여 API Management에 대한 Resource Manager 템플릿 및 매개 변수 파일을 배포합니다.

$groupname = "sfclustertutorialgroup"
$clusterloc="southcentralus"
$templatepath="C:\clustertemplates"

New-AzResourceGroupDeployment -ResourceGroupName $groupname -TemplateFile "$templatepath\network-apim.json" -TemplateParameterFile "$templatepath\network-apim.parameters.json" -Verbose

New-AzResourceGroupDeployment -ResourceGroupName $groupname -TemplateFile "$templatepath\apim.json" -TemplateParameterFile "$templatepath\apim.parameters.json" -Verbose
ResourceGroupName="sfclustertutorialgroup"
az deployment group create --name ApiMgmtNetworkDeployment --resource-group $ResourceGroupName --template-file network-apim.json --parameters @network-apim.parameters.json

az deployment group create --name ApiMgmtDeployment --resource-group $ResourceGroupName --template-file apim.json --parameters @apim.parameters.json

테스트하세요

이제 Azure Portal에서 직접 API Management를 통해 Service Fabric의 백 엔드 서비스로 요청을 보낼 수 있습니다.

  1. API Management 서비스에서 API를 선택합니다.

  2. 이전 단계에서 만든 Service Fabric 앱 API에서 테스트 탭을 선택한 다음 작업을 선택합니다.

  3. 보내기 단추를 클릭하여 백 엔드 서비스에 테스트 요청을 보냅니다. 다음과 유사한 HTTP 응답이 표시됩니다.

    HTTP/1.1 200 OK
    
    Transfer-Encoding: chunked
    
    Content-Type: application/json; charset=utf-8
    
    Vary: Origin
    
    Ocp-Apim-Trace-Location: https://apimgmtstodhwklpry2xgkdj.blob.core.windows.net/apiinspectorcontainer/PWSQOq_FCDjGcaI1rdMn8w2-2?sv=2015-07-08&sr=b&sig=MhQhzk%2FEKzE5odlLXRjyVsgzltWGF8OkNzAKaf0B1P0%3D&se=2018-01-28T01%3A04%3A44Z&sp=r&traceId=9f8f1892121e445ea1ae4d2bc8449ce4
    
    Date: Sat, 27 Jan 2018 01:04:44 GMT
    
    
    ["value1", "value2"]
    

자원을 정리하세요

클러스터는 클러스터 리소스 자체 외에도 다른 Azure 리소스로 구성됩니다. 클러스터 및 클러스터에서 사용하는 모든 리소스를 삭제하는 가장 간단한 방법은 리소스 그룹을 삭제하는 것입니다.

Azure에 로그인하고 클러스터를 제거할 구독 ID를 선택합니다. Azure Portal에 로그인하여 구독 ID를 찾을 수 있습니다. Remove-AzResourceGroup cmdlet을 사용하여 리소스 그룹 및 모든 클러스터 리소스를 삭제합니다.

$ResourceGroupName = "sfclustertutorialgroup"
Remove-AzResourceGroup -Name $ResourceGroupName -Force
ResourceGroupName="sfclustertutorialgroup"
az group delete --name $ResourceGroupName

다음 단계

API Management 사용에 대해 자세히 알아봅니다.

Azure Portal을 사용하여 API Management용 Service Fabric 백 엔드를 만들고 관리할 수도 있습니다.