마짱짱의 지식창고
[GCP] NAT를 이용하여 Apigee Backend Service 본문
목표
Apigee Instance에서 BackendService로의 요청에 대해 NAT IP주소를 사용설정하여 허용 목록에 추가할 수 있는 예측 가능한 IP주소를 만듬
- Apigee API 문서에서 Apigee API 호출
- Apigee 런타임에서 오는 Apigee 요청에 대한 NAT IP 주소 생성 및 활성화
- 백엔드 서버에 대한 요청이 구성된 NAT IP 주소를 사용하는지 확인
작업 1 . Apigee API 문서 살펴보기
https://developers.google.com/explorer-help
https://cloud.google.com/apigee/docs/reference/apis/apigee/rest
Google API Explorer을 이용하여 Apigee API 문서 탐색
샘플 테스트로 orgainzation.instances의 list 호출
parent에 oraganizations/{org} 입력 후 Excute
우측상단 네모표시를 눌러 '확장' 해서 본다면 cURL, HTTP, JS 등 명령어를 생성해준다.
작업 3. API 프록시 생성 및 배포
테스트를 위한 API Proxy를 생성한다.
Develo - API Proxies 를 이동하여 'eval'환경을 선택후 Create New 클릭
일반적으로 많이 사용하는 'Reverse Proxy 선택'
( Use OpenAPI Spec 클릭 X)
'test-nat' 를 위한 정보 입력 후 Next
해당 방식은 httpbin의 요청 및 응답 서비스에 대한 API Proxy를 만든다.
요청이 Proxy Server를 통해 이동하면 각 서버의 IP 주소가 X-forwarded-For Header 에 추가되어 httpbin.org/{ip endpoint}는 X-Forwarded-For Header 의 IP주소와 httpbin.org 서버에 연결한 최종 IP주소를 반
Policiese 부분은 Default로 Next 하고 Create
'Edit Proxy' 클릭
Classic 으로 전환
Eval 환경 version 1 배포 후 완료
작업 4. API 프록시 테스트
test vm ssh 연결
export VM_NAME=apigeex-test-vm
export VM_ZONE=us-west1-b
gcloud compute ssh ${VM_NAME} --zone=${VM_ZONE} --force-key-file-overwrite
test vm 에서 필요한 변수 선언
export PROJECT_NAME=$(gcloud config get-value project)
export ORG=${PROJECT_NAME}
export INSTANCE_NAME=eval-instance
export INTERNAL_LB_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 EVAL_ENVGROUP_HOSTNAME=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${ORG}/envgroups/eval-group" | jq ".hostnames[0]" --raw-output)
echo "INTERNAL_LB_IP=${INTERNAL_LB_IP}"
echo "EVAL_ENVGROUP_HOSTNAME=${EVAL_ENVGROUP_HOSTNAME}"
EVAL_ENVGROUP_HOSTNAME 에는 eval-group 환경 그룹과 연결된 호스트 이름이 포함되어 있습니다 . 이 호스트 이름에 대한 DNS 항목이 자동으로 생성되었습니다. 내부 로드 밸런서에 대한 사설 IP 주소를 지정합니다.
참고: DNS 항목은 개인 DNS 영역과 개인 IP 주소를 사용합니다. 비공개 DNS 항목은 apigeex-vpc 네트워크 외부에서 확인되지 않으며 비공개 IP 주소는 Cloud Shell 또는 apigeex-vpc 네트워크 외부의 IP 주소에서 액세스할 수 없습니다.
'test-nat' api proxy 호출 테스트
curl -k "https://${EVAL_ENVGROUP_HOSTNAME}/test-nat"
### Result
{
"origin": "10.0.0.2,10.0.0.4,10.21.188.86, 34.145.50.7"
}
원본 필드 응답에는 여러 IP 주소가 표시됩니다. 마지막 IP 주소는 httpbin.org 서버라고 하는 최종 서버의 주소입니다. 여기에 표시된 처음 3개의 IP 주소는 모두 내부 IP 주소이며 요청이 인스턴스에서 httpbin.org로 가져온 다른 홉을 문서화합니다.
통화를 여러 번 반복하면 매번 동일한 최종 IP 주소가 표시될 수 있습니다. 그러나 인스턴스에 NAT 주소를 추가하지 않으면 시간이 지남에 따라 최종 IP 주소가 변경되어 허용 목록에 추가하기 어려울 수 있습니다.
작업 5. 인스턴스에 대한 NAT IP 생성
Apigee API Docs 이동
https://cloud.google.com/apigee/docs/reference/apis/apigee/rest
organizations.instances.natAddresses.create 이동
NAT 주소를 생성합니다. 예약됨 상태에서 주소가 생성되고 고정 외부 IP 주소가 프로비저닝됩니다. 현재 인스턴스는 인터넷 이그레스 트래픽에 이 IP 주소를 사용하지 않습니다. 필요한 방화벽 IP 화이트리스트가 완료되면 주소를 활성화하여 사용할 수 있습니다.
parent에는 Instance 설정 (organizations/{org}/instances/{instance})
Rquest body 에는 NAT IP 리소스 이름 설정 ("name": "eval-instance-ip")
작업 6. 생성한 NAT IP 활성화
Apigee API Docs 이동
https://cloud.google.com/apigee/docs/reference/apis/apigee/rest
organizations.instances.natAddress.activate 이동
organizations/{org}/instances/eval-instance/natAddresses/eval-instance-ip
organizations/{org}/instances/eval-instance/natAddresses/eval-instance-ip
작업 7. NAT IP로 테스트 하기
TEST VM SSH 접속
export VM_NAME=apigeex-test-vm
export VM_ZONE=us-west1-b
gcloud compute ssh ${VM_NAME} --zone=${VM_ZONE} --force-key-file-overwrite
테스트에 필요한 변수 선언
export PROJECT_NAME=$(gcloud config get-value project)
export ORG=${PROJECT_NAME}
export INSTANCE_NAME=eval-instance
export NAT_ADDR_NAME=eval-instance-ip
export INTERNAL_LB_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 EVAL_ENVGROUP_HOSTNAME=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${ORG}/envgroups/eval-group" | jq ".hostnames[0]" --raw-output)
export NAT_IP_ADDRESS=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${ORG}/instances/${INSTANCE_NAME}/natAddresses/${NAT_ADDR_NAME}" | jq ".ipAddress" --raw-output)
echo "INTERNAL_LB_IP=${INTERNAL_LB_IP}"
echo "EVAL_ENVGROUP_HOSTNAME=${EVAL_ENVGROUP_HOSTNAME}"
echo "NAT_IP_ADDRESS=${NAT_IP_ADDRESS}"
test NAT IP : 35.233.211.121
NAT_IP_ADDRESS 는 이제 백엔드 서비스를 호출할 때 런타임 인스턴스에서 사용하는 NAT 공용 IP 주소입니다 . 백엔드 서비스는 이 알려진 IP 주소를 허용 목록에 추가할 수 있습니다.
참고: DNS 항목은 개인 DNS 영역과 개인 IP 주소를 사용합니다. 비공개 DNS 항목은 apigeex-vpc 네트워크 외부에서 확인되지 않으며 비공개 IP 주소는 Cloud Shell 또는 apigeex-vpc 네트워크 외부의 IP 주소에서 액세스할 수 없습니다.
NAT-IP 확인
curl -k "https://${EVAL_ENVGROUP_HOSTNAME}/test-nat"
## Result
{
"origin": "10.0.0.2,10.0.0.4,10.21.188.88, 35.233.211.121"
}
CLI 에서 Apigee API 를 이용하여 NAT IP 검색
curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${ORG}/instances/${INSTANCE_NAME}/natAddresses/${NAT_ADDR_NAME}"
### Result
{
"name": "eval-instance-ip",
"ipAddress": "35.233.211.121",
"state": "ACTIVE"
}
출처
GCP SkillBoost - Using NAT for Apigee X Backend Services
https://partner.cloudskillsboost.google/focuses/20284?parent=catalog
'Cloud > GCP' 카테고리의 다른 글
[GCP] Binary Authorization을 이용하여 신뢰한 이미지만 GKE 배포 (0) | 2023.01.30 |
---|---|
[GCP] Apigee, Cloud Armor 이용하여 API 보호 (0) | 2023.01.17 |
[GCP] Apigee X Environment 및 Group 추가 설정 (0) | 2023.01.17 |
[GCP] Apigee X 기본개념 및 환경구성 (0) | 2023.01.17 |
Cloud Code, Cloud Build, Google Cloud Deploy, GKE를 사용한 앱 개발 및 제공 (0) | 2022.07.04 |