Microsoft IIS 웹 서버에 리전 간 부하 분산 설정


이 튜토리얼에서는 외부 애플리케이션 부하 분산기를 사용하여 여러 리전에 프로비저닝된 Compute Engine VM에서 실행되는 Microsoft 인터넷 정보 서비스(IIS) 웹 서버에 트래픽을 분산하는 방법을 설명합니다.

목표

이 튜토리얼에서는 www.example.com 사이트의 트래픽 부하를 분산하는 방법을 확인하고 다음을 확인합니다.

  • 들어오는 요청이 가장 가까운 리전으로 라우팅되는가
  • 인스턴스가 실패하거나 용량에 도달하면 같은 리전 또는 다른 리전의 다른 응답적인 인스턴스로 부하 분산기가 요청을 라우팅하는가

이 시나리오 구성에는 단일 전역 IP 주소를 통해 요청을 수행하는 외부 애플리케이션 부하 분산기가 사용됩니다. 이 IP 주소는 각 수신 요청을 연결 유형, 즉 HTTP 또는 HTTPS인지에 따라 라우팅할 수 있습니다. HTTPS 요청의 경우에는 부하 분산기가 요청을 전송하는 클라이언트와 부하 분산기 간에 SSL/TLS 암호화를 구현합니다.

다음 다이어그램은 부하 분산기 아키텍처를 보여줍니다.

리전 간 부하 분산

부하 분산기에는 구성 가능성을 최대한 지원하기 위해 여러 가지 구성요소가 포함됩니다. 각 구성 요소의 기능에 대한 설명은 외부 애플리케이션 부하 분산기 개요를 참조하세요.

이 튜토리얼에서는 목표를 달성하기 위해 다음 작업을 완료하는 방법을 보여줍니다.

  • 백엔드 인스턴스 설정하기
  • 부하 분산 서비스를 만들고 구성하기
  • 백엔드로 트래픽 전송하기
  • 백엔드에 대한 액세스 제한하기
  • 중단 시뮬레이션하기

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Compute Engine 가상 머신(VM) 인스턴스
  • Compute Engine 영구 디스크
  • 선택사항: Google 관리 SSL 인증서
  • Windows Server 2016 머신 이미지

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Compute Engine, BigQuery, and Cloud Firestore 사용 설정

    API 사용 설정

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  7. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  8. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  9. API Compute Engine, BigQuery, and Cloud Firestore 사용 설정

    API 사용 설정

  10. Google Cloud CLI를 설치합니다.
  11. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  12. 또는 Google Cloud 콘솔에서 Cloud Shell을 사용하여 Google Cloud와 상호작용해도 됩니다. 이 경우 Google Cloud CLI를 설치할 필요가 없습니다.
  13. 원격 데스크톱 프로토콜(RDP) 클라이언트를 설치합니다. 자세한 내용은 Microsoft 원격 데스크톱 클라이언트를 참조하세요. 이미 RDP 클라이언트가 설치되어 있으면 이 태스크를 건너뛰어도 됩니다.
  14. 리소스를 프로비저닝할 영역과 리전을 결정합니다. 아키텍처 다이어그램에서는 미국 리전과 EU 리전의 여러 영역에 배포된 리소스를 보여줍니다. 이는 참조용입니다. 원하는 리전/영역에 리소스를 배포할 수 있습니다.
  15. 선택사항: 외부 애플리케이션 부하 분산기 개요를 읽고 숙지하세요.

백엔드 인스턴스 설정

이 섹션에서는 서로 다른 리전에 두 백엔드 서비스를 만듭니다. 각 백엔드 서비스에는 백엔드 인스턴스 2개가 포함되며, 각 인스턴스는 Windows Server 2016에서 Microsoft IIS 웹 서버를 실행합니다. 각각의 서버를 힘들게 구성할 필요 없이 한 서버 인스턴스에서 디스크 이미지를 만든 후 이 이미지를 사용해 다른 서버 인스턴스를 만들면 됩니다.

Compute Engine 인스턴스 만들기 및 구성

소스 이미지로 사용할 인스턴스를 만들려면 다음 안내를 따르세요.

Google Cloud Marketplace에서 원하는 영역의 Compute Engine에서 Microsoft IIS를 실행하는 Windows Server 2016 인스턴스를 시작하고 소스 이미지에 외부 HTTP, HTTPS, RDP 트래픽을 허용하도록 방화벽 규칙을 설정하세요.

  1. Google Cloud 콘솔에서 ASP.NET Framework Cloud Marketplace 페이지로 이동합니다.

    Cloud Marketplace로 이동

  2. 실행을 클릭합니다.

  3. 배포 이름 필드에 src-img를 입력합니다.

  4. 영역 필드에서 이미지를 배포할 영역을 선택합니다.

  5. Windows Server OS 버전 필드에서 2016을 선택합니다.

  6. 네트워킹 - 방화벽 섹션에서 다음 옵션만 선택합니다.

    • HTTP 트래픽 허용
    • HTTPS 트래픽 허용
    • RDP 트래픽 허용

  7. 서비스 약관에 동의한 후 배포를 클릭합니다.

  8. Compute Engine 인스턴스가 생성될 때까지 기다립니다.

소스 이미지 인스턴스 구성

새 소스 이미지 인스턴스를 구성하려면 소스 이미지 인스턴스에 새 Windows 사용자를 만들고 RDP 연결을 설정합니다.

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. 소스 이미지 인스턴스의 이름을 클릭합니다(src-img).

  3. Windows 비밀번호 설정을 클릭합니다.

  4. 새 Windows 비밀번호 설정 대화상자에서 사용자 이름을 추가하고 설정을 클릭해 인스턴스에 사용자 계정을 만듭니다.

  5. 제공된 비밀번호를 복사하고 대화상자를 닫습니다.

  6. RDP 드롭다운을 클릭하고 RDP 파일 다운로드 옵션을 선택하여 인스턴스의 RDP 파일을 다운로드합니다. 이 파일을 사용하여 RDP 클라이언트를 사용하는 인스턴스에 연결합니다. 자세한 내용은 Microsoft 원격 데스크톱 클라이언트를 참조하세요.

소스 이미지 인스턴스를 사용하여 RDP 연결을 설정한 후 IIS 기본 웹 디렉터리에 기본 홈페이지를 추가합니다.

  1. 소스 이미지 인스턴스에서 PowerShell을 관리자 권한으로 엽니다.

  2. 기본 IIS 웹 디렉터리 C:\inetpub\wwwroot에 새 홈페이지를 만듭니다.

    Echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' > C:\inetpub\wwwroot\index.html
    

소스 이미지 인스턴스에서 콘텐츠를 제공할 수 있는지 확인

Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

VM 인스턴스로 이동

인스턴스의 외부 IP 주소를 클릭하여 앞서 만든 홈페이지를 제공하는지 확인합니다.

소스 이미지 인스턴스에서 재사용 가능한 Windows Server 2016 이미지 만들기

소스 이미지 인스턴스가 제대로 구성되었고 콘텐츠를 제공할 수 있는지 확인한 후 인스턴스의 루트 영구 디스크에서 재사용 가능한 디스크 이미지를 만듭니다.

  1. 소스 이미지 인스턴스에서 PowerShell을 관리자 권한으로 엽니다.
  2. 다음 명령어를 실행해 시스템의 복제를 준비합니다.

    GCESysprep
    

    GCESysprep 작업이 완료되면 RDP 세션에서 연결이 자동으로 끊어집니다.

  3. 로컬 머신에서 다음 명령어를 실행하여 루트 영구 디스크는 보존한 상태로 소스 인스턴스를 삭제합니다.

    gcloud compute instances delete src-img \
       --keep-disks=boot \
       --zone=INSTANCE_ZONE
    

    INSTANCE_ZONE을 소스 인스턴스 영역으로 바꿉니다.

  4. 인스턴스를 삭제한 후 유지된 루트 영구 디스크에서 새 이미지를 만듭니다.

    gcloud compute images create win-be-img \
       --source-disk=src-img \
       --source-disk-zone=IMAGE_ZONE
    

    IMAGE_ZONE을 소스 이미지를 만들 영역으로 바꿉니다.

소스 이미지를 사용해 인스턴스 템플릿 만들기

구성된 Windows 서버에서 디스크 이미지를 인스턴스 템플릿의 소스 이미지로 사용합니다. 나중에 새 인스턴스에 이 템플릿을 사용하도록 관리형 인스턴스 그룹을 2개 구성합니다.

로컬 머신에서 다음 명령어를 실행하여 win-be-img를 소스 이미지로 사용하고 rdp-tagwww-tag를 인스턴스 태그로 사용하는 인스턴스 템플릿을 만듭니다.

gcloud compute instance-templates create win-be-tmpl \
    --tags=rdp-tag,www-tag \
    --image=win-be-img

각 리전의 관리형 인스턴스 그룹 만들기

각 리전에서 관리형 인스턴스 그룹을 만듭니다. 각 인스턴스 그룹을 만든 후 앞에서 정의한 인스턴스 템플릿을 기준으로 2개의 동일한 인스턴스가 그룹에 자동으로 채워집니다. 나중에 이러한 인스턴스 그룹을 백엔드 대상으로 취급하도록 부하 분산기를 구성합니다.

관리형 인스턴스 그룹을 만드는 방법은 다음과 같습니다.

  1. 로컬 머신에서 다음 명령어를 실행하여 이미지를 만든 영역에 새 관리형 인스턴스 그룹을 만듭니다. 그러면 같은 인스턴스 두 개가 자동으로 채워집니다.

    gcloud compute instance-groups managed create MANAGED_INSTANCE_GROUP_NAME_1 \
       --base-instance-name=BASE_INSTANCE_NAME_1 \
       --size=2 \
       --zone=ZONE_1 \
       --template=win-be-tmpl
    

    다음을 바꿉니다.

    • MANAGED_INSTANCE_GROUP_NAME_1: 관리형 인스턴스 이름
    • BASE_INSTANCE_NAME_1: 기본 인스턴스 이름
    • ZONE_1: 관리형 인스턴스를 배포할 영역
  2. 두 번째 영역에 관리형 인스턴스 그룹을 만드세요.

    gcloud compute instance-groups managed create MANAGED_INSTANCE_GROUP_NAME_2 \
       --base-instance-name=BASE_INSTANCE_NAME_2 \
       --size=2 \
       --zone=ZONE_2 \
       --template=win-be-tmpl
    

    다음을 바꿉니다.

    • MANAGED_INSTANCE_GROUP_NAME_2: 관리형 인스턴스 이름
    • BASE_INSTANCE_NAME_2: 기본 인스턴스 이름
    • ZONE_2: 관리형 인스턴스를 배포할 영역

백엔드 인스턴스의 실행 상태 확인

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. 각 백엔드의 외부 IP 주소를 클릭해 백엔드에서 앞서 만든 홈페이지를 제공하는지 확인합니다.

부하 분산 서비스 만들기 및 구성

Compute Engine 부하 분산 서비스에는 여러 가지 구성요소가 포함됩니다. 이 섹션에서는 이러한 구성요소를 만들고 이를 서로 연결합니다.

  1. 로컬 머신에서 다음 명령어를 실행하여 새 상태 확인을 만듭니다. 부하 분산기는 이 상태 점검을 사용하여 백엔드 인스턴스의 응답성을 확인합니다.

    gcloud compute http-health-checks create basic-check
    
  2. 백엔드 서비스를 만듭니다.

    gcloud compute backend-services create BACKEND_SERVICE_NAME \
      --protocol=HTTP \
      --http-health-checks=basic-check \
      --global
    

    BACKEND_SERVICE_NAME을 백엔드 서비스 이름으로 바꿉니다.

  3. 인스턴스 그룹을 백엔드 서비스의 백엔드 대상으로 추가합니다.

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
       --instance-group=MANAGED_INSTANCE_GROUP_NAME_1 \
       --instance-group-zone=ZONE_1
    
    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
       --instance-group=MANAGED_INSTANCE_GROUP_NAME_2 \
       --instance-group-zone=ZONE_2
    
  4. 수신되는 모든 요청을 내 모든 인스턴스로 전달하는 기본 URL 맵을 만듭니다.

    gcloud compute url-maps create lb-map \
       --default-service=BACKEND_SERVICE_NAME
    
  5. SSL 인증서 리소스를 만듭니다. 부하 분산기가 이 리소스를 사용하여 트래픽을 암호화하고 복호화합니다.

    비공개 키와 인증 기관의 SSL 인증서가 이미 있으면 이를 사용해서 다음 명령어를 실행하여 새 SSLCertificate 리소스를 만들 수 있습니다. 그렇지 않으면 테스트를 위해 Google 관리 SSL 인증서 또는 자체 서명 인증서를 만들어 사용할 수도 있습니다. 자세한 내용은 SSL 인증서를 참조하세요.

    SSL 인증서 리소스를 만들려면 다음 명령어를 실행합니다.

    gcloud compute ssl-certificates create www-cert \
       --certificate CRT_FILE_PATH \
       --private-key KEY_FILE_PATH
    

    다음을 바꿉니다.

    • CRT_FILE_PATH: 인증서의 로컬 파일 경로
    • KEY_FILE_PATH: 비공개 키의 파일 경로
  6. 대상 HTTP 및 HTTPS 프록시를 만들어 URL 맵에 요청을 라우팅합니다. 프록시는 HTTPS 부하 분산을 위해 SSL 인증서를 포함하는 부하 분산기의 일부분이므로 이 단계에서 인증서도 로드합니다.

    gcloud compute target-http-proxies create http-lb-proxy \
       --url-map=lb-map
    
    gcloud compute target-https-proxies create https-lb-proxy \
       --url-map lb-map \
       --ssl-certificate SSL_CERT
    

    다음을 기준으로 SSL_CERT를 바꿉니다.

    • SSL 인증서 및 비공개 키를 사용하여 SSLCertificate 리소스를 만든 경우 SSL_CERTwww-cert로 바꿉니다.
    • Google 관리형 또는 자체 서명 SSL 인증서를 사용하는 경우 SSL_CERT를 인증서 이름으로 바꿉니다.
  7. 부하 분산기가 트래픽을 안정적으로 수신할 수 있도록 전역 고정 IP 주소를 부하 분산기의 전역 전달 규칙에 할당해야 합니다.

    전역 고정 IP 주소 리소스를 만들려면 다음 명령어를 실행합니다.

    gcloud compute addresses create lb-ip \
       --global \
       --network-tier=PREMIUM
    

    IP 주소를 메모해 둡니다.

  8. 수신되는 HTTP 및 HTTPS 요청을 처리하는 전역 전달 규칙 2개를 만듭니다. 각 전달 규칙은 지정된 IP 주소, IP 프로토콜, 포트에 따라 생성된 대상 프록시 중 하나로 트래픽을 전송합니다.

    • 전역 외부 애플리케이션 부하 분산기의 경우 gcloud CLI 명령어를 load-balancing-scheme=EXTERNAL_MANAGED와 함께 사용합니다. 이 설정은 고급 트래픽 관리 기능을 제공합니다.
    • 기본 애플리케이션 부하 분산기의 경우 load-balancing-scheme=EXTERNAL을 사용합니다.
    gcloud compute forwarding-rules create http-fwd-rule \
       --load-balancing-scheme=LOAD_BALANCING_SCHEME \
       --network-tier=PREMIUM \
       --address=lb-ip \
       --global \
       --target-http-proxy=http-lb-proxy \
       --ports=80
    
    gcloud compute forwarding-rules create https-fwd-rule \
       --load-balancing-scheme=LOAD_BALANCING_SCHEME \
       --network-tier=PREMIUM \
       --address=lb-ip \
       --global \
       --target-https-proxy=https-lb-proxy \
       --ports=443
    

전역 전달 규칙을 만든 후 구성을 적용하기까지 몇 분이 걸릴 수 있습니다. 적용 진행 상황을 확인하려면 Google Cloud 콘솔에서 구성을 모니터링하거나 로컬 머신에서 다음 명령어를 실행합니다.

gcloud compute backend-services get-health BACKEND_SERVICE_NAME

백엔드로 트래픽 전송

부하 분산 서비스를 구성했으므로 이제 전달 규칙으로 트래픽을 전송하고 다른 인스턴스로 분산되는 트래픽을 살펴볼 수 있습니다.

다음과 같이 트래픽을 백엔드로 전송합니다.

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

    부하 분산으로 이동

  2. 프런트엔드 탭을 선택합니다.

  3. 기본 홈페이지를 보려면 주소 열에서 IP 주소를 클릭합니다.

백엔드 액세스 제한

모든 것이 제대로 작동하는지 확인한 후 HTTP 또는 HTTPS 트래픽이 부하 분산 서비스에서만 들어올 수 있도록 방화벽 규칙을 수정합니다.

  1. Google Cloud 콘솔에서 방화벽 페이지로 이동합니다.

    방화벽으로 이동

  2. 포트 80에 대한 외부 액세스를 허용하는 방화벽 규칙을 클릭합니다.

  3. 수정을 클릭하여 방화벽 규칙을 수정합니다.

  4. 소스 IPv4 범위 필드에 130.211.0.0/22를 입력합니다. 이렇게 하면 방화벽 규칙의 허용 소스 IP가 HTTPS 부하 분산 상태 확인 IP 범위인 130.211.0.0/22로 제한됩니다.

  5. 저장을 클릭합니다.

  6. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  7. 각 인스턴스의 외부 IP 주소를 클릭하여 지금 인스턴스에 액세스할 수 없는지 확인합니다.

중단 시뮬레이션

응답성 있는 인스턴스 간 부하 분산 방법을 확인하기 위해서는 한 리전의 하나 이상의 인스턴스에 대해 중단을 시뮬레이션할 수 있습니다.

인스턴스의 추가 요청 수신을 중지하는 방법은 다음과 같습니다.

  1. 인스턴스로의 RDP 연결을 설정합니다.
  2. 인스턴스에서 PowerShell을 관리자 권한으로 엽니다.
  3. 다음 명령어를 실행하여 인스턴스에 새 방화벽 규칙을 만듭니다. 이 명령어는 상태 검사기의 상태 확인 트래픽을 차단하고 부하 분산기에서 인스턴스로 향하는 새 HTTP 연결을 모두 막습니다.

    netsh advfirewall firewall add rule name="Outage Test" protocol=tcp dir=in localport=80 action=block remoteip=130.211.0.0/22
    
  4. 로컬 머신에서 다음 명령어를 실행해 인스턴스가 UNHEALTHY 상태를 보고하는지 확인합니다.

    gcloud compute backend-services get-health BACKEND_SERVICE_NAME
    
  5. 인스턴스가 UNHEALTHY 상태를 보고하기 시작하면 부하 분산기에 요청을 전송합니다. 응답성 있는 인스턴스만 응답해야 합니다.

  6. 중단 시뮬레이션을 완료한 후 방화벽 규칙을 삭제해 인스턴스 연결을 복원하면 됩니다. 비응답성 인스턴스에서 PowerShell을 관리자 권한으로 열었다면 다음 명령어를 실행하여 규칙을 삭제합니다.

    netsh advfirewall firewall delete rule name="Outage Test"
    

삭제

튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

    Google Cloud 프로젝트를 삭제합니다.

    gcloud projects delete PROJECT_ID

개별 리소스 삭제

프로젝트에 생성된 모든 리소스(이미지, 인스턴스 템플릿, 인스턴스 그룹, 상태 확인, 백엔드 서비스, URL 맵, HTTP 프록시, 주소, 전달 규칙)를 개별적으로 삭제해야 합니다. 다음 명령어를 실행하기 전에는 VM 인스턴스를 삭제할 수 없습니다.

로컬 머신에서 다음 명령어를 실행하여 튜토리얼용으로 만든 리소스를 삭제하세요.

  1. HTTP/S 전달 규칙을 삭제합니다.
    gcloud compute forwarding-rules delete https-fwd-rule --global
    
    gcloud compute forwarding-rules delete http-fwd-rule --global
    
  2. 전역 고정 IP 주소를 삭제합니다.
    gcloud compute addresses delete lb-ip --global
    
  3. HTTP/S 프록시를 삭제합니다.
    gcloud compute target-https-proxies delete https-lb-proxy
    
    gcloud compute target-http-proxies delete http-lb-proxy
    
  4. SSL 인증서를 삭제합니다.
    gcloud compute ssl-certificates delete SSL_CERT
    
  5. URL 맵을 삭제합니다.
    gcloud compute url-maps delete lb-map
    
  6. 백엔드 서비스를 삭제합니다.
    gcloud compute backend-services delete BACKEND_SERVICE_NAME --global
    
  7. HTTP 상태 점검을 삭제합니다.
    gcloud compute http-health-checks delete basic-check
    
  8. 관리형 인스턴스 그룹을 삭제합니다.
    gcloud compute instance-groups managed delete MANAGED_INSTANCE_GROUP_NAME_1 --zone=ZONE_1
    
    gcloud compute instance-groups managed delete MANAGED_INSTANCE_GROUP_NAME_2 --zone=ZONE_2
    
  9. 인스턴스 템플릿을 삭제합니다.
    gcloud compute instance-templates delete win-be-tmpl
    
  10. 이미지 삭제:
    gcloud compute images delete IMAGE_NAME
  11. 디스크를 삭제합니다.
    gcloud compute disks delete DISK_NAME

다음 단계