Menerima peristiwa Pub/Sub di endpoint HTTP internal dalam jaringan VPC

Tutorial ini menunjukkan cara membuat endpoint HTTP internal dalam jaringan Virtual Private Cloud (VPC) yang menerima peristiwa pesan Pub/Sub menggunakan Eventarc. Untuk mempelajari lebih lanjut tujuan peristiwa ini, lihat Merutekan peristiwa ke endpoint HTTP internal dalam jaringan VPC.

Anda dapat menjalankan perintah berikut menggunakan Google Cloud CLI di terminal atau Cloud Shell.

Membuat jaringan VPC mode kustom

Jaringan VPC adalah versi virtual dari jaringan fisik yang diterapkan di dalam jaringan produksi Google. Jaringan ini menyediakan konektivitas untuk instance VM Compute Engine Anda.

Saat jaringan VPC mode kustom dibuat, tidak ada subnet yang dibuat secara otomatis. Jenis jaringan ini memberi Anda kendali penuh atas subnet dan rentang IP miliknya.

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

Ganti NETWORK_NAME dengan nama untuk jaringan VPC.

Perhatikan hal berikut:

  • Setiap jaringan baru yang Anda buat harus memiliki nama unik dalam project yang sama.
  • Mode perutean Border Gateway Protocol (BGP) mengontrol perilaku Cloud Router dalam jaringan dan dapat berupa global atau regional. Defaultnya adalah regional.
  • Unit transmisi maksimum (MTU) adalah ukuran paket terbesar di jaringan. MTU dapat ditetapkan ke nilai apa pun mulai dari 1300 hingga 8896. Defaultnya adalah 1460. Sebelum menyetel MTU ke nilai yang lebih tinggi dari 1460, tinjau Unit transmisi maksimum.

Untuk mengetahui informasi selengkapnya, lihat Membuat dan mengelola jaringan VPC.

Membuat subnet khusus IPv4

Jaringan harus memiliki minimal satu subnet sebelum Anda dapat menggunakannya.

Saat membuat subnet, Anda menetapkan nama, region, dan setidaknya rentang alamat IPv4 primer sesuai dengan aturan subnet. Perhatikan bahwa Anda tidak dapat membuat instance di region yang tidak memiliki subnet yang ditentukan.

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

Ganti SUBNET_NAME dengan nama untuk subnet baru.

Untuk mengetahui informasi selengkapnya, lihat Subnet.

Membuat aturan firewall VPC

Dengan aturan firewall VPC, Anda dapat mengizinkan atau menolak traffic antar-resource dalam jaringan VPC berdasarkan nomor port, tag, atau protokol.

Aturan firewall VPC ditentukan di tingkat jaringan, dan hanya berlaku untuk jaringan tempat aturan tersebut dibuat; namun, nama yang Anda pilih untuk aturan harus unik untuk project.

  1. Buat aturan firewall untuk jaringan VPC Anda yang mengizinkan traffic masuk dari alamat IPv4 mana pun (0.0.0.0/0) ke instance mana pun di jaringan menggunakan port 22. Aturan ini tidak diperlukan untuk penayangan acara. Namun, untuk tujuan tutorial ini, buat aturan agar Anda dapat terhubung ke VM menggunakan SSH dan mengonfirmasi pengiriman acara:

    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. Buat aturan firewall untuk jaringan VPC Anda yang mengizinkan traffic masuk dari rentang alamat IP tertentu ke instance mana pun di jaringan menggunakan port 80 (karena Anda akan men-deploy server web di VM yang memproses di port 80):

    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

    Ganti RULE_NAME_ONE dan RULE_NAME_TWO dengan nama unik untuk aturan firewall Anda.

    Perhatikan bahwa penggunaan --source-ranges bersifat opsional dan menunjukkan daftar blok alamat IP yang diizinkan untuk membuat koneksi masuk yang cocok dengan aturan firewall ke instance di jaringan. Dalam hal ini, rentang cocok dengan rentang yang digunakan di subnet yang Anda buat sebelumnya.

    Sebaiknya gunakan tanda ini untuk menerapkan aturan firewall secara khusus ke traffic Eventarc. Jika --source-ranges maupun --source-tags tidak ditentukan, --source-ranges akan ditetapkan secara default ke 0.0.0.0/0, yang berarti aturan berlaku untuk semua koneksi IPv4 masuk dari dalam atau luar jaringan.

Untuk mengetahui informasi selengkapnya, lihat Menggunakan aturan firewall VPC.

Membuat lampiran jaringan

Lampiran jaringan adalah resource yang memungkinkan jaringan VPC produsen memulai koneksi ke jaringan VPC konsumen melalui antarmuka Private Service Connect.

Untuk memublikasikan peristiwa, Eventarc menggunakan lampiran jaringan untuk membuat koneksi ke endpoint HTTP internal yang dihosting di jaringan VPC.

Anda dapat membuat lampiran jaringan yang otomatis menerima koneksi dari antarmuka Private Service Connect mana pun yang merujuk ke lampiran jaringan. Buat lampiran jaringan di jaringan dan region yang sama dengan layanan tujuan HTTP.

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

Ganti ATTACHMENT_NAME dengan nama untuk lampiran jaringan.

Untuk mengetahui informasi selengkapnya, lihat Tentang lampiran jaringan.

Membuat instance VM di subnet yang ditentukan

Instance VM Compute Engine adalah virtual machine yang dihosting di infrastruktur Google. Istilah instance Compute Engine, instance VM, dan VM merupakan istilah yang sama dan dapat digunakan secara bergantian. Instance VM mencakup cluster Google Kubernetes Engine (GKE), instance lingkungan fleksibel App Engine, dan produk lain yang dibangun di VM Compute Engine. Google Cloud

Buat instance VM Compute Engine di jaringan VPC tempat Anda dapat men-deploy layanan penerima peristiwa.

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

Ganti INSTANCE_NAME dengan nama untuk VM.

Untuk mengetahui informasi selengkapnya, lihat Membuat dan memulai instance VM.

Men-deploy penerima peristiwa di VM

Deploy server web di VM Anda yang memproses port 80, serta menerima dan mencatat peristiwa ke dalam log.

  1. Buat koneksi SSH ke instance VM Anda menggunakan tombol SSH di konsol Google Cloud untuk terhubung ke VM Anda.

    Setelah koneksi ke server SSH dibuat, gunakan terminal SSH-in-browser untuk menjalankan perintah di instance VM Anda.

  2. Di terminal SSH dalam browser, buat file teks dengan nama file server.py yang berisi kode Python berikut:

    #!/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. Mulai server dan biarkan server tetap berjalan untuk langkah-langkah selanjutnya dalam tutorial ini:

    sudo python3 server.py
    

Membuat pemicu Eventarc

Buat pemicu Eventarc yang membuat topik Pub/Sub baru dan merutekan peristiwa ke penerima peristiwa yang di-deploy di VM saat pesan dipublikasikan ke topik Pub/Sub.

Setelah Anda mengaktifkan Compute Engine API, akun layanan default adalah akun layanan default Compute Engine (PROJECT_NUMBER-compute@developer.gserviceaccount.com). Untuk tujuan pengujian, pemicu menggunakan akun layanan default ini untuk identitasnya.

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

Ganti PROJECT_NUMBER dengan Google Cloud nomor project Anda. Anda dapat menemukan nomor project di halaman Selamat Datang di konsol Google Cloud atau dengan menjalankan perintah berikut:

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

Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi pemicu, lihat Merutekan peristiwa ke endpoint HTTP internal dalam jaringan VPC.

Membuat dan melihat peristiwa topik Pub/Sub

Anda dapat membuat peristiwa dengan memublikasikan pesan ke topik Pub/Sub.

  1. Cari dan tetapkan topik Pub/Sub sebagai variabel lingkungan:

    export MY_TOPIC=$(gcloud eventarc triggers describe TRIGGER_NAME \
        --location=$REGION \
        --format='value(transport.pubsub.topic)')
  2. Publikasikan pesan ke topik Pub/Sub untuk membuat peristiwa:

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

    Pemicu Eventarc merutekan peristiwa ke endpoint HTTP internal di jaringan VPC Anda. Di terminal SSH dalam browser, isi peristiwa akan ditampilkan. Tampilannya akan mirip dengan berikut ini:

    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 -
    

    Perhatikan bahwa jika Anda mendekode nilai data dari SGVsbG8gV29ybGQ= dari format Base64-nya, "Hello World" akan ditampilkan.

Anda telah berhasil men-deploy layanan penerima peristiwa ke endpoint HTTP internal dalam jaringan VPC, membuat pemicu Eventarc, membuat peristiwa dari Pub/Sub, dan mengonfirmasi bahwa peristiwa dirutekan seperti yang diharapkan oleh pemicu ke endpoint target.