Southbound 네트워킹 패턴

Apigee X 문서입니다.
Apigee Edge 문서 보기

이 문서에서는 Private Service Connect(PSC)를 사용하여 Apigee 조직과 피어링된 네트워크 이외의 VPC 네트워크에서 실행 중인 백엔드 대상 서비스에 Apigee를 연결하는 방법을 설명합니다. Apigee와 백엔드 대상 간에 흐르는 API 프록시 트래픽을 'southbound' 트래픽이라고 합니다.

개요

Apigee X 프로비저닝의 경우 VPC 피어링을 사용하여 Virtual Private Cloud(VPC) 네트워크를 Apigee VPC 네트워크와 연결합니다. 이 구성을 사용하면 두 VPC 네트워크 간의 양방향 통신이 허용되며 Apigee API 프록시가 VPC에 배포된 대상 서비스를 호출할 수 있습니다. 자세한 내용은 Apigee 아키텍처 개요를 참조하세요.

예를 들어 Apigee 조직을 만들 때 Apigee가 피어링할 VPC에 네트워크 이름을 제공합니다.

curl -H "$AUTH" -X POST \
  -H "Content-Type:application/json" \
  "https://apigee.googleapis.com/v1/organizations?parent=projects/$PROJECT_ID"  \
  -d '{
    "name":"'"$PROJECT_ID"'",
    "analyticsRegion":"'"$ANALYTICS_REGION"'",
    "runtimeType":"CLOUD",
    "authorizedNetwork":"NETWORK_NAME",
    "runtimeDatabaseEncryptionKeyName":"DATABASE_KEY_NAME"
  }'

대상 애플리케이션은 피어링된 네트워크에 있는 경우 Apigee는 해당 IP 주소에 액세스하고 API 프록시 트래픽을 IP 주소로 라우팅할 수 있습니다.

많은 기업에서는 애플리케이션과 서비스가 배포되는 여러 네트워크를 가집니다. 하지만 Apigee는 하나의 네트워크와만 피어링을 지원합니다. PSC를 사용하면 피어링된 네트워크 외에도 VPC 네트워크에서 실행되는 대상 서비스에 Apigee를 비공개로 연결할 수 있습니다.

Apigee를 백엔드 대상에 비공개로 연결

Apigee를 백엔드 대상에 비공개로 연결하려면 다음 두 가지 항목을 만들어야 합니다. 즉, 대상이 배포되는 VPC 네트워크의 서비스 연결 및 Apigee VPC의 엔드포인트 연결입니다. 이 두 항목을 통해 Apigee는 대상 서비스에 연결할 수 있습니다.

이 구성은 그림 1에 설명되어 있습니다.

그림 1: 비공개 서비스 연결

제한사항

  • 전역 액세스는 지원되지 않습니다. 즉, 서비스 연결과 엔드포인트 연결이 같은 리전에 있어야 합니다. 예를 들어 Apigee 인스턴스가 us-west1 리전에 있으면 us-east2 또는 다른 리전에 있는 인스턴스에 연결할 수 없습니다.
  • Apigee 조직에서는 지정된 서비스 연결에 1개의 엔드포인트 연결이 허용됩니다. 예를 들어 대상 서비스를 노출하는 10개의 서비스 연결 파일이 있다고 가정합니다. Apigee 조직에는 서비스 연결마다 하나씩, 총 10개의 엔드포인트 연결을 만들 수 있습니다.

예시: Apigee에 대상 서비스 노출

이 예시에서는 PSC를 사용하여 Apigee가 Apigee와 직접 피어링되지 않은 VPC 네트워크에서 실행되는 대상 서비스와 통신할 수 있도록 하는 방법을 보여줍니다. 이 예시의 단계에서는 gcloud 및 Apigee API 호출을 사용하여 대상이 배포된 VPC 네트워크에 서비스 연결을 그리고 Apigee VPC에 엔드포인트 연결을 설정하고 구성합니다.

예시 시나리오

이 예시에서는 VPC에서 실행되는 Google Kubernetes Engine(GKE) 클러스터에 마이크로서비스가 배포된 경우를 고려합니다. 이 컨텍스트에서 Apigee와 통신할 수 있도록 서비스는 인그레스 게이트웨이를 통해 노출됩니다.

부하 분산기 설정

노출하려는 마이크로서비스가 있는 VPC에 부하 분산기를 설정합니다.

  1. 다음 환경 변수를 만듭니다.
    export PROJECT_ID=YOUR_PROJECT_ID
    export IMAGE_PROJECT=debian-cloud
    export IMAGE_FAMILY=debian-10
    export BACKEND=foo
    export REGION=us-west1
    export ZONE=us-west1-a
    export NETWORK=default
    export SUBNET_NAME=default
  2. 인스턴스 템플릿을 만듭니다.
    gcloud compute instance-templates create "$BACKEND" \
      --tags=psc-demo,http-server,https-server \
      --image-family "$IMAGE_FAMILY" --image-project "$IMAGE_PROJECT" \
      --network "$NETWORK" --subnet "$SUBNET_NAME" --region "$REGION" \
      --project "$PROJECT_ID" \
      --metadata startup-script="#! /bin/bash"
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>foo[/]: '\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html
    sudo mkdir /var/www/html/foo
    echo '<!doctype html><html><body><h1>foo[/foo]: '\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/foo/index.html"
  3. 관리형 인스턴스 그룹을 만듭니다.
    gcloud compute instance-groups managed create $BACKEND \
        --project $PROJECT_ID --base-instance-name $BACKEND \
        --size 1 --template $BACKEND --region $REGION
  4. 상태 점검을 만듭니다.
    gcloud compute instance-groups managed set-named-ports $BACKEND \
        --project $PROJECT_ID --region $REGION --named-ports http:80
    gcloud compute health-checks create tcp hc-tcp-$BACKEND \
      --region=$REGION \
      --description="health check for psc backend" \
      --port-name=http --project=$PROJECT_ID
  5. 부하 분산기를 만듭니다.
    1. 백엔드 서비스를 만듭니다.
      gcloud compute backend-services create be-ilb \
          --load-balancing-scheme=internal \
          --protocol=tcp \
          --region=$REGION \
          --network=$NETWORK \
          --health-checks=hc-tcp-$BACKEND \
          --health-checks-region=$REGION \
          --project=$PROJECT_ID
    2. 백엔드 서비스에 관리형 인스턴스 그룹을 추가합니다.
      gcloud compute backend-services add-backend be-ilb \
          --region=$REGION \
          --instance-group=$BACKEND \
          --instance-group-zone=$ZONE \
          --project=$PROJECT_ID
      
    3. 전달 규칙을 만듭니다.
      gcloud compute forwarding-rules create fr-ilb \
          --region=$REGION \
          --load-balancing-scheme=internal \
          --network=$NETWORK \
          --subnet=$SUBNET_NAME \
          --ip-protocol=TCP \
          --ports=80 \
          --backend-service=be-ilb \
          --backend-service-region=$REGION \
          --project=$PROJECT_ID

서비스 연결 만들기

대상 서비스가 배포된 VPC 네트워크에 PSC 서비스 연결을 만듭니다.

  1. 이 태스크를 수행하려면 compute.subnetworks.create 권한이나 Compute 네트워크 관리자 IAM 역할(roles/compute.networkAdmin)이 있어야 합니다.
  2. purpose 매개변수를 PRIVATE_SERVICE_CONNECT로 설정하여 PSC 서브넷을 만듭니다.
    gcloud compute networks subnets create PSC_SUBNET_NAME \
      --network NETWORK --region=REGION --purpose=PRIVATE_SERVICE_CONNECT --range=RANGE
    gcloud compute --project=$PROJECT_ID firewall-rules create allow-psc-nat-80 \
      --direction=INGRESS --priority=1000 --network NETWORK --action=ALLOW --rules=tcp:80
      --source-ranges=RANGE --target-tags=psc-demo

    명령어 매개변수에 대한 상세 설명은 Google Cloud CLI 참조를 확인하세요. Console 또는 API를 사용하여 이 단계를 수행할 수도 있습니다.

    예를 들면 다음과 같습니다.

    gcloud compute networks subnets create psc-subnet --network default \
    --region=us-west1 --purpose=PRIVATE_SERVICE_CONNECT --range=10.100.0.0/28
  3. VPC 네트워크에 서비스 연결을 만듭니다.
    1. 내부 부하 분산기전달 규칙을 가져옵니다. 나중에 이 규칙을 사용합니다.
      gcloud compute forwarding-rules list --project=PROJECT_ID

      여기서 PROJECT_ID는 Google Cloud 프로젝트 ID입니다. 예를 들면 다음과 같습니다.

      gcloud compute forwarding-rules list --project=my-project
      NAME                                                  REGION    IP_ADDRESS    IP_PROTOCOL  TARGET
      k8s2-tcp-e61tta3j-apps-istio-ingressgateway-0kl92frk  us-west1  10.138.0.53   TCP
      
    2. 서비스 연결을 만드세요.
      gcloud compute service-attachments create PSC_NAME \
          --region=REGION --producer-forwarding-rule=PRODUCER_FORWARDING_RULE \
          --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=PSC_SUBNET_NAME --project=PROJECT_ID

      NAME 매개변수는 소문자, 숫자, 하이픈으로만 구성된 1~63자(영문 기준) 문자열이어야 합니다. 선행 숫자와 하이픈을 사용할 수 없습니다. 또한 후행 하이픈을 사용할 수 없습니다. 이 명령어의 매개변수에 대한 자세한 설명은 Google Cloud CLI 참조를 확인하세요.

      예를 들면 다음과 같습니다.

      gcloud compute service-attachments create gkebackend \
          --region=us-west1 --producer-forwarding-rule=k8s2-tcp-e62tta1j-apps-istio-ingressgateway-0kl92frk \
          --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-subnet --project=my-project

      Console UI에서 이 단계를 수행할 수도 있습니다. 예를 들어 자동 프로젝트 승인을 사용한 서비스 게시를 참조하세요.

엔드포인트 연결 만들기

Apigee 조직에서 엔드포인트 연결을 만듭니다. 명령줄이나 Apigee 엔드포인트 연결 UI에서 이 단계를 수행할 수 있습니다.

기본 요건: 엔드포인트 연결을 만들기 전에 앞선 예시에서 설명한 대로 먼저 부하 분산기와 서비스 연결을 만들어 Private Service Connect(PSC)를 사용하여 노출할 서비스를 게시해야 합니다. PSC로 서비스를 노출하는 방법에 대한 자세한 내용은 Private Service Connect를 사용하여 관리형 서비스 게시를 참조하세요. 서비스 연결에서 새 연결을 허용하도록 구성해야 합니다.

명령줄

명령줄을 통해 Apigee VPC에 엔드포인트 연결을 만듭니다.

  1. 서비스 연결 리소스를 가져옵니다.
    gcloud compute service-attachments list

    이 명령어는 서비스 연결 정보를 반환합니다. 다음 단계에서 이 정보를 사용합니다. 예를 들면 다음과 같습니다.

    NAME       REGION   TARGET_SERVICE                                       CONNECTION_PREFERENCE
    gkebackend us-west1 k8s2-tcp-tgysilgj-apps-istio-ingressgateway-fzdhwstg ACCEPT_AUTOMATIC
  2. Apigee API의 인증 토큰을 가져옵니다.
    TOKEN="$(gcloud auth print-access-token)"
  3. Apigee API를 사용하여 엔드포인트 연결을 만듭니다. 요청 본문에 gcloud compute service-attachments list 명령어에서 반환된 값을 사용합니다.
    curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type:application/json" \
    "https://apigee.googleapis.com/v1/organizations/ORGANIZATION/endpointAttachments?endpointAttachmentId=NAME" \
    -d '{
        "location": "REGION",
        "serviceAttachment": "projects/PROJECT_ID/regions/REGION/serviceAttachments/NAME"
    }'

    각 항목의 의미는 다음과 같습니다.

    • REGION은 서비스 연결의 리전입니다. 예를 들면 us-west1입니다.
    • ORGANIZATION은 Apigee 조직 이름입니다.
    • PROJECT_ID는 서비스 연결이 생성된 Google Cloud 프로젝트입니다.
    • NAME은 서비스 연결의 이름입니다. 이름은 소문자와 숫자만 포함해야 합니다. 예를 들면 gkebackend입니다.

    Apigee는 장기 실행 작업을 시작합니다. 작업이 완료되면 다음과 비슷한 응답이 표시됩니다.

    {
      "name": "organizations/my-organization/operations/6e249895-e78e-48f0-a28f-7140e15e1676",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.apigee.v1.OperationMetadata",
        "operationType": "INSERT",
        "targetResourceName": "organizations/my-organization/endpointAttachments/gkebackend",
        "state": "FINISHED"
      },
      "done": true,
      "response": {
        "@type": "type.googleapis.com/google.cloud.apigee.v1.EndpointAttachment",
        "name": "organizations/my-organization/endpointAttachments/gkebackend",
        "location": "us-west1",
        "host": "7.0.3.4",
        "serviceAttachment": "projects/my-project/regions/us-west1/serviceAttachments/gkebackend"
      }
    }

    이제 다음 단계에 따라 응답에서 반환된 IP 주소 7.0.3.4를 사용하여 서비스 연결 뒤에 있는 서비스에 연결할 수 있습니다. 7.0.3.4는 Apigee에서 인그레스 게이트웨이에 할당하는 비공개로 사용된 공개 IP(PUPI)입니다. 이 주소는 인터넷에서 공지되지 않으며 Google 서비스는 내부적으로 이 범위의 IP를 사용하지 않습니다.

  4. 서비스 연결 호스트 IP를 API 프록시의 대상으로 사용하세요. 예를 들면 다음과 같습니다.
    <TargetEndpoint name="default">
        <HTTPTargetConnection>
            <URL>http://7.0.3.4/orders</URL>
        </HTTPTargetConnection>
    </TargetEndpoint>

Apigee UI

Apigee UI에서 Apigee 조직에 엔드포인트 연결을 만듭니다.

  1. Apigee UI에서 관리자 > 엔드포인트 연결로 이동합니다.
  2. + 엔드포인트 연결을 클릭합니다. 엔드포인트 연결 대화상자가 나타납니다.
  3. 엔드포인트 연결 이름을 입력합니다. 이름은 고유해야 합니다. 이름이 같은 다른 엔드포인트 연결이 있을 수 없으며 나중에 이름을 변경할 수 없습니다. 이름은 1~20자(영문 기준)여야 하며 소문자와 숫자만 사용할 수 있으며 선행 숫자를 포함해서는 안 됩니다. 예를 들어 endpoint1은 유효한 이름이지만 1endpointEndpoint1은 잘못된 이름입니다.
  4. 서비스 연결 섹션에 서비스 연결이 있는 Cloud 프로젝트의 ID를 입력합니다.
  5. 다음을 클릭합니다.
  6. 서비스 연결 드롭다운 목록에서 연결할 서비스 연결을 선택합니다.

    UI 동작은 권한에 따라 다릅니다. 리전 및 서비스 연결을 나열할 수 있는 권한이 있으면 드롭다운 목록에서 서비스 연결을 선택하기만 하면 됩니다. 리전을 나열할 수 있는 권한이 없으면 정적 리전 목록이 표시되며 이 목록에서 선택하면 됩니다. 서비스 연결을 나열할 수 있는 권한이 없으면 이름을 직접 입력해야 합니다. 서비스 연결을 찾고 이름을 지정합니다. 리전을 나열할 수 있는 권한이 없으면 자동으로 선택할 수 있는 정적 리전 목록이 표시됩니다.

    서비스 연결 구성에 필요한 Apigee 프로젝트 ID 위치

  7. 서비스 엔드포인트가 연결을 수락할 수 있는지 확인합니다. 단계는 연결 확인 및 관리를 참조하세요.
  8. 다음을 클릭합니다.
  9. 만들기를 클릭합니다. 일반적으로 이 작업이 완료되는 데 1~2분 정도 걸립니다.
  10. 현재 생성 상태를 확인하려면 목록 페이지에서 새로고침을 클릭합니다.
  11. 서비스 연결 호스트 IP를 API 프록시의 대상으로 사용하세요. 다음 스크린샷과 같이 호스트 IP는 만들기 프로세스가 완료되면 엔드포인트 연결 UI에 표시됩니다.

    엔드포인트 연결 UI에 표시된 서비스 연결의 호스트 IP

    예를 들면 다음과 같습니다.
    <TargetEndpoint name="default">
        <HTTPTargetConnection>
            <URL>http://7.0.5.2/orders</URL>
        </HTTPTargetConnection>
    </TargetEndpoint>

연결 확인 및 관리

이 섹션에서는 서비스 연결이 Apigee 프로젝트의 엔드포인트 연결에 액세스할 수 있는지 확인하는 방법과 원하는 경우 연결 기본 설정을 변경하는 방법을 설명합니다.

  1. 게시된 서비스 나열의 단계를 수행하여 프로젝트의 서비스 연결 목록을 봅니다.
  2. 게시된 서비스의 세부정보 보기의 설명대로 연결하려는 서비스 연결을 선택합니다.
  3. 게시된 서비스 연결의 연결 기본 설정을 선택합니다. Private Service Connect에서는 다음에 설명된 두 가지 옵션을 제공합니다. 현재 연결 기본 설정을 변경하려면 게시된 서비스의 연결 기본 설정 변경의 단계를 수행합니다.
    • 모든 연결 자동 수락: 서비스 연결에서 모든 프로젝트의 엔드포인트 연결을 수락합니다. 이 옵션을 선택하면 서비스 연결에서 Apigee 프로젝트의 엔드포인트 연결에서 연결을 수락할 수 있습니다. 추가 구성이 필요 없습니다.
    • 선택한 프로젝트의 연결 수락: 서비스 연결에서 연결을 수락하는 프로젝트를 지정합니다. 이 옵션을 선택하면 Apigee 프로젝트의 프로젝트 ID를 서비스 연결에 추가해야 합니다. 이 스크린샷과 같이 엔드포인트 연결 UI의 프로젝트 연결 확인 단계에서 Apigee 프로젝트 ID를 찾을 수 있습니다.

      서비스 연결 구성에 필요한 Apigee 프로젝트 ID 위치

      또한 apigeeProjectId라는 필드에 ID를 반환하는 Apigee Organizations API를 사용하여 Apigee 프로젝트 ID를 검색할 수 있습니다.

  4. 연결 기본 설정을 변경했으면 변경사항을 저장합니다.
  5. Apigee UI에서 관리자 > 엔드포인트 연결로 이동합니다. Apigee Endpoints API를 사용하여 엔드포인트 연결을 나열할 수도 있습니다.
  6. 연결 목록에서 PSC 연결 상태가 현재 ACCEPTED인지 확인합니다. 필드에 ACCEPTED 이외의 상태가 표시되면 PSC 연결 상태 문제 해결을 참조하세요.

엔드포인트 연결 관리

Apigee endpointAttachments API는 엔드포인트 연결을 create, delete, get, list하는 메서드를 제공합니다.

엔드포인트 연결 나열

Apigee Endpoint 연결 UI에서 또는 Apigee Endpoints API를 호출하여 엔드포인트 연결 목록을 확인할 수 있습니다.

Apigee UI에서 엔드포인트 연결을 나열하려면 다음 안내를 따르세요.

  1. Apigee UI에서 관리자 > 엔드포인트 연결로 이동합니다.
  2. 엔드포인트 연결 목록을 봅니다.

엔드포인트 연결 만들기

UI에서 또는 Apigee Endpoints API를 사용하여 엔드포인트 연결을 만들려면 엔드포인트 연결 만들기를 참조하세요.

엔드포인트 연결 삭제

Apigee UI를 사용하여 엔드포인트를 삭제하려면 다음 안내를 따르세요.

  1. Apigee UI에서 관리자 > 엔드포인트 연결로 이동합니다.
  2. 삭제할 엔드포인트 연결을 선택합니다.
  3. 엔드포인트 연결 삭제를 클릭합니다.

Apigee Endpoints API를 사용하여 엔드포인트 연결을 나열, 생성, 삭제할 수도 있습니다.

PSC 연결 상태 문제 해결

이 섹션에서는 엔드포인트 연결이 프로비저닝되고 상태가 활성이지만 연결 상태가 수락됨이 아닐 때의 가능한 솔루션을 설명합니다. 그림 2에는 몇 가지 가능한 연결 상태가 표시되어 있습니다.

그림 2: 엔드포인트 연결 상태 세부정보

다음 표에 설명된 대로 주어진 상태는 가능한 원인을 가리키는 데 도움이 될 수 있습니다.

연결 상태 가능한 원인 추천 솔루션
수락됨 서비스 연결이 연결 엔드포인트에서의 연결을 수락했습니다. 해당 사항 없음
대기 중 Apigee 프로젝트 ID가 소비자 허용 프로젝트 목록 또는 거부된 목록에 없을 수 있습니다. Apigee 연결 ID를 서비스 연결의 소비자 허용 목록에 추가합니다. 게시된 서비스의 연결 환경설정 변경을 참조하세요.
거부됨 Apigee 프로젝트 ID가 소비자 거부 목록에 있습니다. 소비자 거부 목록에서 Apigee 프로젝트 ID를 삭제하고 서비스 연결의 소비자 허용 목록에 추가합니다. 게시된 서비스에 대한 액세스 요청 관리를 참조하세요.
중지 이 엔드포인트 연결에 대한 서비스 연결이 정지되었거나 사용 중지되었습니다. 자세한 내용은 서비스 연결을 설명합니다. 게시된 서비스의 세부정보 보기를 참조하세요.
종료됨 이 엔드포인트 연결에 대한 서비스 연결이 삭제되었습니다. 서비스 연결 및 엔드포인트 연결을 다시 만듭니다.
주의 필요 엔드포인트 연결이 서비스 연결에서 수락되었지만 서비스 연결에 문제가 있습니다. 자세한 내용은 서비스 연결을 설명합니다. 게시된 서비스의 세부정보 보기를 참조하세요.
사용 불가 연결 상태를 사용할 수 없으며, 프로비저닝 중에 발생할 수 있습니다. 몇 분 동안 상태가 변경되는지 확인합니다.