본문 바로가기

Cloud/GCP

[GCP] Apigee X 기본개념 및 환경구성

반응형

API 관리 플랫폼

OpenAPI Spec 3.0 지원

다양한 과금정책

전체 API 트래픽 수집 및 분석

통합 모니터링 기반 메트릭 지원

Configuration & Code 모두 지원 (Java, JS, Python등 50여개 빌트인 정책 지원)

End to end Security, ACL 및 침입방지, Simple OAuth 구현

통합 개발자 포탈 지원

유연한 배포정책, 확장성

 

Apigee Architecture 개요

ApigeeX 조직에는 두개의 GCP 프로젝트가 필요

하나는 고객이 관리, 하나는 Apigee X Runtime에 대해 Google에서 관리

각 프로젝트는 자체 VPC에서 사용되며 기본적으로 통신이 불가능함 그렇기에 피어링을 맺어줘야합니다.

 

Apigeee Runtime은 API Proxy를 실행하고 Google 관리 프로젝트에서 프로비저닝이 됨

Runtime에 대한 수신 요청은 피어링된 네트워크의 Private IP 주소를 사용하요 액세스할 수 있는 내부 TCP LB로 전송

인터넷의 Client에서 Apigee Runtime으로 트래픽을 라우팅 하기위해 L7를 사용

그러나 L7 LB로만 Apigee안의 내부 IP와 통신할수 없기에 MIG가 네트워크 브리지 역할을 함

MIG의 VM은 피어링된 네트워크에서 양방향 통신을 할 수 있기에 Apigee의 런타임 내부 부하분산기의 Private IP를 호출 할 수 있다.

API 프록시 호출 수명 주기는 다음과 같다.

  1. Client는 Apigee API Proxy 호출
  2. 요청은 L7 LB 에 도착, LB는 외부IP와 TLS 인증으로 구성
  3. L7 LB 는 MIG의 VM에 요청 전달
  4. VM은 요청을 Apigee Runtime에 라우팅 되는 L4 LB의 Private IP로 전달
  5. 요청을 처리한 후 Apigee Runtime은 요청을 Backend Service로 보내고 응답은 동일한 경로로 반환

 

작업 1. Apigee X 조직 프로비저닝

apigee.google.com/setup 에서 GCP 프로젝트와 매칭

  • Apigee 조직이름과 GCP 프로젝트 이름이 일치해야함
  • GCP의 프로젝트는 Billing이 붙어 있어야함

  • GCP 프로젝트에서 필요한 API 활성화
    • Apigee API Apigee 조직을 구성하고 상호작용하는 데 사용
    • Compute Engine API Apigee 인스턴스 비공개 IP 주소에 연결하기 위한 네트워크 브리지 역할을 하는 관리형 인스턴스 그룹 (MIG) 을 만드는 데 사용
    • Service Networking API Google Cloud 프로젝트가 Google에서 관리하는 Apigee 평가 조직과 통신할 수 있도록 하는 데 사용

  • Apigee와 GCP 프로젝트간 VPC 피어링작업
    • GCP VPC의 Subnet은 /22를 보유할 수 있을만큼 충분한 큼 범위를 사용해야함 해당 예시에선 10.0.0.0/20 으로 생성, 또한 Private Google Access 허용 ( Apigee의 범위가 /22)

해당 Subnet으로 생성하면 google-managed-services-apigeex-vpc라는 피어링 IP범위가 생성됨

  • Apigee 조직만들기
    • Runtime 보다 분석 호스팅지역이 더 적음 그렇기에 Runtime 지역을 먼저 설정하고 가장 가까운 리전 선택

이때 상당 시간이 소요되니 CloudShell을 열어 Monitoring

# 현재 프로젝트 변수 등록
export GOOGLE_CLOUD_PROJECT=<project>

# Cloud SHELL에서 실행
export INSTANCE_NAME=eval-instance; export ENV_NAME=eval; export PREV_INSTANCE_STATE=; echo "waiting for runtime instance ${INSTANCE_NAME} to be active"; while : ; do export INSTANCE_STATE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}" | jq "select(.state != null) | .state" --raw-output); [[ "${INSTANCE_STATE}" == "${PREV_INSTANCE_STATE}" ]] || (echo; echo "INSTANCE_STATE=${INSTANCE_STATE}"); export PREV_INSTANCE_STATE=${INSTANCE_STATE}; [[ "${INSTANCE_STATE}" != "ACTIVE" ]] || break; echo -n "."; sleep 5; done; echo; echo "instance created, waiting for environment ${ENV_NAME} to be attached to instance"; while : ; do export ATTACHMENT_DONE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}/attachments" | jq "select(.attachments != null) | .attachments[] | select(.environment == \"${ENV_NAME}\") | .environment" --join-output); [[ "${ATTACHMENT_DONE}" != "${ENV_NAME}" ]] || break; echo -n "."; sleep 5; done; echo; echo "${ENV_NAME} environment attached"; echo "***ORG IS READY TO USE***";

# 해당 문구뜨면 사용가능
***ORG IS READY TO USE***

 

  • Rounting 설정
    • 외부 IP 설정 및 Wildcard DNS 서비스 설정 Wildcard DNS는 hOST이름에 포함된 IP주소를 기반으로 DNS항목을 자동으로 반환합니다 ex) eval-34.100.120.55.nip.io 는 34.100.120.55 로 반환

밑에 Subnet에서 위에서 설정한 apigeex-vpc(서브넷) 설정하기

이렇게 생성되면 LB에서 사용하는 apigee-ssl-cert 생성에는 몇분정도 걸릴 수 있음

 

생성 완료

 

 

작업 2. 내부 엑세스를 사용하여 Apigee 테스트

프로비저닝 후 Apigee 는 내부 IP 주소만 Apigee런타임과 통신되도록 허용한다.

클러스터 내의 VM은 Apigee 런타임을 위해 내부 부하분산기에 요청을 보낼 수 있다.

 

  • 테스트 VM 생성작업
    • 변수선
export ORG=${GOOGLE_CLOUD_PROJECT}
export PROJECT_NUMBER=$(gcloud projects describe ${GOOGLE_CLOUD_PROJECT} --format="value(projectNumber)")
export NETWORK=apigeex-vpc
export SUBNET=apigeex-vpc
export INSTANCE_NAME=eval-instance
export VM_NAME=apigeex-test-vm
export VM_ZONE=us-west1-b
export RUNTIME_IP=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${ORG}/instances/${INSTANCE_NAME}" | jq ".host" --raw-output)
echo "RUNTIME_IP=${RUNTIME_IP}"

Test VM 생성

gcloud beta compute --project=${GOOGLE_CLOUD_PROJECT} \
instances create ${VM_NAME} \
--zone=${VM_ZONE} \
--machine-type=e2-micro \
--subnet=${SUBNET} \
--service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--tags=http-server,https-server \
--image-family=debian-10 \
--image-project=debian-cloud \
--boot-disk-size=10GB \
--boot-disk-device-name=${VM_NAME} \
--metadata=startup-script="sudo apt-get update -y && sudo apt-get install -y jq"
  • zone: VM 인스턴스의 영역
  • machine-type**:** e2-micro는 비용 효율적인 공유 코어 머신 유형입니다.
  • subnet**:** apigeex-vpc 네트워크에서 만든 서브넷
  • service-account: 스턴스에 연결된 ID
  • scopes**: V**M의 서비스 계정에 제공되는 액세스 수준
  • tags: 인스턴스에 적용되는 태그 목록입니다. 기본 방화벽 규칙 및 경로를 제공하는 데 사용
  • image-family: 이미지에 사용할 이미지 계열. 제품군에서 더 이상 사용되지 않는 최신 이미지가 사용됩니다.
  • image-project: 공개 이미지 계열을 호스팅하는 Google Cloud 프로젝트
  • boot-disk-size: 생성할 VM 부팅 디스크의 크기
  • boot-disk-device-name: 생성된 부팅 디스크의 이름
  • metadata**:** 실행할 시작 스크립트를 지정합니다. 이 스크립트는 테스트에서 사용되는 jq를 설치합니다.

SSH 방화벽 Open

gcloud compute --project=${GOOGLE_CLOUD_PROJECT} \
firewall-rules create ${NETWORK}-allow-ssh \
--direction=INGRESS \
--priority=65534 \
--network=${NETWORK} \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=0.0.0.0/0

 

vm 연결

gcloud compute ssh ${VM_NAME} --zone=${VM_ZONE} --force-key-file-overwrite

 

VM내에서 변수 선언

export PROJECT_NAME=$(gcloud config get-value project)
export ORG=${PROJECT_NAME}
export INSTANCE_NAME=eval-instance
export INSTANCE_IP=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${ORG}/instances/${INSTANCE_NAME}" | jq ".host" --raw-output)
export ENV_GROUP_HOSTNAME=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${ORG}/envgroups" | jq ".environmentGroups[0].hostnames[0]" --raw-output)
echo "INSTANCE_IP=${INSTANCE_IP}"
echo "ENV_GROUP_HOSTNAME=${ENV_GROUP_HOSTNAME}"

 

내부 IP를 이용하여 배포된 ‘Hello-world’ 호출하기

curl -i -k --resolve "${ENV_GROUP_HOSTNAME}:443:${INSTANCE_IP}" \
"https://${ENV_GROUP_HOSTNAME}/hello-world"

#### Result
student_00_6f969f849a4e@apigeex-test-vm:~$ curl -i -k --resolve "${ENV_GROUP_HOSTNAME}:443:${INSTANCE_IP}" \
> "https://${ENV_GROUP_HOSTNAME}/hello-world"
HTTP/2 200
x-powered-by: Apigee
access-control-allow-origin: *
x-frame-options: ALLOW-FROM RESOURCE-URL
x-xss-protection: 1
x-content-type-options: nosniff
content-type: text/plain; charset=utf-8
content-length: 13
etag: W/"d-CD90h6x0eIVqiTkn8InWaeagV3Q"
date: Mon, 16 Jan 2023 07:22:59 GMT
via: 1.1 google
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
x-request-id: f8cc3e88-a3bb-48ff-ad97-94b64545faa4

 

작업3. 외부에서 Apigee 호출 테스트

생성된 L7 LB

 

L7 IP를 이용하여 Apigee ‘hello-world’ 호출

export PROJECT_NAME=$(gcloud config get-value project)
export SSL_HOSTNAME=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://compute.googleapis.com/compute/v1/projects/${PROJECT_NAME}/global/sslCertificates/apigee-ssl-cert" | jq ".managed.domains[0]" --raw-output)
echo "SSL_HOSTNAME=${SSL_HOSTNAME}"
curl "https://${SSL_HOSTNAME}/hello-world"

### Result
Your active configuration is: [cloudshell-9656]
SSL_HOSTNAME=34.111.160.80.nip.io
Hello, Guest!

 

 

출처

GCP SkillBoost - Provisioning an Apigee X Evaluation Organization

https://partner.cloudskillsboost.google/focuses/20282?parent=catalog 

 

반응형