VPC 네트워크의 내부 HTTP 엔드포인트에서 Pub/Sub 이벤트 수신


이 튜토리얼에서는 Eventarc를 사용하여 Pub/Sub 메시지 이벤트를 수신하는 Virtual Private Cloud(VPC) 네트워크에서 내부 HTTP 엔드포인트를 만드는 방법을 보여줍니다. 이 이벤트 대상에 대한 자세한 내용은 VPC 네트워크의 내부 HTTP 엔드포인트로 이벤트 라우팅을 참조하세요.

터미널 또는 Cloud Shell에서 Google Cloud CLI를 사용하여 다음 명령어를 실행할 수 있습니다.

목표

이 튜토리얼에서는 다음 단계를 진행합니다.

  1. 클라우드 기반 리소스 및 서비스에 네트워킹을 제공할 VPC 네트워크를 생성합니다. VPC 네트워크는 Google Cloud의 다른 네트워크로부터 논리적으로 격리됩니다
  2. 서브넷을 만듭니다. 각 VPC 네트워크는 서브넷이라는 하나 이상의 IP 주소 범위로 구성됩니다. 서브넷은 리전 리소스이며 서브넷과 연결된 IP 주소 범위가 있습니다.
  3. VPC 네트워크의 VM(가상 머신) 인스턴스와 주고받는 트래픽을 허용하거나 거부할 수 있도록 VPC 방화벽 규칙을 만듭니다.
  4. 제작자 VPC 네트워크가 소비자 VPC 네트워크에 대한 연결을 시작할 수 있도록 네트워크 연결을 만듭니다.
  5. VPC 네트워크에 Compute Engine VM 인스턴스를 만듭니다.
  6. VM 인스턴스에서 웹 서버를 이벤트 수신자 서비스로 배포합니다.
  7. Pub/Sub 이벤트를 VM 인스턴스의 이벤트 수신자로 라우팅하는 Eventarc 트리거를 만듭니다.
  8. VM 인스턴스에 대한 SSH 연결 만들기
  9. Pub/Sub 주제에 메시지를 게시하여 이벤트를 생성하고 브라우저에서 SSH를 통해 연결 도구에서 이벤트 본문을 확인합니다.

비용

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

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

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

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Compute Engine, Eventarc, and Pub/Sub APIs:

    gcloud services enable compute.googleapis.com eventarc.googleapis.com pubsub.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Compute Engine, Eventarc, and Pub/Sub APIs:

    gcloud services enable compute.googleapis.com eventarc.googleapis.com pubsub.googleapis.com
  12. Google Cloud CLI 구성요소를 업데이트합니다.
    gcloud components update
  13. 계정을 사용하여 로그인합니다.
    gcloud auth login
  14. 이 빠른 시작에서 사용되는 구성 변수를 설정합니다.
    REGION=us-central1
    ZONE=us-central1-a
  15. 프로젝트 생성자에게는 기본 소유자 역할(roles/owner)이 부여됩니다. 기본적으로 Identity and Access Management(IAM) 역할에는 대부분의 Google Cloud 리소스에 대한 전체 액세스에 필요한 권한이 포함되며, 이 단계를 건너뛸 수 있습니다.

    프로젝트 생성자가 아니면 프로젝트에서 적합한 주 구성원에 대해 필수 권한을 부여해야 합니다. 예를 들어 주 구성원은 Google 계정(최종 사용자)이거나 서비스 계정(애플리케이션 및 컴퓨팅 워크로드)일 수 있습니다. 자세한 내용은 이벤트 대상의 역할 및 권한 페이지를 참조하세요.

    필수 권한

    빠른 시작을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

    역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

    커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

  16. 2021년 4월 8일 이전에 Cloud Pub/Sub 서비스 에이전트를 사용 설정하여 인증된 Pub/Sub 푸시 요청을 지원한 경우 서비스 계정 토큰 생성자 역할(roles/iam.serviceAccountTokenCreator)을 서비스 에이전트에 부여합니다. 그렇지 않으면 기본적으로 이 역할이 부여됩니다.
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    다음을 바꿉니다.
    • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
    • PROJECT_NUMBER: Google Cloud 프로젝트 번호. Google Cloud 콘솔의 시작 페이지에서 또는 다음 명령어를 실행하여 프로젝트 번호를 찾을 수 있습니다.
      gcloud projects describe PROJECT_ID --format='value(projectNumber)'

커스텀 모드 VPC 네트워크 만들기

VPC 네트워크는 Google의 프로덕션 네트워크 내에서 구현되는 물리적 네트워크의 가상 버전입니다. 이는 Compute Engine VM 인스턴스에 연결을 제공합니다.

커스텀 모드 VPC 네트워크가 만들어질 때는 서브넷이 자동으로 만들어지지 않습니다. 이 네트워크 유형에서는 개발자가 서브넷과 IP 범위를 완전히 제어할 수 있습니다.

gcloud compute networks create NETWORK_NAME \
    --subnet-mode=custom \
    --bgp-routing-mode=regional \
    --mtu=1460

NETWORK_NAME을 VPC 네트워크의 이름으로 바꿉니다.

다음에 유의하세요.

  • 새로 만드는 네트워크의 이름은 같은 프로젝트 내에서 서로 달라야 합니다.
  • 경계 경로 프로토콜(BGP) 라우팅 모드는 네트워크에서 Cloud Router의 동작을 제어하며 global 또는 regional일 수 있습니다. 기본값은 regional입니다.
  • 네트워크의 최대 패킷 크기인 최대 전송 단위(MTU)입니다. MTU는 1300부터 8896 사이의 모든 값으로 설정할 수 있습니다. 기본값은 1460입니다. MTU를 1460보다 큰 값으로 설정하기 전에 최대 전송 단위를 검토하세요.

자세한 내용은 VPC 네트워크 만들기 및 관리를 참조하세요.

IPv4 전용 서브넷 만들기

네트워크를 사용하려면 네트워크에 한 개 이상의 서브넷이 있어야 합니다.

서브넷을 만들 때 서브넷 규칙에 따라 이름, 리전, 기본 IPv4 주소 범위를 설정합니다. 서브넷이 정의되지 않은 리전에는 인스턴스를 만들 수 없습니다.

gcloud compute networks subnets create SUBNET_NAME \
    --region=$REGION \
    --network=NETWORK_NAME \
    --range=10.10.10.0/24

SUBNET_NAME을 새 서브넷 이름으로 바꿉니다.

자세한 내용은 서브넷을 참조하세요.

VPC 방화벽 규칙 만들기

VPC 방화벽 규칙을 사용하면 포트 번호, 태그 또는 프로토콜을 기반으로 VPC 네트워크의 리소스 간 트래픽을 허용하거나 거부할 수 있습니다.

VPC 방화벽 규칙은 네트워크 수준에서 정의되며 네트워크가 만들어진 위치에만 적용됩니다. 그러나 규칙에 대해 선택한 이름은 프로젝트에 고유해야 합니다.

  1. VPC 네트워크에 대해 포트 22를 사용하여 모든 IPv4 주소(0.0.0.0/0)에서 네트워크의 모든 인스턴스로 수신되는 인그레스 트래픽을 허용하는 방화벽 규칙을 만듭니다. 이벤트 전송에는 이 규칙이 필요하지 않습니다. 그러나 이 튜토리얼에서는 SSH를 사용하여 VM에 연결하고 이벤트 전송을 확인할 수 있도록 규칙을 만듭니다.

    gcloud compute firewall-rules create RULE_NAME_ONE \
        --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \
        --direction=INGRESS \
        --priority=65534 \
        --action=ALLOW \
        --source-ranges=0.0.0.0/0 \
        --rules=tcp:22
  2. 포트 80을 사용하여 특정 IP 주소 범위에서 네트워크의 모든 인스턴스로 수신되는 인그레스 트래픽을 허용하는 VPC 네트워크의 방화벽 규칙을 만듭니다(포트 80에서 수신 대기하는 웹 서버를 VM에 배포할 예정).

    gcloud compute firewall-rules create RULE_NAME_TWO \
        --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \
        --direction=INGRESS \
        --priority=1000 \
        --action=ALLOW \
        --source-ranges=10.10.10.0/24 \
        --rules=tcp:80

    RULE_NAME_ONERULE_NAME_TWO를 방화벽 규칙의 고유 이름으로 바꿉니다.

    --source-ranges 사용은 선택사항이며 네트워크의 인스턴스에 대한 방화벽 규칙과 일치하는 인바운드 연결을 만들 수 있도록 허용된 IP 주소 블록 목록을 나타냅니다. 이 경우 범위는 이전에 만든 서브넷에 사용된 범위와 일치합니다.

    플래그를 사용하여 방화벽 규칙을 Eventarc 트래픽에 구체적으로 적용하는 것이 좋습니다. --source-ranges--source-tags를 모두 지정하지 않으면 --source-ranges의 기본값이 0.0.0.0/0이 되며, 이는 네트워크 내부 또는 외부의 모든 수신 IPv4 연결에 규칙이 적용됨을 의미합니다.

자세한 내용은 VPC 방화벽 규칙 사용을 참조하세요.

네트워크 연결 만들기

네트워크 연결은 제작자 VPC에서 Private Service Connect 인터페이스를 통해 고객 VPC 네트워크에 대한 연결을 시작할 수 있는 리소스입니다.

이벤트를 게시하기 위해 Eventarc는 네트워크 연결을 사용해서 VPC 네트워크에 호스팅되는 내부 HTTP 엔드포인트에 대해 연결을 설정합니다.

네트워크 연결을 참조하는 Private Service Connect 인터페이스에서 연결을 자동으로 허용하는 네트워크 연결을 만들 수 있습니다. HTTP 대상 서비스가 포함된 같은 네트워크와 리전에 네트워크 연결을 만듭니다.

gcloud compute network-attachments create ATTACHMENT_NAME \
    --region=$REGION \
    --subnets=SUBNET_NAME \
    --connection-preference=ACCEPT_AUTOMATIC

ATTACHMENT_NAME을 네트워크 연결 이름으로 바꿉니다.

자세한 내용은 네트워크 연결 정보를 참조하세요.

특정 서브넷에 VM 인스턴스 만들기

Compute Engine VM 인스턴스는 Google 인프라에서 호스팅되는 가상 머신입니다. Compute Engine 인스턴스, VM 인스턴스, VM은 같은 의미로 사용되는 동의어입니다. VM 인스턴스에는 Google Kubernetes Engine(GKE) 클러스터, App Engine 가변형 환경 인스턴스 및 Compute Engine VM을 기반으로 빌드된 기타 Google Cloud 제품이 포함됩니다.

이벤트 수신자 서비스를 배포할 수 있는 VPC 네트워크에 Compute Engine VM 인스턴스를 만듭니다.

gcloud compute instances create INSTANCE_NAME \
      --zone=$ZONE \
      --machine-type=e2-medium \
      --subnet=SUBNET_NAME

INSTANCE_NAME을 VM 이름으로 바꿉니다.

자세한 내용은 VM 인스턴스 만들기 및 시작을 참조하세요.

VM에 이벤트 수신자 배포

포트 80에서 수신 대기하고 이벤트를 수신하고 로깅하는 웹 서버를 VM에 배포합니다.

  1. Google Cloud 콘솔의 SSH 버튼을 사용하여 VM에 연결하여 VM 인스턴스에 SSH 연결을 설정합니다.

    SSH 서버에 대한 연결이 설정되면 브라우저에서 SSH를 통해 연결한 터미널을 사용하여 VM 인스턴스에서 명령어를 실행합니다.

  2. 브라우저에서 SSH를 통해 연결한 터미널에서 다음 Python 코드가 포함된 server.py라는 파일 이름의 텍스트 파일을 만듭니다.

    #!/usr/bin/env python3
    from http.server import BaseHTTPRequestHandler, HTTPServer
    import logging
    
    class S(BaseHTTPRequestHandler):
        def _set_response(self):
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
    
        def do_GET(self):
            logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
            self._set_response()
            self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))
    
        def do_POST(self):
            content_length = int(self.headers['Content-Length'])
            post_data = self.rfile.read(content_length)
            logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
                    str(self.path), str(self.headers), post_data.decode('utf-8'))
    
            self._set_response()
            self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
    
    def run(server_class=HTTPServer, handler_class=S, port=80):
        logging.basicConfig(level=logging.INFO)
        server_address = ('', port)
        http_server = server_class(server_address, handler_class)
        logging.info('Starting HTTP Server at port %d...\n', port)
        try:
            http_server.serve_forever()
        except KeyboardInterrupt:
            pass
        http_server.server_close()
        logging.info('Stopping HTTP Server...\n')
    
    if __name__ == '__main__':
        from sys import argv
    
        if len(argv) == 2:
            run(port=int(argv[1]))
        else:
            run()
  3. 서버를 시작하고 이 튜토리얼의 나머지 단계 동안 서버를 계속 실행합니다.

    sudo python3 server.py
    

Eventarc 트리거 만들기

새 Pub/Sub 주제를 생성하고 메시지가 Pub/Sub 주제에 게시될 때 VM에 배포된 이벤트 수신자로 이벤트를 라우팅하는 Eventarc 트리거를 만듭니다.

테스트 목적으로 트리거는 ID에 Compute Engine 기본 서비스 계정(PROJECT_NUMBER-compute@developer.gserviceaccount.com)을 사용합니다. 이 서비스 계정은 Compute Engine API를 사용 설정한 후에 자동으로 생성되었습니다.

프로덕션 환경의 경우 새 서비스 계정을 만들고 필요한 최소한의 권한을 포함하고 최소 권한 원칙을 따르는 IAM 역할을 하나 이상 부여하는 것이 좋습니다.

gcloud eventarc triggers create TRIGGER_NAME \
    --location=$REGION \
    --destination-http-endpoint-uri=http://INSTANCE_NAME.$ZONE.c.PROJECT_ID.internal \
    --network-attachment="projects/PROJECT_ID/regions/$REGION/networkAttachments/ATTACHMENT_NAME" \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

PROJECT_NUMBER를 Google Cloud 프로젝트 번호로 바꿉니다. Google Cloud 콘솔의 시작 페이지에서 또는 다음 명령어를 실행하여 프로젝트 번호를 찾을 수 있습니다.

gcloud projects describe PROJECT_ID --format='value(projectNumber)'

트리거 구성에 대한 자세한 내용은 VPC 네트워크의 내부 HTTP 엔드포인트로 이벤트 라우팅을 참조하세요.

Pub/Sub 주제 이벤트를 생성하고 확인합니다.

메시지를 Pub/Sub 주제에 게시하면 이벤트를 생성할 수 있습니다.

  1. Pub/Sub 주제를 환경 변수로 찾아서 설정합니다.

    export MY_TOPIC=$(gcloud eventarc triggers describe TRIGGER_NAME \
        --location=$REGION \
        --format='value(transport.pubsub.topic)')
  2. Pub/Sub 주제에 메시지를 게시하여 이벤트를 생성합니다.

    gcloud pubsub topics publish $MY_TOPIC --message "Hello World"

    Eventarc 트리거는 이벤트를 VPC 네트워크의 내부 HTTP 엔드포인트로 라우팅합니다. 브라우저에 SSH를 통해 연결한 터미널에서 이벤트 본문이 출력됩니다. 다음과 유사해야 합니다.

    Body:
    {
        "message": {
            "data": "SGVsbG8gV29ybGQ=",
            "messageId": "8795720366614192",
            "publishTime": "2023-08-26T13:09:48Z"
        }
    }
    
    10.10.10.3 - - [26/Aug/2023 13:09:49] "POST / HTTP/1.1" 200 -
    

    해당 Base64 형식에서 SGVsbG8gV29ybGQ=data 값을 디코딩할 경우 'Hello World'가 반환됩니다.

VPC 네트워크의 내부 HTTP 엔드포인드에 이벤트 수신자 서비스를 성공적으로 배포하고 Eventarc 트리거를 만들고 Pub/Sub에서 이벤트를 생성했으며, 트리거에서 예상대로 이벤트가 대상 엔드포인트로 라우팅되었음을 확인했습니다.

삭제

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

프로젝트 삭제

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

개별 리소스 삭제

  1. Eventarc 트리거를 삭제합니다.
    gcloud eventarc triggers delete TRIGGER_NAME --location=$REGION
  2. 인스턴스를 삭제합니다.
    gcloud compute instances delete INSTANCE_NAME
  3. 네트워크 연결을 삭제합니다.
    gcloud compute network-attachments delete ATTACHMENT_NAME --region=$REGION
  4. 방화벽 규칙을 삭제합니다.
    gcloud compute firewall-rules delete RULE_NAME_ONE
    gcloud compute firewall-rules delete RULE_NAME_TWO
  5. 서브넷을 삭제:합니다.
    gcloud compute networks subnets delete SUBNET_NAME --region=$REGION
  6. VPC 네트워크를 삭제합니다.
    gcloud compute networks delete NETWORK_NAME

다음 단계