비공개 VM용 인터넷 연결 설정

Last reviewed 2023-05-15 UTC

이 문서에서는 비공개 IP 주소가 포함된 Compute Engine 리소스를 사용하여 인터넷 연결을 설정하는 옵션을 설명합니다. 이는 Google Cloud 서비스를 만드는 개발자와 Google Cloud 환경의 네트워크 관리자에게 유용합니다.

이 가이드는 VPC 배포, Compute Engine 사용, 기본 TCP/IP 네트워킹 사용에 익숙한 개발자를 대상으로 합니다.

목표

  • VPC 외부의 비공개 VM 간 연결을 설정하는 데 사용 가능한 옵션에 대해 알아봅니다.
  • SSH와 같은 대화형 서비스에 적합한 TCP 터널용 IAP(Identity-Aware Proxy) 인스턴스를 만듭니다.
  • VM에서 인터넷에 대한 아웃바운드 연결을 설정할 수 있도록 Cloud NAT 인스턴스를 만듭니다.
  • 인터넷과 VM 간의 인바운드 연결을 지원하기 위해 HTTP 부하 분산기를 구성합니다.

비용

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

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다. 이 가이드를 완료하는 데 필요한 총 비용은 1일 $5(USD) 미만인 것으로 계산됩니다.

시작하기 전에

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

    프로젝트 선택기로 이동

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

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

    프로젝트 선택기로 이동

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

소개

비공개 IP 주소는 공개(외부) IP 주소에 비해 여러 가지 장점이 있습니다. 예를 들면 다음과 같습니다.

  • 공격에 취약한 부분 감소. VM에서 외부 IP 주소를 삭제하면 공격자는 VM에 연결하여 잠재적인 취약점을 악용하기가 더 어려워집니다.
  • 유연성 향상. 부하 분산기 또는 NAT 서비스 같은 추상화 계층을 도입하면 고정 외부 IP 주소와 비교할 때 보다 안정적이고 유연하게 서비스를 제공할 수 있습니다.

이 솔루션에서는 3가지 시나리오를 다룹니다. 다음 표를 참조하세요.

대화형 가져오기 제공
SSH 연결이 원격 호스트에서 시작되어 TCP용 IAP를 통해 VM으로 직접 전달됩니다.

예: SSH 또는 RDP를 사용한 원격 관리

연결이 VM에서 시작되어 Cloud NAT를 통해 인터넷 상의 외부 호스트에 전달됩니다.

예: OS 업데이트, 외부 API

연결이 원격 호스트에서 시작되어 전역 Google Cloud 부하 분산기를 통해 VM에 전달됩니다.

예: 애플리케이션 프런트엔드, WordPress

환경에 따라 이러한 시나리오 중 하나만 필요한 경우도 있습니다. 그러나 대부분의 환경에서는 이 3가지 시나리오가 모두 필요하며 이는 Google Cloud에서 완벽히 지원됩니다.

다음 섹션에서는 두 리전에서 2개의 VM이 지원하는 HTTP 부하 분산 서비스가 있는 멀티 리전 환경을 설명합니다. 이러한 VM은 통신의 발신에 Cloud NAT를 사용합니다. 관리 목적의 VM은 IAP에서 터널링된 SSH를 통해 액세스할 수 있습니다.

다음 다이어그램은 3가지 사용 사례와 관련 구성요소에 대한 개요를 보여줍니다.

클라이언트에서 부하 분산기를 통해 VM 인스턴스로 이동하는 흐름을 보여주는 솔루션 아키텍처, 인스턴스와 인터넷 간의 액세스를 위한 Cloud NAT, 클라이언트와 인스턴스 간에 직접적인 SSH 액세스를 허용하는 IAP

VM 인스턴스 만들기

가이드를 시작하려면 먼저 4개의 가상 머신(VM) 인스턴스 즉, 2개의 서로 다른 리전에서 리전당 2개의 인스턴스를 만듭니다. 나중에 방화벽 규칙에서 사용할 수 있도록 모든 인스턴스에 동일한 태그를 지정하면 수신 트래픽을 인스턴스에 연결할 수 있습니다.

다음 다이어그램은 생성된 VM 인스턴스와 인스턴스 그룹이 2개의 영역으로 분산되어 있는 구조를 보여줍니다.

2개 영역에 있는 4개의 VM 인스턴스를 강조표시하는 솔루션의 아키텍처

각 인스턴스에 추가할 시작 스크립트에서 Apache를 설치하고 각 인스턴스의 고유한 홈페이지를 만듭니다.

이 절차에는 Google Cloud 콘솔 및 gcloud 명령어를 사용하는 경우에 대한 안내가 포함되어 있습니다. gcloud 명령어를 사용하는 가장 쉬운 방법은 Cloud Shell을 사용하는 것입니다.

콘솔

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

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기를 클릭합니다.

  3. 이름www-1로 설정합니다.

  4. 영역us-central1-b로 설정합니다.

  5. 관리, 보안, 디스크, 네트워킹, 단독 테넌시를 클릭합니다.

  6. 네트워킹을 클릭하고 다음을 설정합니다.

    • HTTP 트래픽의 네트워크 태그 입력란에 http-tag를 입력합니다.
    • 네트워크 인터페이스에서 을 클릭합니다.
    • 외부 IP에서 없음을 선택합니다.
  7. 관리를 클릭하고 시작 스크립트를 다음과 같이 설정합니다.

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>server 1</h1></body></html>' | sudo tee /var/www/html/index.html
    
  8. 만들기를 클릭합니다.

  9. 동일한 설정으로 www-2를 만듭니다. 단, 시작 스크립트는 다음과 같이 설정합니다.

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>server 2<h1></body></html>' | sudo tee /var/www/html/index.html
    
  10. 동일한 설정으로 www-3을 만듭니다. 단, 영역europe-west1-b로 설정하고 시작 스크립트는 다음과 같이 설정합니다.

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>server 3</h1></body></html>' | sudo tee /var/www/html/index.html
    
  11. 동일한 설정으로 www-4를 만듭니다. 단, 영역europe-west1-b로 설정하고 시작 스크립트는 다음과 같이 설정합니다.

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>server 4</h1></body></html>' | sudo tee /var/www/html/index.html
    

gcloud

  1. Cloud Shell을 엽니다.

    Cloud Shell 열기

  2. 기본 시작 스크립트를 사용하여 us-central1-bwww-1이라는 인스턴스를 만듭니다.

    gcloud compute instances create www-1 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --zone us-central1-b \
        --tags http-tag \
        --network-interface=no-address \
        --metadata startup-script="#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>www-1</h1></body></html>' | tee /var/www/html/index.html
    EOF"
    
  3. us-central1-bwww-2라는 인스턴스를 만듭니다.

    gcloud compute instances create www-2 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --zone us-central1-b \
        --tags http-tag \
        --network-interface=no-address \
        --metadata startup-script="#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>www-2</h1></body></html>' | tee /var/www/html/index.html
    EOF"
    
  4. 이번에는 europe-west1-bwww-3이라는 인스턴스를 만듭니다.

    gcloud compute instances create www-3 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --zone europe-west1-b \
        --tags http-tag \
        --network-interface=no-address \
        --metadata startup-script="#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>www-3</h1></body></html>' | tee /var/www/html/index.html
    EOF"
    
  5. 이번에도 europe-west1-bwww-4라는 인스턴스를 만듭니다.

    gcloud compute instances create www-4 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --zone europe-west1-b \
        --tags http-tag \
        --network-interface=no-address \
        --metadata startup-script="#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>www-4</h1></body></html>' | tee /var/www/html/index.html
    EOF"
    

Terraform

  1. Cloud Shell을 엽니다.

    Cloud Shell 열기

  2. GitHub에서 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/gce-public-connectivity-terraform

  3. 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd iap

  4. Terraform을 설치합니다.

  5. scripts/set_env_vars.sh 파일의 [YOUR-ORGANIZATION-NAME]을 Google Cloud 조직 이름으로 바꿉니다.

  6. 환경 변수를 설정합니다.

    source scripts/set_env_vars.sh

  7. Terraform 구성을 적용합니다.

    terraform apply

인스턴스와의 상호작용을 위해 IAP 터널 구성

VM 인스턴스에 로그인하려면 SSH 또는 RDP와 같은 도구를 사용하여 인스턴스에 연결합니다. 이 가이드에서 만드는 구성에서는 인스턴스에 직접 연결할 수 없습니다. 그러나 IAP에서 TCP 전달을 사용하면 이러한 대화형 패턴에 원격으로 액세스할 수 있습니다.

이 가이드에서는 SSH를 사용합니다.

이 섹션에서는 다음과 같은 작업을 수행하게 됩니다.

  1. IAP 터널을 사용하여 Compute Engine 인스턴스에 연결합니다.
  2. IAM에서 IAP 터널링 권한이 있는 두 번째 사용자를 추가합니다.

다음 다이어그램은 이 섹션에서 빌드한 아키텍처를 보여줍니다. 회색 영역은 이 가이드의 다른 섹션에서 다룹니다.

클라이언트와 인스턴스간 SSH 액세스에 대한 액세스 권한을 제공하는 IAP를 보여주는 솔루션의 아키텍처

인앱 구매의 제한사항

  • 대역폭: IAP의 TCP 전달 기능은 대량의 데이터 전송을 위한 것이 아닙니다. IAP는 사용자가 이 서비스를 남용하는 것을 방지하기 위해 용량을 제한할 수 있는 권한이 있습니다.
  • 연결 길이: IAP는 유지보수에 필요한 경우가 아니면 활성 세션 연결을 해제하지 않습니다.
  • 프로토콜: TCP용 IAP는 UDP를 지원하지 않습니다.

터널링을 허용하는 방화벽 규칙 만들기

SSH를 통해 인스턴스에 연결하려면 방화벽에서 적절한 포트를 열어야 합니다. IAP 연결은 특정 IP 주소 집합(35.235.240.0/20)에서 시작됩니다. 따라서 규칙을 이 CIDR 범위로 제한할 수 있습니다.

콘솔

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

    방화벽 정책 페이지로 이동

  2. 방화벽 규칙 만들기를 클릭합니다.

  3. 이름allow-ssh-from-iap로 설정합니다.

  4. VPC 네트워크default로 둡니다.

  5. 대상에서 지정된 대상 태그를 선택합니다.

  6. 대상 태그http-tag로 설정합니다.

  7. 소스 필터IP 범위로 설정된 상태로 둡니다.

  8. 소스 IP 범위35.235.240.0/20으로 설정합니다.

  9. 허용되는 프로토콜 및 포트tcp:22로 설정합니다.

  10. 만들기를 클릭합니다.

    새 방화벽 규칙이 Console에 표시되는 데 잠시 시간이 걸릴 수 있습니다.

gcloud

  • allow-ssh-from-iap라는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create allow-ssh-from-iap \
        --source-ranges 35.235.240.0/20 \
        --target-tags http-tag \
        --allow tcp:22
    

Terraform

  1. 방화벽 규칙 Terraform 파일을 현재 디렉터리에 복사합니다.

    cp iap/vpc_firewall_rules.tf .

  2. Terraform 구성을 적용합니다.

    terraform apply

터널링 테스트

  • Cloud Shell에서 IAP를 사용하여 www-1 인스턴스에 연결합니다.

    gcloud compute ssh www-1 \
        --zone us-central1-b \
        --tunnel-through-iap
    

연결에 성공하면 IAP를 통해 터널링된 SSH 세션을 비공개 VM에 직접 전달할 수 있습니다.

추가 사용자에게 액세스 권한 부여

IAP는 VM 인스턴스에 연결할 때 기존의 프로젝트 역할 및 권한을 사용합니다. 기본적으로 인스턴스 소유자에게만 IAP 보안 터널 사용자 역할이 할당됩니다. 다른 사용자가 IAP 터널링을 사용하여 VM에 액세스할 수 있도록 허용하려면 이 역할을 해당 사용자에게 부여해야 합니다.

  1. Google Cloud 콘솔에서 보안 >IAP(Identity-Aware Proxy)로 이동합니다.

    Google Cloud 콘솔의 보안 페이지에 있는 IAP 옵션

    OAuth 동의 화면을 구성해야 한다는 메시지가 표시되면 TCP용 IAP와는 관련이 없으므로 무시하세요.

  2. SSH 및 TCP 리소스 탭을 선택합니다.

  3. 생성된 VM을 선택합니다.

    선택한 4가지 인스턴스가 모두 표시된 Console

  4. 오른쪽에서 주 구성원 추가를 클릭합니다.

  5. 권한을 부여할 사용자를 추가하고 IAP 보안 터널 사용자 역할을 선택한 다음 저장을 클릭합니다.

요약

이제 SSH를 통해 인스턴스에 연결하여 인스턴스를 관리하거나 문제를 해결할 수 있습니다.

대부분의 애플리케이션은 패치를 다운로드하거나, 파트너와 연결하거나, 리소스를 다운로드하기 위해 발신 연결을 설정해야 합니다. 다음 섹션에서는 Cloud NAT를 구성하여 VM을 이러한 리소스에 연결합니다.

가져오기를 위한 Cloud NAT 배포

Cloud NAT 서비스를 사용하면 외부 IP 주소가 포함되지 않은 Google Cloud VM 인스턴스를 인터넷에 연결할 수 있습니다. Cloud NAT는 인스턴스가 인터넷에 연결될 수 있도록 아웃바운드 NAT와 기본 경로를 함께 구현합니다. 인바운드 NAT는 구현하지 않습니다. VPC 네트워크 외부의 호스트는 인스턴스에서 시작하여 설정된 연결에만 응답할 수 있으므로, Cloud NAT를 사용하여 인스턴스에 대한 자체 연결은 시작할 수 없습니다. NAT는 Google Cloud 내의 트래픽에 사용되지 않습니다.

Cloud NAT는 리전별 리소스입니다. 특정 리전에서 서브넷의 기본 및 보조 IP 주소 범위에서 발생하는 트래픽을 허용하도록 구성하거나 해당 범위 중 일부에만 적용하도록 구성할 수 있습니다.

이 섹션에서는 앞에서 사용한 각 리전에서 Cloud NAT 게이트웨이를 구성합니다. 다음 다이어그램은 이 섹션에서 빌드한 아키텍처를 보여줍니다. 회색 영역은 이 가이드의 다른 섹션에서 다룹니다.

인스턴스와 인터넷 간 Cloud NAT 인스턴스를 보여주는 솔루션의 아키텍처

Cloud Router를 사용하여 NAT 구성 만들기

Cloud NAT를 사용해야 하는 인스턴스와 동일한 리전에서 Cloud Router 인스턴스를 만들어야 합니다. Cloud NAT는 NAT 정보를 VM에 배치할 때만 사용되며 실제 Cloud NAT 게이트웨이의 일부로 사용되지는 않습니다.

이 구성을 사용하면 리전 내 모든 인스턴스가 기본 및 별칭 IP 전체 범위에서 Cloud NAT를 사용할 수 있습니다. 또한 외부 IP 주소가 NAT 게이트웨이에 자동으로 할당됩니다. 더 많은 옵션은 gcloud compute routers 문서를 참조하세요.

콘솔

  1. Cloud NAT 페이지로 이동합니다.

    Cloud NAT 페이지로 이동

  2. 시작하기 또는 NAT 게이트웨이 만들기를 클릭합니다.

  3. 게이트웨이 이름nat-config로 설정합니다.

  4. VPC 네트워크default로 설정합니다.

  5. 리전us-central1로 설정합니다.

  6. Cloud Router에서 새 라우터 만들기를 선택한 후 다음을 수행합니다.

    • 이름nat-router-us-central1로 설정합니다.
    • 만들기를 클릭합니다.
  7. 만들기를 클릭합니다.

  8. 다음과 같이 값을 변경하여 절차를 반복합니다.

    • 이름: nat-router-europe-west1
    • 리전: europe-west1

gcloud

  1. 각 리전에 Cloud Router 인스턴스를 만듭니다.

    gcloud compute routers create nat-router-us-central1 \
        --network default \
        --region us-central1
    
    gcloud compute routers create nat-router-europe-west1 \
        --network default \
        --region europe-west1
    
  2. Cloud NAT용 라우터를 구성합니다.

    gcloud compute routers nats create nat-config \
        --router-region us-central1 \
        --router nat-router-us-central1 \
        --nat-all-subnet-ip-ranges \
         --auto-allocate-nat-external-ips
    
    gcloud compute routers nats create nat-config \
        --router-region europe-west1 \
        --router nat-router-europe-west1 \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips
    

Terraform

  1. Terraform NAT 구성 파일을 현재 디렉터리에 복사합니다.

    cp nat/vpc_nat_gateways.tf .

  2. Terraform 구성을 적용합니다.

    terraform apply

Cloud NAT 구성 테스트

이제 VM 인스턴스에서 인터넷으로 아웃바운드 요청을 수행할 수 있는지 테스트할 수 있습니다.

  1. NAT 구성이 VM에 전파될 때까지 3분 정도 기다립니다.
  2. Cloud Shell에서 생성된 터널을 사용하여 인스턴스에 연결합니다.

    gcloud compute ssh www-1 --tunnel-through-iap
    
  3. 인스턴스에 로그인한 후 curl 명령어를 사용하여 아웃바운드 요청을 수행합니다.

    curl example.com
    

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

    <html>
    <head>
    <title>Example Domain</title>
    ...
    ...
    ...
    </head>
    
    <body>
    <div>
        <h1>Example Domain</h1>
        <p>This domain is established to be used for illustrative examples in documents.
            You may use this domain in examples without prior coordination or asking for
            permission.
        </p>
        <p><a href="http://www.iana.org/domains/example">More information...</a></p>
    </div>
    </body>
    </html>
    
    

명령어가 정상적으로 실행되면 VM이 Cloud NAT를 사용하여 인터넷에 연결된 것입니다.

요약

인스턴스는 패치를 다운로드하거나, 파트너와 연결하거나, 리소스를 다운로드하기 위해 발신 연결을 설정해야 합니다.

다음 섹션에서는 부하 분산을 배포에 추가한 후 원격 클라이언트에서 서버에 대한 요청을 시작할 수 있도록 구성합니다.

제공하기를 위한 HTTP 부하 분산 서비스 만들기

애플리케이션에 Cloud Load Balancing을 사용하면 여러 가지 이점이 있습니다. 이 서비스는 초당 1백만 개가 넘는 쿼리에 대한 원활하고 확장 가능한 부하 분산을 지원합니다. 또한 VM에서 SSL 오버헤드를 오프로드하고 위치와 가용성을 기반으로 사용자에게 가장 적합한 리전으로 쿼리를 라우팅하며 HTTP/2 및 QUIC 같은 최첨단 프로토콜을 지원합니다.

이 가이드에서는 또 다른 주요 기능인 전역 Anycast IP 연결 프록시 설정을 활용합니다. 이 기능은 Google의 전 세계에 분산된 에지에서 종료되는 단일 공개 IP 주소를 제공합니다. 그러면 클라이언트는 Google Cloud 어디에서나 비공개 IP 주소에서 호스팅되는 리소스에 연결할 수 있습니다. 이 구성은 DDoS 공격 및 직접 공격으로부터 인스턴스를 보호하는 데 유용합니다. 또한 보안 강화를 위해 Google Cloud Armor 같은 기능을 사용 설정할 수도 있습니다.

가이드의 이 섹션에서는 다음과 같은 작업을 수행하게 됩니다.

  1. VM 인스턴스를 재설정하여 Apache 웹 서버를 설치합니다.
  2. 부하 분산기에서의 액세스를 허용하는 방화벽 규칙을 만듭니다.
  3. 부하 분산기에 고정 전역 IPv4 및 IPv6 주소를 할당합니다.
  4. 인스턴스에 적합한 인스턴스 그룹을 만듭니다.
  5. 인스턴스로 트래픽 전송을 시작합니다.

다음 다이어그램은 이 섹션에서 빌드한 아키텍처를 보여줍니다. 회색 영역은 이 가이드의 다른 섹션에서 다룹니다.

2개의 인스턴스 그룹에 있는 4개의 인스턴스를 강조표시한 아키텍처

VM 인스턴스 재설정

이 튜토리얼의 앞부분에서 VM 인스턴스를 만들 때 외부 IP 주소가 할당되지 않고 Cloud NAT가 구성되지 않았으므로 인터넷에 액세스할 수 없습니다. 따라서 Apache를 설치하는 시작 스크립트가 성공적으로 완료되지 않았습니다.

시작 스크립트를 다시 실행하는 가장 쉬운 방법은 Apache 웹 서버가 설치되고 다음 섹션에서 사용할 수 있도록 해당 인스턴스를 재설정하는 것입니다.

콘솔

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

    VM 인스턴스로 이동

  2. www-1, www-2, www-3, www-4를 선택합니다.

  3. 페이지 상단의 재설정 버튼을 클릭합니다.

    재설정 버튼이 표시되지 않으면 추가 작업을 클릭하고 재설정을 선택합니다.

  4. 대화상자에서 재설정을 클릭하여 인스턴스 4개의 재설정을 확인합니다.

gcloud

  1. 4개의 인스턴스를 재설정합니다.

    gcloud compute instances reset www-1 \
        --zone us-central1-b
    
    gcloud compute instances reset www-2 \
        --zone us-central1-b
    
    gcloud compute instances reset www-3 \
        --zone europe-west1-b
    
    gcloud compute instances reset www-4 \
        --zone europe-west1-b
    

방화벽 열기

다음 작업은 부하 분산기에서 VM 인스턴스로 이동하는 트래픽을 허용하는 방화벽 규칙을 만드는 것입니다. 이 규칙은 부하 분산기와 상태 확인에서 모두 사용되는 Google Cloud 주소 범위에서 발생하는 트래픽을 허용합니다. 방화벽 규칙은 앞에서 만든 http-tag 태그를 사용하며 이 규칙을 사용하면 지정된 포트로 이동하는 트래픽이 해당 태그가 있는 인스턴스에 연결되도록 허용합니다.

콘솔

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

    방화벽 정책 페이지로 이동

  2. 방화벽 규칙 만들기를 클릭합니다.

  3. 이름allow-lb-and-healthcheck로 설정합니다.

  4. VPC 네트워크default로 둡니다.

  5. 대상에서 지정된 대상 태그를 선택합니다.

  6. 대상 태그http-tag로 설정합니다.

  7. 소스 필터IP 범위로 설정된 상태로 둡니다.

  8. 소스 IP 범위130.211.0.0/2235.191.0.0/16으로 설정합니다.

  9. 허용되는 프로토콜 및 포트tcp:80으로 설정합니다.

  10. 만들기를 클릭합니다.

    새 방화벽 규칙이 Console에 표시되는 데 잠시 시간이 걸릴 수 있습니다.

gcloud

  • allow-lb-and-healthcheck라는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create allow-lb-and-healthcheck \
        --source-ranges 130.211.0.0/22,35.191.0.0/16 \
        --target-tags http-tag \
         --allow tcp:80
    

Terraform

  1. Terraform 부하 분산 구성 파일을 현재 디렉터리에 복사합니다.

    cp lb/* .

  2. Terraform 구성을 적용합니다.

    terraform apply

부하 분산기에 적합한 외부 IP 주소 할당

트래픽을 인터넷에 제공하는 경우 부하 분산기에 적합한 외부 주소를 할당해야 합니다. IPv4 주소나 IPv6 주소, 또는 둘 다 할당할 수 있습니다. 이 섹션에서는 DNS에 추가하는 데 적합한 고정 IPv4 및 IPv6 주소를 예약합니다.

공개 IP 주소는 부하 분산기와 함께 사용되므로 추가 비용이 부과되지 않습니다.

콘솔

  1. Google Cloud 콘솔에서 외부 IP 주소 페이지로 이동합니다.

    외부 IP 주소 페이지로 이동

  2. 고정 주소 예약을 클릭하여 IPv4 주소를 예약합니다.

  3. 이름lb-ip-cr로 설정합니다.

  4. 유형전역으로 설정된 상태로 둡니다.

  5. 예약을 클릭합니다.

  6. 고정 주소 예약을 다시 클릭하여 IPv6 주소를 예약합니다.

  7. 이름lb-ipv6-cr로 설정합니다.

  8. IP 버전IPv6로 설정합니다.

  9. 유형전역으로 설정된 상태로 둡니다.

  10. 예약을 클릭합니다.

gcloud

  1. IPv4에 lb-ip-cr이라는 고정 IP 주소를 만듭니다.

    gcloud compute addresses create lb-ip-cr \
        --ip-version=IPV4 \
        --global
    
  2. IPv6에 lb-ipv6-cr이라는 고정 IP 주소를 만듭니다.

    gcloud compute addresses create lb-ipv6-cr \
        --ip-version=IPV6 \
        --global
    

인스턴스 그룹 만들기 및 인스턴스 추가

Google Cloud 부하 분산기에는 트래픽의 백엔드 역할을 할 인스턴스 그룹이 필요합니다. 이 가이드에서는 편의를 위해 비관리형 인스턴스 그룹을 사용합니다. 그러나 자동 확장, 자동 복구, 리전(멀티 영역) 배포, 자동 업데이트 같은 기능을 활용하기 위해 관리형 인스턴스 그룹을 사용할 수도 있습니다.

이 섹션에서는 사용 중인 각 영역별로 인스턴스 그룹을 만듭니다.

콘솔

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

    인스턴스 그룹 페이지로 이동

  2. 인스턴스 그룹 만들기를 클릭합니다.

  3. 왼쪽에서 새 비관리형 인스턴스 그룹을 클릭합니다.

  4. 이름us-resources-w로 설정합니다.

  5. 리전us-central1로 설정합니다.

  6. 영역us-central1-b로 설정합니다.

  7. 네트워크(기본값) 및 서브네트워크(기본값)를 선택합니다.

  8. VM 인스턴스에서 다음을 수행합니다.

    • 인스턴스 추가를 클릭한 후 www-1을 선택합니다.
    • 인스턴스 추가를 다시 클릭한 후 www-2를 선택합니다.
    • 만들기를 클릭합니다.
  9. 위 절차를 반복하여 두 번째 인스턴스 그룹을 만듭니다. 이때 다음 값을 사용하세요.

    • 이름: europe-resources-w
    • 영역: europe-west1-b
    • 인스턴스: www-3www-4
  10. 인스턴스 그룹 페이지에서 각각 2개의 인스턴스가 포함된 2개의 인스턴스 그룹이 있는지 확인합니다.

gcloud

  1. us-resources-w 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups unmanaged create us-resources-w \
        --zone us-central1-b
    
  2. www-1www-2 인스턴스를 추가합니다.

    gcloud compute instance-groups unmanaged add-instances us-resources-w \
        --instances www-1,www-2 \
        --zone us-central1-b
    
  3. europe-resources-w 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups unmanaged create europe-resources-w \
        --zone europe-west1-b
    
  4. www-3www-4 인스턴스를 추가합니다.

    gcloud compute instance-groups unmanaged add-instances europe-resources-w \
        --instances www-3,www-4 \
        --zone europe-west1-b
    

부하 분산 서비스 구성

부하 분산기 기능에는 여러 연결된 서비스가 포함됩니다. 이 섹션에서는 이러한 서비스를 설정하고 연결합니다. 만들 서비스는 다음과 같습니다.

  • 이름이 지정된 포트 - 부하 분산기에서 트래픽을 인스턴스 그룹으로 전달할 때 사용합니다.
  • 상태 확인 - 인스턴스를 폴링하여 인스턴스가 정상인지 확인합니다. 부하 분산기는 정상 인스턴스에만 트래픽을 보냅니다.
  • 백엔드 서비스 - 인스턴스 사용과 상태를 모니터링합니다. 백엔드 서비스는 인스턴스 그룹에 있는 인스턴스의 트래픽 수신 여부를 인식합니다. 인스턴스가 트래픽을 수신하지 못하면 부하 분산기는 충분한 용량이 있는 다른 위치의 인스턴스로 트래픽을 리디렉션합니다. 백엔드는 인스턴스 그룹의 용량(최대 CPU 활용률 또는 초당 최대 쿼리 수)을 정의합니다.
  • URL 맵 - 요청 URL을 파싱하고 요청 URL의 호스트와 경로를 기반으로 특정 요청을 특정 백엔드 서비스로 전달할 수 있습니다. 이 가이드에서는 콘텐츠 기반 전달을 사용하지 않으므로 URL 맵에 기본 매핑만 포함됩니다.
  • 대상 프록시 - 사용자로부터 요청을 수신하여 URL 맵으로 전달합니다.
  • 전역 전달 규칙 2개(IPv4와 IPv6에 각각 하나씩) - 전역 외부 IP 주소 리소스가 포함됩니다. 전역 전달 규칙은 수신되는 요청을 대상 프록시로 전달합니다.

부하 분산기 만들기

이 섹션에서는 부하 분산기를 만들고 트래픽 처리를 위해 기본 백엔드 서비스를 구성합니다. 또한 상태 확인도 만듭니다.

Console

구성 시작

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

    부하 분산으로 이동

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

기본 구성

  1. 부하 분산기 이름web-map으로 설정합니다.

부하 분산기 구성

  1. 전역 외부 애플리케이션 부하 분산기 만들기 페이지의 왼쪽 패널에서 백엔드 구성을 클릭합니다.
  2. 백엔드 서비스 및 백엔드 버킷 만들기 또는 선택 목록에서 백엔드 서비스, 백엔드 서비스 만들기를 차례로 선택합니다. 백엔드 서비스 만들기 대화상자가 나타납니다.
  3. 이름web-map-backend-service로 설정합니다.
  4. 프로토콜을 설정합니다. HTTP 프로토콜 값은 기본값으로 둡니다.
  5. 백엔드 유형에서 인스턴스 그룹을 선택합니다.
  6. 백엔드에서 인스턴스 그룹us-resources-w로 설정합니다.
  7. 백엔드 추가를 클릭합니다.
  8. europe-resources-w 인스턴스 그룹을 선택한 후 다음을 수행합니다.
    • 부하 분산기와 인스턴스 그룹 간의 HTTP 트래픽에서 포트 번호80으로 설정되었는지 확인합니다.
    • 나머지 필드는 기본값 그대로 둡니다.
  9. 완료를 클릭합니다.
  10. 상태 확인에서 상태 확인 만들기 또는 다른 상태 확인 만들기를 선택합니다.
  11. 상태 점검 매개변수를 다음과 같이 설정합니다.
    • 이름: http-basic-check
    • 프로토콜: HTTP
    • 포트: 80
  12. 만들기를 클릭합니다.

gcloud

  1. 인스턴스 그룹마다 HTTP 서비스를 정의하고 해당 포트에 포트 이름을 매핑합니다.

    gcloud compute instance-groups unmanaged set-named-ports us-resources-w \
        --named-ports http:80 \
        --zone us-central1-b
    
    gcloud compute instance-groups unmanaged set-named-ports europe-resources-w \
        --named-ports http:80 \
        --zone europe-west1-b
    
  2. 상태 확인을 만듭니다.

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

    gcloud compute backend-services create web-map-backend-service \
        --protocol HTTP \
        --health-checks http-basic-check \
        --global
    

    HTTP를 사용하여 인스턴스로 이동하므로 --protocol 플래그를 HTTP로 설정해야 합니다. 상태 확인의 경우 앞에서 만든 http-basic-check 상태 확인을 사용합니다.

  4. 인스턴스 그룹을 백엔드 서비스에 백엔드로 추가합니다.

    gcloud compute backend-services add-backend web-map-backend-service \
        --balancing-mode UTILIZATION \
        --max-utilization 0.8 \
        --capacity-scaler 1 \
        --instance-group us-resources-w \
        --instance-group-zone us-central1-b \
        --global
    
    gcloud compute backend-services add-backend web-map-backend-service \
        --balancing-mode UTILIZATION \
        --max-utilization 0.8 \
        --capacity-scaler 1 \
        --instance-group europe-resources-w \
        --instance-group-zone europe-west1-b \
        --global
    

호스트 및 경로 규칙 설정

콘솔

  • 전역 외부 애플리케이션 부하 분산기 만들기 페이지의 왼쪽 패널에서 호스트 및 경로 규칙을 클릭합니다.

    이 튜토리얼에서는 모든 트래픽이 기본 규칙에 따라 이동하므로 호스트나 경로 규칙을 구성할 필요가 없습니다. 미리 채워진 기본값을 그대로 적용해도 됩니다.

gcloud

  1. 수신되는 모든 요청을 내 모든 인스턴스로 전달하는 기본 URL 맵을 만듭니다.

    gcloud compute url-maps create web-map \
        --default-service web-map-backend-service
    
  2. 대상 HTTP 프록시를 만들어 URL 맵에 요청을 라우팅합니다.

    gcloud compute target-http-proxies create http-lb-proxy \
        --url-map web-map
    

프런트엔드 구성 및 설정 완료

Console

  1. 전역 외부 애플리케이션 부하 분산기 만들기 페이지의 왼쪽 패널에서 프런트엔드 구성을 클릭합니다.
  2. 이름http-cr-rule으로 설정합니다.
  3. 프로토콜HTTP로 설정합니다.
  4. IP 버전IPv4로 설정합니다.
  5. IP 주소 목록에서 이전에 만든 주소인 lb-ip-cr을 선택합니다.
  6. 포트80으로 설정되었는지 확인합니다.
  7. 완료를 클릭합니다.
  8. 프런트엔드 IP 및 포트 추가를 클릭합니다.
  9. 이름http-cr-ipv6-rule로 설정합니다.
  10. 프로토콜에서 HTTP를 선택합니다.
  11. IP 버전IPv6로 설정합니다.
  12. IP 주소 목록에서 이전에 만든 다른 주소인 lb-ipv6-cr을 선택합니다.
  13. 포트80으로 설정되었는지 확인합니다.
  14. 만들기를 클릭합니다.
  15. 완료를 클릭합니다.
  16. 전역 외부 애플리케이션 부하 분산기 만들기 페이지의 왼쪽 패널에서 검토 및 완료를 클릭합니다.
  17. 만들려던 설정과 현재 설정을 비교합니다.
  18. 설정이 올바르면 만들기를 클릭합니다.

    부하 분산 페이지로 돌아갑니다. 부하 분산기가 생성되면 옆에 있는 체크표시가 녹색으로 바뀌어 실행 중임을 나타냅니다.

gcloud

  1. 부하 분산기용으로 만든 고정 IP 주소를 가져옵니다. 이 주소는 다음 단계에서 사용되므로 기록해 둡니다.

    gcloud compute addresses list
    
  2. 전역 전달 규칙 두 개(IPv4와 IPv6에 각각 하나씩)를 만들어 수신되는 요청을 프록시로 라우팅합니다. 명령어의 lb_ip_address를 개발자가 만든 고정 IPv4 주소로, lb_ipv6_address를 개발자가 만든 IPv6 주소로 바꿉니다.

    gcloud compute forwarding-rules create http-cr-rule \
        --address lb_ip_address \
        --global \
        --target-http-proxy http-lb-proxy \
        --ports 80
    
    gcloud compute forwarding-rules create http-cr-ipv6-rule \
        --address lb_ipv6_address \
        --global \
        --target-http-proxy http-lb-proxy \
       --ports 80
    

    전역 전달 규칙을 만든 후 구성이 적용되는 데 몇 분 정도 걸릴 수 있습니다.

구성 테스트

이 섹션에서는 부하 분산 구성이 작동하는지 확인하기 위해 HTTP 요청을 인스턴스로 보냅니다.

콘솔

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

    부하 분산 페이지로 이동

  2. web-map이라는 부하 분산기를 선택하여 방금 만든 부하 분산기에 대한 세부정보를 표시합니다.

  3. 페이지의 백엔드 섹션에서 정상 열을 확인하여 인스턴스가 정상 상태인지 확인합니다.

    디스플레이에 인스턴스가 정상이라고 표시되는 데 잠시 시간이 걸릴 수 있습니다.

  4. 디스플레이에 인스턴스가 정상이라고 표시되면 프런트엔드 섹션에서 IP:포트 값을 복사해 브라우저에 붙여 넣습니다.

    브라우저에 기본 콘텐츠 페이지가 표시됩니다.

gcloud

  1. 전역 전달 규칙의 IP 주소를 가져오고 다음 단계에서 사용할 수 있도록 기록해 둡니다.

    gcloud compute forwarding-rules list
    
  2. curl 명령어를 사용하여 서비스의 여러 URL에 대한 응답을 테스트합니다. IPv4와 IPv6 둘 다를 시도합니다. IPv6의 경우 주소를 []로 묶어야 합니다(예: http://[2001:DB8::]/).

    curl http://ipv4-address
    
    curl -g -6 "http://[ipv6-address]/"
    

요약

이제 VM은 트래픽을 인터넷에 제공하고 인터넷에서 데이터를 가져올 수 있습니다. 또한 관리 작업을 수행하기 위해 SSH를 통해 이러한 데이터에 액세스할 수 있습니다. 이 모든 기능은 비공개 IP 주소만 사용하여 수행할 수 있으며, 인터넷에서 연결할 수 있는 IP 주소를 노출시키지 않고 직접 공격으로부터 데이터를 보호할 수 있습니다.

정리

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계

  • Cloud Load Balancing 만들기에서는 HTTPS 및 HTTP2 부하 분산기 생성 방법을 보여줍니다.
  • 비공개 클러스터 설정에서는 비공개 Google Kubernetes Engine 클러스터 설정 방법을 보여줍니다.
  • TCP 전달에 IAP 사용에서는 RDP 또는 원격 명령어 실행 같은 TCP용 IAP의 다른 용도를 설명합니다.
  • Cloud NAT 사용에서는 Google Kubernetes Engine의 예시를 제공하고 매개변수 세부정보 수정 방법을 설명합니다.
  • Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항을 살펴보세요. Cloud 아키텍처 센터 살펴보기