리전 내부 애플리케이션 부하 분산기의 HTTP-HTTPS 리디렉션 설정

이 주제에서는 URL 맵 리디렉션을 사용하여 모든 내부 애플리케이션 부하 분산기 요청을 HTTP에서 HTTPS로 리디렉션하는 방법을 보여줍니다. 이 페이지의 예시에서는 잘 알려진 포트 80(HTTP용) 및 443(HTTPS용)을 사용합니다. 하지만 이러한 특정 포트 번호를 사용할 필요는 없습니다. 애플리케이션 부하 분산기의 각 전달 규칙은 1~65535 범위의 단일 포트를 참조할 수 있습니다.

HTTP에서 HTTPS로 리디렉션을 구성하려면 HTTPS 트래픽용 부하 분산기와 HTTP 트래픽용 부하 분산기를 각각 하나씩 만들어야 합니다. 각 부하 분산기에는 자체 전달 규칙, 대상 프록시, URL 맵이 있지만 같은 IP 주소를 공유합니다. HTTP 부하 분산기의 경우 프런트엔드에서 트래픽을 HTTPS 부하 분산기의 백엔드로 리디렉션하므로 백엔드를 구성할 필요가 없습니다.

대략적으로 HTTP 트래픽을 HTTPS로 리디렉션하려면 다음을 수행해야 합니다.

  1. 예약된 공유 내부 IP 주소를 사용하여 일반 내부 HTTPS 부하 분산기를 만듭니다.
  2. 부하 분산기를 테스트하여 작동하는지 확인합니다.
  3. 트래픽을 HTTPS 부하 분산기로 리디렉션합니다.

    이렇게 하려면 프런트엔드만 있는 부분적 내부 HTTP 부하 분산기를 만들어야 합니다. 프런트엔드에서 요청을 수신한 후 다음 리소스를 사용하여 HTTPS 부하 분산기로 리디렉션합니다.

    • 1단계에서 만든 HTTPS 부하 분산기와 같은 예약된 내부 IP 주소가 있는 전달 규칙
    • 대상 HTTP 프록시
    • HTTPS 부하 분산기로 트래픽을 리디렉션하는 URL 맵

다음 다이어그램과 같이 HTTPS 부하 분산기는 예상 내부 애플리케이션 부하 분산기 구성요소가 있는 일반 부하 분산기입니다.

HTTP 부하 분산기에는 HTTPS 부하 분산기와 동일한 IP 주소 및 URL 맵의 리디렉션 명령이 있습니다.

내부 HTTP에서 HTTPS로 리디렉션 구성
내부 HTTP에서 HTTPS로 리디렉션 구성(확대하려면 클릭)

내부 HTTPS 부하 분산기 만들기

리전 내부 애플리케이션 부하 분산기를 설정하려면 내부 애플리케이션 부하 분산기 설정의 안내를 따르세요.

이미 작동 중인 리전 내부 애플리케이션 부하 분산기가 있으면 전달 규칙에 예약된 공유 IP 주소가 있는지 확인한 후 다음 섹션인 HTTPS 부하 분산기로 트래픽 리디렉션으로 이동합니다.

리전 간 내부 애플리케이션 부하 분산기의 경우 VM 인스턴스 그룹 백엔드로 리전 간 내부 애플리케이션 부하 분산기 설정의 안내를 사용하여 부하 분산기 2개를 만든 후 HTTPS 부하 분산기로 트래픽 리디렉션의 안내를 따릅니다.

HTTPS 부하 분산기로 트래픽 리디렉션

이전 단계에서 만든 HTTPS 부하 분산기와 동일한 IP 주소가 있는 부분적 HTTP 부하 분산기를 만듭니다. 부분적 부하 분산기가 트래픽을 포트 80에서 포트 443으로 리디렉션합니다.

콘솔

구성 시작

  1. Google Cloud 콘솔에서 부하 분산 페이지로 이동합니다.

    부하 분산으로 이동

  2. 부하 분산기 만들기를 클릭합니다.
  3. 부하 분산기 유형에서 애플리케이션 부하 분산기(HTTP/HTTPS)를 선택하고 다음을 클릭합니다.
  4. 공개 또는 내부에서 내부를 선택하고 다음을 클릭합니다.
  5. 리전 간 또는 단일 리전 배포리전 워크로드에 적합을 선택하고 다음을 클릭합니다.
  6. 구성을 클릭합니다.

기본 구성

  1. 부하 분산기 이름에 l7-ilb-http-redirect를 입력합니다.
  2. 리전에서 us-west1을 선택합니다.
  3. 네트워크에서 lb-network를 선택합니다.

백엔드 서비스 구성

  1. 백엔드 구성을 클릭합니다.
  2. 백엔드 서비스 선택 메뉴에서 기존 백엔드 서비스 l7-ilb-backend-service를 선택합니다.
  3. 확인을 클릭합니다.

URL 맵 구성

  1. 라우팅 규칙을 클릭합니다.
  2. 모드에서 고급 호스트 및 경로 규칙을 선택합니다.
  3. 호스트 및 경로 규칙 추가를 클릭합니다.
  4. 호스트*로 설정합니다.

  5. 경로 일치자(일치, 작업 및 서비스)에 다음 코드를 입력합니다.

    name: matcher1
    defaultUrlRedirect:
      httpsRedirect: true
      hostRedirect: IP_ADDRESS:443
      redirectResponseCode: PERMANENT_REDIRECT
    

  6. l7-ilb-backend-service가 일치하지 않는 모든 호스트 및 일치하지 않는 모든 경로에 대한 유일한 백엔드 서비스입니다.

트래픽 관리에 대한 자세한 내용은 내부 애플리케이션 부하 분산기에 대한 트래픽 관리 설정을 참조하세요.

HTTP용 프런트엔드 구성

  1. 프런트엔드 구성을 클릭합니다.
  2. 전달 규칙의 이름을 l7-ilb-forwarding-rule로 설정합니다.
  3. 프로토콜HTTP로 설정합니다.
  4. 서브네트워크backend-subnet로 설정합니다.
  5. 포트80으로 설정합니다.
  6. IP 주소 메뉴에서 HTTPS 부하 분산기 전달 규칙에 예약된 공유 IP 주소를 선택합니다.
  7. 완료를 클릭합니다.

구성 검토

  1. 검토 및 완료를 클릭합니다.
  2. 부하 분산기 구성 설정을 검토합니다.
  3. 선택사항: 부하 분산기를 만드는 데 사용되는 REST API 요청을 보려면 상응하는 코드를 클릭합니다.
  4. 만들기를 클릭합니다.

gcloud

  1. 트래픽 리디렉션 구성으로 YAML 파일을 만들어 새 URL 맵을 만듭니다. IP_ADDRESS를 HTTPS 부하 분산기 전달 규칙에 예약된 공유 IP 주소로 바꿉니다.

    defaultService: regions/us-west1/backendServices/l7-ilb-backend-service
    kind: compute#urlMap
    name: l7-ilb-redirect-url-map
    hostRules:
    - hosts:
     - '*'
     pathMatcher: matcher1
    pathMatchers:
    - name: matcher1
     defaultUrlRedirect:
           hostRedirect: IP_ADDRESS:443
           redirectResponseCode: PERMANENT_REDIRECT
           httpsRedirect: True
    
  2. YAML 파일을 새 URL 맵으로 가져옵니다.

    gcloud compute url-maps import l7-ilb-redirect-url-map \
       --source=/tmp/url_map.yaml \
       --region=us-west1
    
  3. HTTP 부하 분산기의 대상 프록시를 만듭니다.

    gcloud compute target-http-proxies create l7-ilb-http-proxy \
       --url-map=l7-ilb-redirect-url-map \
       --region=us-west1
    
  4. 새 전달 규칙 및 공유 IP 주소를 만듭니다.

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
       --load-balancing-scheme=INTERNAL_MANAGED \
       --network=lb-network \
       --subnet=backend-subnet \
       --address=IP_ADDRESS \
       --ports=80 \
       --region=us-west1 \
       --target-http-proxy=l7-ilb-http-proxy \
       --target-http-proxy-region=us-west1
    

트래픽 리디렉션 테스트

  1. 클라이언트 VM에 연결합니다.

    gcloud compute ssh l7-ilb-client-us-west1-a \
       --zone=us-west1-a
    
  2. 80 포트에서 HTTP 요청을 IP_ADDRESS로 전송하고 트래픽 리디렉션을 예상합니다.

    curl -L -k IP_ADDRESS
    
  3. 샘플 결과를 확인합니다.

    Page served from: l7-ilb-backend-w11t
    

    자세한 내용을 보려면 -vvv를 추가합니다.

    curl -L -k IP_ADDRESS -vvv
    

    • Rebuilt URL to: IP_ADDRESS/
    • Trying IP_ADDRESS...
    • TCP_NODELAY set
    • Connected to IP_ADDRESS (IP_ADDRESS) port 80 (#0) > GET / HTTP/1.1 > Host: IP_ADDRESS > User-Agent: curl/7.52.1 > Accept: / > < HTTP/1.1 308 Permanent Redirect < location: https://IP_ADDRESS:443/ < date: Fri, 07 Aug 2020 05:07:18 GMT < via: 1.1 google < content-length: 0 <
    • Curl_http_done: called premature == 0
    • Connection #0 to host IP_ADDRESS left intact
    • Issue another request to this URL: 'https://IP_ADDRESS:443/'
    • Trying IP_ADDRESS...
    • TCP_NODELAY set
    • Connected to IP_ADDRESS (IP_ADDRESS) port 443 (#1)
    • ALPN, offering h2
    • ALPN, offering http/1.1
    • Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
    • successfully set certificate verify locations:
    • CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs ... ...
    • SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
    • ALPN, server accepted to use h2
    • Server certificate:
    • subject: O=Google TESTING; CN=test_cert_1
    • start date: Jan 1 00:00:00 2015 GMT
    • expire date: Jan 1 00:00:00 2025 GMT
    • issuer: O=Google TESTING; CN=Intermediate CA
    • SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
    • Using HTTP2, server supports multi-use
    • Connection state changed (HTTP/2 confirmed)
    • Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
    • Using Stream ID: 1 (easy handle 0x561a6b0e3ea0) > GET / HTTP/1.1 > Host: IP_ADDRESS > User-Agent: curl/7.52.1 > Accept: / >
    • Connection state changed (MAX_CONCURRENT_STREAMS updated)! < HTTP/2 200 < date: Fri, 07 Aug 2020 05:07:18 GMT < server: Apache/2.4.25 (Debian) < last-modified: Thu, 06 Aug 2020 13:30:21 GMT < etag: "2c-5ac357d7a47ec" < accept-ranges: bytes < content-length: 44 < content-type: text/html < via: 1.1 google < Page served from: l7-ilb-backend-https-w11t
    • Curl_http_done: called premature == 0
    • Connection #1 to host IP_ADDRESS left intact

다음 단계