다중 환경 배포를 위한 네트워크 에지 서비스

Google은 온프레미스 데이터 센터 또는 다른 퍼블릭 클라우드 등 Google Cloud 외부(온프레미스 및 멀티 클라우드 서비스)에 있는 서비스의 기능 및 보안을 보강할 수 있는 다양한 네트워크 에지 서비스를 제공합니다. 이러한 네트워크 에지 서비스를 사용하면 다음을 수행할 수 있습니다.

  • 외부 고객 트래픽을 수락하고 단일 Anycast VIP를 사용해 전 세계로 라우팅
  • 외부 HTTP(S) 부하 분산기Google 관리 SSL 인증서를 사용하여 에지에서 TLS 트래픽을 종료하여 서버 부하를 줄입니다.
  • WAF(사전 구성된 웹 애플리케이션 방화벽) 규칙을 사용 설정하고 Google Cloud Armor를 사용하여 들어오는 트래픽에 허용 및 거부 목록을 적용합니다.
  • IAP(Identity-Aware Proxy)를 사용하여 애플리케이션 및 리소스에 대한 사용자 액세스 제어
  • Cloud CDN을 사용하여 콘텐츠 전송 및 최종 사용자 지연 시간 최적화
네트워크 에지 서비스 예시(확대하려면 클릭)
네트워크 에지 서비스 예시(확대하려면 클릭)

비공개, 온프레미스 또는 멀티 클라우드 서비스에 이러한 이점을 제공하려면 외부 HTTP(S) 부하 분산기를 배포하여 공개 인터넷에서 트래픽을 수신합니다. HTTP(S) 부하 분산기는 Cloud VPN 또는 Cloud Interconnect를 사용하여 온프레미스 환경 또는 Google Cloud 외 클라우드로 트래픽을 라우팅하는 Traffic Director 구성 중간 프록시로 트래픽을 전달합니다.

이 가이드에서는 Google 에지에서 Google Cloud Armor를 사용하여 클라이언트가 온프레미스 서비스에 비공개로 액세스하도록 선택적으로 허용하는 엔드 투 엔드 예시를 살펴봅니다. 클라이언트는 IP 주소를 기반으로 액세스가 허용됩니다.

다음 작업을 완료합니다.

  1. 관리형 인스턴스 그룹에서 Envoy를 중간 프록시로 배포. 이 Envoy 프록시는 Traffic Director에 자동으로 연결됩니다.
  2. 시뮬레이션된 비공개 온프레미스 VM 만들기. 실제 예시에는 온프레미스 VM이 이미 있을 것입니다.
  3. 중간 프록시에 도달하는 모든 요청을 시뮬레이션된 온프레미스 VM으로 라우팅하도록 Traffic Director 구성.
  4. 공개 인터넷에서 트래픽을 수신하고 중간 프록시로 전달하는 외부 HTTP(S) 부하 분산기 생성.
  5. 외부 HTTP(S) 부하 분산기에 Google Cloud Armor 보안 정책 연결

이 작업을 완료한 후에는 선택적으로 추가적인 에지 서비스 및 고급 트래픽 관리 기능을 살펴볼 수 있습니다.

기본 요건

중간 프록시를 설정하기 전에 다음 작업을 완료하세요.

  • Traffic Director 설정 준비를 검토하고 모든 기본 요건 작업을 완료합니다.
  • Cloud VPN 또는 Cloud Interconnect를 통해 Google Cloud VPC 네트워크 내에서 비공개 온프레미스 엔드포인트에 연결할 수 있는지 확인합니다. 이 솔루션 가이드에 사용된 예시에서는 트래픽을 Google Cloud 내의 엔드포인트로 라우팅하므로 하이브리드 연결을 구성할 필요가 없습니다. 실제 배포 시나리오에서는 필수입니다.
  • VPC 서브넷 CIDR 범위가 원격 CIDR 범위와 충돌하지 않는지 확인하세요. 서브넷 경로는 IP 주소가 겹칠 때 원격 연결보다 우선 적용됩니다.
  • 이 데모에서는 Google Cloud Armor 보안 정책을 만들고 업데이트하는 데 필요한 권한을 얻습니다. Cloud CDN과 같은 다른 서비스를 사용하려는 경우 권한이 다를 수 있습니다.

Compute Engine VM에 중간 프록시 배포

이 섹션에서는 외부 부하 분산기에서 트래픽을 수신하고 원격 대상으로 전달하는 Compute Engine의 중간 프록시로 Envoy를 배포하는 방법을 설명합니다.

중간 프록시용 인스턴스 템플릿 만들기

인스턴스 템플릿은 관리형 인스턴스 그룹 내 VM의 구성을 지정합니다. 다음 템플릿은 Envoy 프록시가 Traffic Director에 연결된 VM 인스턴스를 만드는 데 사용할 수 있습니다.

 gcloud compute instance-templates create td-middle-proxy \
    --service-proxy=enabled \
    --tags=allow-hc

네트워크 이름 지정, 로그 경로 설정, 추적 사용 설정 등을 통해 Envoy 배포를 맞춤설정하려면 자동 Envoy 배포 옵션 가이드를 참조하세요.

중간 프록시용 관리형 인스턴스 그룹 만들기

위의 템플릿을 기반으로 관리형 인스턴스 그룹을 만듭니다. 이 예시에서는 인스턴스 그룹 크기를 1로 유지하여 단일 인스턴스를 배포할 수 있습니다. 프로덕션 사용량의 경우 중간 프록시가 처리해야 하는 트래픽이 많다면 병목 현상이 발생하지 않도록 CPU 사용률 등을 기준으로 자동 확장을 사용 설정하세요.

gcloud compute instance-groups managed create td-middle-proxy-us-central1-a \
    --zone us-central1-a \
    --template=td-middle-proxy \
    --size=1

이 예시에서는 us-central1-a에 Envoy를 실행하는 VM 인스턴스가 포함된 관리형 인스턴스 그룹을 만듭니다. 이 가이드의 뒷부분에서는 클라이언트의 공개 인터넷 트래픽을 처리하는 외부 부하 분산기를 만듭니다. 외부 부하 분산기는 클라이언트와 가장 가까운 리전 및 해당 리전 내의 관리형 인스턴스 그룹으로 트래픽을 자동으로 라우팅할 수 있으므로 관리형 인스턴스 그룹을 여러 개 만드는 것이 좋습니다. Google Cloud에서 사용할 수 있는 리전 및 영역의 전체 목록은 여기에서 확인할 수 있습니다.

시뮬레이션된 온프레미스 서비스 배포

이 섹션에서는 하이브리드 연결 네트워크 엔드포인트 그룹(NEG)을 배포하는 방법을 설명합니다. 프로덕션 배포에서 이 NEG에는 온프레미스 서버로 확인되는 엔드포인트(IP:port)가 포함됩니다. 이 예시에서는 IP:port에서 연결할 수 있는 Compute Engine VM을 만듭니다. 이 VM은 시뮬레이션된 온프레미스 서버 역할을 합니다.

시뮬레이션된 온프레미스 VM 만들기

단일 VM 인스턴스를 배포하여 비공개 온프레미스 서버를 시뮬레이션합니다.

gcloud compute instances create on-prem-vm \
  --zone us-central1-a \
  --metadata startup-script='#! /bin/bash
## Installs apache and a custom homepage
sudo su -
apt-get update
apt-get install -y apache2
cat <<EOF > /var/www/html/index.html
<html><body><h1>Hello world from on-premises!</h1></body></html>
EOF'

이후 구성 및 확인을 위해 내부 IP 주소를 식별하고 저장합니다. 이 VM의 서버는 포트 80에서 인바운드 요청을 리슨합니다.

ON_PREM_IP=`gcloud compute instances describe on-prem-vm --zone=us-central1-a --format="value(networkInterfaces.networkIP)" | sed "s/['\[\]]*//g"`

네트워크 엔드포인트 그룹 만들기

non-gcp-private-ip-port 네트워크 엔드포인트 유형을 지정하여 이 데모 설정의 네트워크 엔드포인트 그룹(NEG)을 만듭니다. 시뮬레이션된 온프레미스 VM의 IP 주소와 포트를 이 NEG의 엔드포인트로 추가합니다. 이전 단계에 이어서 IP 주소가 ON_PREM_IP 환경 변수에 저장됩니다.

먼저 NEG를 만듭니다.

gcloud compute network-endpoint-groups create td-on-prem-neg \
    --network-endpoint-type non-gcp-private-ip-port \
    --zone us-central1-a

그런 다음 새로 만든 NEG에 IP:포트를 추가합니다.

gcloud compute network-endpoint-groups update td-on-prem-neg \
  --zone=us-central1-a \
  --add-endpoint="ip=$ON_PREM_IP,port=80"

Google Cloud 부하 분산 구성요소로 Traffic Director 구성

이 섹션에서는 Traffic Director를 구성하고 중간 프록시가 비공개 온프레미스 서비스로 트래픽을 전달하도록 하는 방법을 보여줍니다. 다음 구성요소를 구성합니다.

  • 상태 확인. 이 상태 확인은 아래에 설명된 다른 NEG 유형에 구성된 상태 확인과 약간 다르게 작동합니다.
  • 백엔드 서비스. 백엔드 서비스에 대한 자세한 내용은 백엔드 서비스 개요를 참조하세요.
  • 라우팅 규칙 맵. 여기에는 전달 규칙, 대상 프록시, URL 맵 만들기가 포함됩니다. 자세한 내용은 전달 규칙 사용URL 맵 사용을 참조하세요.

상태 확인 만들기

상태 확인은 엔드포인트가 정상이고 요청을 수신할 수 있는지 확인합니다. 이 유형의 NEG 상태 확인은 Envoy의 분산형 상태 확인 메커니즘을 사용하는 반면 다른 NEG 유형은 Google Cloud의 중앙 집중식 상태 확인 시스템을 사용합니다.

gcloud compute health-checks create http td-on-prem-health-check

백엔드 서비스 만들기

Traffic Director와 함께 사용할 INTERNAL_SELF_MANAGED 부하 분산 스키마를 사용하여 백엔드 서비스를 만듭니다. 이 백엔드 서비스를 만들 때 방금 만든 상태 확인을 지정합니다.

gcloud compute backend-services create td-on-prem-backend-service \
    --global \
    --load-balancing-scheme=INTERNAL_SELF_MANAGED \
    --health-checks=td-on-prem-health-check

다음으로 앞서 만든 NEG를 이 백엔드 서비스의 백엔드로 추가합니다.

gcloud compute backend-services add-backend td-on-prem-backend-service \
    --global \
    --network-endpoint-group=td-on-prem-neg \
    --network-endpoint-group-zone=us-central1-a \
    --balancing-mode=RATE \
    --max-rate-per-endpoint=5

라우팅 규칙 맵 만들기

라우팅 규칙 맵은 Traffic Director가 트래픽을 백엔드 서비스로 라우팅하는 방법을 정의합니다.

  1. 위에 정의된 백엔드 서비스를 사용하는 URL 맵을 만듭니다.

    gcloud compute url-maps create td-hybrid-url-map \
      --default-service td-on-prem-backend-service
    
  2. 다음 콘텐츠로 target_proxy.yaml이라는 파일을 만듭니다.

    name: td-hybrid-proxy
    proxyBind: true
    urlMap: global/urlMaps/td-hybrid-url-map
    
  3. import 명령어를 사용하여 대상 HTTP 프록시를 만듭니다. 자세한 내용은 Traffic Director의 대상 프록시를 참조하세요.

    gcloud compute target-http-proxies import td-hybrid-proxy \
       --source target_proxy.yaml
    
  4. 이 대상 HTTP 프록시를 참조하는 전달 규칙을 만듭니다. 전달 규칙의 IP 주소를 0.0.0.0으로 설정합니다. 규칙의 주소를 0.0.0.0으로 설정하면 URL 맵에 구성된 인바운드 포트, HTTP 호스트 이름, 경로 정보에 따라 트래픽이 라우팅됩니다. HTTP 요청에 지정된 IP 주소는 무시됩니다.

    gcloud compute forwarding-rules create td-hybrid-forwarding-rule \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --address=0.0.0.0 \
       --target-http-proxy=td-hybrid-proxy \
       --ports=8080 \
       --network=default
    

중간 프록시가 시뮬레이션된 온프레미스 서비스로 요청을 라우팅할 수 있는지 확인

이제 Traffic Director가 중간 프록시를 통해 시뮬레이션된 비공개 온프레미스 서비스로 트래픽을 라우팅하도록 구성되었습니다. 테스트 클라이언트 VM을 만들고, 해당 VM에 로그인하고, Envoy를 실행하는 중간 프록시로 요청을 전송하여 이 구성을 확인할 수 있습니다. 확인되면 테스트 클라이언트 VM을 삭제합니다.

먼저 중간 프록시의 IP 주소를 가져옵니다. 이 정보는 확인 단계에만 필요합니다.

gcloud compute instances list

td-middle-proxy-us-central1-a 관리형 인스턴스 그룹에 있는 인스턴스의 IP 주소를 기록합니다.

다음으로 테스트 클라이언트 인스턴스를 만듭니다.

gcloud compute instances create test-client --zone us-central1-a

SSH를 사용하여 테스트 클라이언트에 로그인합니다.

gcloud compute ssh test-client --zone us-central1-a

마지막으로, 중간 프록시 VM에 요청을 보냅니다. 이때 위에서 가져온 IP 주소를 MIDDLE_PROXY_IP로 바꿉니다.

curl $MIDDLE_PROXY_IP:8080

다음과 같은 출력이 표시됩니다.

Hello world from on-premises!

테스트 클라이언트 VM을 종료합니다. VM을 종료한 후 삭제할 수 있습니다.

gcloud compute instances delete test-client \
  --zone us-central1-a

외부 HTTP 부하 분산기 배포

이 섹션에서는 수신 트래픽을 중간 프록시로 전송하는 외부 HTTP(S) 부하 분산기를 배포합니다. 이는 표준 외부 HTTP(S) 부하 분산기 설정입니다.

외부 IP 주소 예약

외부 클라이언트가 트래픽을 전송할 전역 고정 외부 IP 주소(external-lb-vip)를 만듭니다. 이 외부 IP 주소는 이 가이드의 뒷부분에 나오는 확인 단계에서 가져옵니다.

gcloud compute addresses create external-lb-vip \
    --ip-version=IPV4 \
    --global

외부 HTTP 부하 분산기 설정

인터넷 고객 트래픽을 이미 구성된 중간 프록시로 라우팅하도록 외부 부하 분산기를 구성합니다.

  1. 중간 프록시를 실행하는 관리형 인스턴스 그룹이 정상 상태이고 트래픽을 수신할 수 있는지 확인하는 데 사용되는 상태 확인을 만듭니다.

       gcloud compute health-checks create tcp tcp-basic-check \
            --port 8080
    
  2. 상태 확인을 허용하는 방화벽 규칙을 만듭니다. 여기에서 allow-hc 태그를 다시 사용하여 중간 프록시 VM에 방화벽 규칙을 적용합니다.

    gcloud compute firewall-rules create fw-allow-health-checks \
      --network default \
      --action ALLOW \
      --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags allow-hc \
      --rules tcp
    
  3. 백엔드 서비스를 만듭니다.

       gcloud compute backend-services create td-middle-proxy-backend-service \
            --protocol HTTP \
            --health-checks tcp-basic-check \
            --global
    
  4. 중간 프록시 관리형 인스턴스 그룹을 이 백엔드 서비스의 백엔드로 추가합니다.

       gcloud compute backend-services add-backend td-middle-proxy-backend-service \
            --instance-group=td-middle-proxy-us-central1-a \
            --instance-group-zone=us-central1-a \
            --global
    
  5. 들어오는 요청을 기본 백엔드 서비스인 중간 프록시로 라우팅하는 URL 맵을 만듭니다.

       gcloud compute url-maps create lb-map-http \
            --default-service td-middle-proxy-backend-service
    
  6. 외부 부하 분산기의 전달 규칙 VIP에 대한 요청이 URL 맵에 따라 처리되도록 대상 HTTP 프록시를 만듭니다.

     gcloud compute target-http-proxies create http-lb-proxy \
            --url-map lb-map-http
    
  7. 들어오는 요청을 대상 HTTP 프록시로 라우팅하는 전역 전달 규칙을 만듭니다.

       gcloud compute forwarding-rules create http-forwarding-rule \
            --address=external-lb-vip\
            --global \
            --load-balancing-scheme=EXTERNAL \
            --target-http-proxy=http-lb-proxy \
            --ports=80
    

관리형 인스턴스 그룹의 이름이 지정된 포트 설정

중간 프록시가 외부 부하 분산기에서 HTTP 트래픽을 수신할 수 있도록 인스턴스 그룹에 이름이 지정된 포트를 설정합니다.

gcloud compute instance-groups managed set-named-ports td-middle-proxy-us-central1-a \
    --named-ports http:8080 \
    --zone us-central1-a

외부 HTTP 부하 분산기 구성 확인

이 단계에서는 외부 부하 분산기가 올바르게 설정되었는지 확인합니다. 부하 분산기의 VIP에 요청을 보내고 시뮬레이션된 온프레미스 VM에서 응답을 받을 수 있어야 합니다.

PUBLIC_VIP=`gcloud compute addresses describe external-lb-vip \
    --format="get(address)" \
    --global`

curl 요청을 공개 IP 주소로 보내고 Hello world 메시지를 받았는지 확인합니다.

$ curl $PUBLIC_VIP

다음과 같이 출력이 표시됩니다.

Hello world from on-premises!

Google Cloud Armor 사용 설정

CLIENT_IP_RANGE의 서비스 액세스만 허용하도록 Google Cloud Armor 보안 정책을 구성합니다. 여기에는 테스트하는 데 사용할 클라이언트 기기의 공개 IP 주소가 포함되어야 합니다. 예를 들면 "192.0.2.0/24"입니다. 이러한 정책은 외부 부하 분산기의 백엔드 서비스에 적용됩니다(이 예시에서는 중간 프록시를 가리키는 td-hybrid-backend-service). 이러한 규칙을 설정하는 데 필요한 권한에 대한 자세한 내용은 Google Cloud Armor 보안 정책 구성을 참조하세요.

  1. Google Cloud Armor 보안 정책을 만듭니다.

    gcloud compute security-policies create external-clients-policy \
        --description "policy for external clients"
    
  2. 모든 트래픽을 거부하도록 보안 정책의 기본 규칙을 업데이트합니다.

    gcloud compute security-policies rules update 2147483647 \
        --security-policy external-clients-policy \
        --action "deny-404"
    
  3. 특정 IP 범위의 트래픽을 허용하려면 우선순위가 더 높은 규칙을 추가하세요.

    gcloud compute security-policies rules create 1000 \
        --security-policy external-clients-policy \
        --description "allow traffic from CLIENT_IP_RANGE" \
        --src-ip-ranges "CLIENT_IP_RANGE" \
        --action "allow"
    
  4. 백엔드 서비스에 Google Cloud Armor 보안 정책을 연결합니다.

    gcloud compute backend-services update td-middle-proxy-backend-service \
        --security-policy external-clients-policy
    

최종 확인

외부 HTTP 부하 분산기의 공개 가상 IP 주소로 curl 요청을 보냅니다. 클라이언트 기기의 IP 주소가 위에 지정된, 허용된 <var>CLIENT_IP_RANGE</var> 내에 있는 경우에도 올바른 응답을 받아야 합니다.

$ curl $PUBLIC_VIP

다음과 같이 출력이 표시됩니다.

Hello world from on-premises!

IP 주소가 CLIENT_IP_RANGE 외부에 있는 다른 클라이언트 기기에서 동일한 curl 요청을 실행하거나 더 이상 클라이언트 IP 주소를 포함하지 않도록 보안 정책 규칙을 업데이트합니다. 이제 404 Not Found 오류가 표시됩니다.

문제 해결

전역 외부 HTTP(S) 부하 분산기 IP 주소를 통해 온프레미스 서비스에 액세스할 수 없음

Envoy를 실행하는 Google Cloud VM에서 온프레미스 서비스에 이미 액세스할 수 있다면 다음 단계에 따라 설정 문제를 해결합니다.

GCP Envoy MIG가 정상으로 보고되었는지 확인합니다. Google Cloud Console에서 네트워크 서비스 > 부하 분산으로 이동하고 url-map lb-map-http를 클릭하여 세부정보를 확인합니다. td-middle-proxy-us-central1-a에서 인스턴스 1개 중 1개가 정상임을 확인할 수 있습니다.

정상이 아닌 경우 Envoy를 실행하는 Google Cloud VM에 대한 인그레스 상태 확인 트래픽을 허용하도록 방화벽 규칙이 구성되었는지 확인합니다.

gcloud compute firewall-rules describe fw-allow-health-check

다음과 같은 출력이 표시됩니다.

allowed:
- IPProtocol: tcp
...
direction: INGRESS
disabled: false
...
...
sourceRanges:
- 130.211.0.0/22
- 35.191.0.0/16
targetTags:
- allow-hc

다음 단계