Menyalurkan traffic dari beberapa region

Untuk menampilkan respons yang lebih cepat kepada pengguna Anda di seluruh dunia, Anda perlu men-deploy layanan di beberapa region dan merutekan pengguna Anda ke region terdekat.

Karena layanan Cloud Run di-deploy ke masing-masing region, Anda perlu mengonfigurasi Load Balancer Aplikasi eksternal untuk merutekan pengguna Anda ke berbagai region layanan Anda.

Panduan ini menunjukkan cara mengonfigurasi Load Balancer Aplikasi eksternal dengan domain yang diamankan dengan sertifikat TLS yang terkelola yang mengarah ke alamat IP anycast global, yang merutekan pengguna ke pusat data Google terdekat tempat layanan Anda di-deploy.

Arsitektur yang dijelaskan dalam panduan ini tidak secara otomatis merutekan permintaan ke region yang berbeda saat layanan Cloud Run regional menjadi tidak responsif atau mulai menampilkan error. Untuk meningkatkan ketersediaan layanan multi-region Anda, Anda dapat mengonfigurasi pendeteksi pencilan untuk mengidentifikasi layanan Cloud Run yang tidak responsif berdasarkan tingkat error HTTP-nya dan membagi beberapa permintaan ke region yang lain.

Membuat load balancer

Pembuatan load balancer eksternal melibatkan pembuatan berbagai resource jaringan dan menghubungkannya bersama-sama:

Command line

  1. Cadangkan alamat IP statis sehingga Anda tidak perlu memperbarui Data DNS saat Anda membuat ulang load balancer Anda.
    gcloud compute addresses create --global SERVICE_IP
    Pada perintah di atas, ganti SERVICE_IP dengan nama untuk resource alamat IP (misalnya, myservice-ip).

    Alamat IP ini adalah alamat IPv4 anycast global yang merutekan ke pusat data Google atau titik kehadiran yang terdekat dengan pengunjung Anda.

  2. Buat layanan backend.
    gcloud compute backend-services create --global BACKEND_NAME

    Pada perintah di atas, ganti BACKEND_NAME dengan nama yang ingin Anda berikan kepada layanan backend (contohnya myservice-backend).

  3. Membuat peta URL.
    gcloud compute url-maps create URLMAP_NAME --default-service=BACKEND_NAME

    Ganti URLMAP_NAME dengan nama yang ingin Anda berikan ke peta URL (contohnya myservice-urlmap).

  4. Buat sertifikat TLS yang terkelola untuk domain Anda guna menyalurkan traffic HTTPS. (Ganti example.com dengan nama domain Anda.)
    gcloud compute ssl-certificates create CERT_NAME \
      --domains=example.com

    Ganti CERT_NAME dengan nama yang Anda inginkan untuk sertifikat SSL yang terkelola (contohnya myservice-cert).

  5. Buat proxy HTTPS target.
    gcloud compute target-https-proxies create HTTPS_PROXY_NAME \
      --ssl-certificates=CERT_NAME \
      --url-map=URLMAP_NAME

    Ganti HTTPS_PROXY_NAME dengan nama yang ingin Anda berikan ke proxy HTTPS target (contohnya myservice-https).

  6. Buat aturan penerusan yang menghubungkan resource jaringan yang Anda buat ke alamat IP.
    gcloud compute forwarding-rules create --global FORWARDING_RULE_NAME \
      --target-https-proxy=HTTPS_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=443

    Ganti FORWARDING_RULE_NAME dengan nama resource aturan penerusan yang ingin Anda buat (contohnya myservice-lb).

Terraform

Selain langkah-langkah yang dijelaskan di bagian ini, Anda dapat menggunakan Modul Terraform Load Balancer HTTP Global.

Tambahkan kode berikut ke file terraform Anda (contohnya main.tf):

  1. Konfigurasikan alamat IP:

    resource "google_compute_global_address" "lb_default" {
      provider = google-beta
      name     = "myservice-service-ip"
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api
      ]
    }
    output "load_balancer_ip_addr" {
      value = google_compute_global_address.lb_default.address
    }

    Konfigurasikan nama resource alamat IP Anda menjadi myservice-service-ip. Anda dapat mengubahnya ke nilai Anda sendiri. Alamat IP ini adalah alamat IPv4 anycast global yang dirutekan ke pusat data Google atau titik kehadiran yang terdekat dengan pengunjung Anda.

  2. Buat dan konfigurasikan layanan backend:

    resource "google_compute_backend_service" "lb_default" {
      provider              = google-beta
      name                  = "myservice-backend"
      load_balancing_scheme = "EXTERNAL_MANAGED"
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[0].id
      }
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[1].id
      }
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api,
      ]
    }

    Resource ini mengonfigurasi layanan backend agar diberi nama myservice-backend. Anda dapat mengubahnya ke nilai Anda sendiri.

  3. Konfigurasikan peta URL:

    resource "google_compute_url_map" "lb_default" {
      provider        = google-beta
      name            = "myservice-lb-urlmap"
      default_service = google_compute_backend_service.lb_default.id
    
      path_matcher {
        name            = "allpaths"
        default_service = google_compute_backend_service.lb_default.id
        route_rules {
          priority = 1
          url_redirect {
            https_redirect         = true
            redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
          }
        }
      }
    }

    Hubungkan resource layanan backend (myservice-backend) ke resource peta URL baru (myservice-lb-urlmap). Anda dapat mengubahnya ke nilai Anda sendiri.

  4. Buat sertifikat TLS yang terkelola untuk domain Anda guna menyalurkan traffic HTTPS. Ganti example.com dengan nama domain Anda di resource google_compute_managed_ssl_certificate:

    resource "google_compute_managed_ssl_certificate" "lb_default" {
      provider = google-beta
      name     = "myservice-ssl-cert"
    
      managed {
        domains = ["example.com"]
      }
    }
  5. Konfigurasikan proxy HTTPS:

    resource "google_compute_target_https_proxy" "lb_default" {
      provider = google-beta
      name     = "myservice-https-proxy"
      url_map  = google_compute_url_map.lb_default.id
      ssl_certificates = [
        google_compute_managed_ssl_certificate.lb_default.name
      ]
      depends_on = [
        google_compute_managed_ssl_certificate.lb_default
      ]
    }

    Buat resource google_compute_target_https_proxy dengan nama target myservice-https-proxy dan hubungkan sertifikat TLS (myservice-ssl-cert) dan resource pemetaan URL (myservice-lb-urlmap) yang dibuat sebelumnya. Anda dapat mengubahnya ke nilai Anda sendiri.

  6. Konfigurasikan aturan penerusan:

    resource "google_compute_global_forwarding_rule" "lb_default" {
      provider              = google-beta
      name                  = "myservice-lb-fr"
      load_balancing_scheme = "EXTERNAL_MANAGED"
      target                = google_compute_target_https_proxy.lb_default.id
      ip_address            = google_compute_global_address.lb_default.id
      port_range            = "443"
      depends_on            = [google_compute_target_https_proxy.lb_default]
    }

    Buat resource google_compute_global_forwarding_rule dengan nama target myservice-https-proxy dan hubungkan target proxy HTTPS (myservice-https-proxy) dan resource Alamat IP (myservice-service-ip) yang dibuat sebelumnya. Anda dapat mengubahnya ke nilai Anda sendiri.

  7. Terapkan konfigurasi ini:

    Untuk menerapkan konfigurasi Terraform di project Google Cloud, selesaikan langkah-langkah di bagian berikut.

    Menyiapkan Cloud Shell

    1. Luncurkan Cloud Shell.
    2. Tetapkan project Google Cloud default tempat Anda ingin menerapkan konfigurasi Terraform.

      Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Variabel lingkungan akan diganti jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

    Menyiapkan direktori

    Setiap file konfigurasi Terraform harus memiliki direktorinya sendiri (juga disebut modul root).

    1. Di Cloud Shell, buat direktori dan file baru di dalam direktori tersebut. Nama file harus memiliki ekstensi .tf—misalnya main.tf. Dalam tutorial ini, file ini disebut sebagai main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Jika mengikuti tutorial, Anda dapat menyalin kode contoh di setiap bagian atau langkah.

      Salin kode contoh ke dalam main.tf yang baru dibuat.

      Atau, salin kode dari GitHub. Tindakan ini direkomendasikan jika cuplikan Terraform adalah bagian dari solusi menyeluruh.

    3. Tinjau dan ubah contoh parameter untuk diterapkan pada lingkungan Anda.
    4. Simpan perubahan Anda.
    5. Lakukan inisialisasi Terraform. Anda hanya perlu melakukan ini sekali per direktori.
      terraform init

      Secara opsional, untuk menggunakan versi penyedia Google terbaru, sertakan opsi -upgrade:

      terraform init -upgrade

    Menerapkan perubahan

    1. Tinjau konfigurasi dan pastikan bahwa resource yang dibuat atau diperbarui oleh Terraform sesuai dengan ekspektasi Anda:
      terraform plan

      Koreksi konfigurasi jika diperlukan.

    2. Terapkan konfigurasi Terraform dengan menjalankan perintah berikut dan memasukkan yes pada perintah:
      terraform apply

      Tunggu hingga Terraform menampilkan pesan "Apply complete!".

    3. Buka project Google Cloud Anda untuk melihat hasilnya. Di Konsol Google Cloud, buka resource Anda di UI untuk memastikan bahwa Terraform telah membuat atau mengupdatenya.

Men-deploy ke beberapa region

Deploy Layanan Anda ke region Cloud Run yang tersedia. Untuk memudahkan pengelolaan, Anda dapat menggunakan nama layanan yang sama di beberapa region.

Command line

  1. Pilih region tempat Anda ingin menyediakan layanan.
  2. Deploy layanan Cloud Run Anda ke setiap region.
  3. gcloud run deploy SERVICE_NAME \
    --allow-unauthenticated \
    --image=IMAGE_URL \
    --region=REGION

    Ganti variabel berikut:

    • REGION dengan salah satu region tempat Anda ingin men-deploy.
    • SERVICE_NAME dengan nama layanan Anda. Menggunakan nama layanan yang sama di beberapa region akan mempermudah pelacakan deployment multi-region Anda.
    • IMAGE_URL dengan referensi ke image container, contohnya, us-docker.pkg.dev/cloudrun/container/hello:latest. Jika Anda menggunakan Artifact Registry, repositori REPO_NAME harus sudah dibuat. URL berbentuk LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  4. Ulangi langkah sebelumnya untuk setiap wilayah.

Terraform

Konfigurasikan layanan untuk setiap region yang ditentukan dalam variabel run_regions.

resource "google_cloud_run_v2_service" "run_default" {
  provider = google-beta
  count    = length(local.run_regions)
  name     = "myservice-run-app-${local.run_regions[count.index]}"
  location = local.run_regions[count.index]

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.run_api
  ]
}

Melakukan loop pada semua region yang ditentukan dalam variabel run_regions dan memberi nama setiap layanan baru seperti berikut: myservice-run-app-${var.run_regions[count.index]}. Penetapan lokasi layanan juga diterapkan. Ganti image default us-docker.pkg.dev/cloudrun/container/hello" dengan image Anda sendiri.

Lokasi Cloud Run

Cloud Run bersifat regional, berarti infrastruktur yang menjalankan layanan Cloud Run Anda terletak di region tertentu dan dikelola oleh Google agar tersedia secara redundan di semua zona dalam region tersebut.

Memenuhi persyaratan latensi, ketersediaan, atau ketahanan adalah faktor utama untuk memilih region tempat layanan Cloud Run dijalankan. Pada umumnya, Anda dapat memilih region yang paling dekat dengan pengguna Anda, tetapi Anda harus mempertimbangkan lokasi dari produk Google Cloud lain yang digunakan oleh layanan Cloud Run Anda. Menggunakan produk Google Cloud secara bersamaan di beberapa lokasi dapat memengaruhi latensi serta biaya layanan Anda.

Cloud Run tersedia di region berikut:

Tergantung harga Tingkat 1

  • asia-east1 (Taiwan)
  • asia-northeast1 (Tokyo)
  • asia-northeast2 (Osaka)
  • europe-north1 (Finlandia) ikon daun Rendah CO2
  • europe-southwest1 (Madrid)
  • europe-west1 (Belgia) ikon daun Rendah CO2
  • europe-west4 (Belanda)
  • europe-west8 (Milan)
  • europe-west9 (Paris) ikon daun Rendah CO2
  • me-west1 (Tel Aviv)
  • us-central1 (Iowa) ikon daun Rendah CO2
  • us-east1 (South Carolina)
  • us-east4 (North Virginia)
  • us-east5 (Columbus)
  • us-south1 (Dallas)
  • us-west1 (Oregon) ikon daun Rendah CO2

Tergantung harga Tingkat 2

  • africa-south1 (Johannesburg)
  • asia-east2 (Hong Kong)
  • asia-northeast3 (Seoul, Korea Selatan)
  • asia-southeast1 (Singapura)
  • asia-southeast2 (Jakarta)
  • asia-south1 (Mumbai, India)
  • asia-south2 (Delhi, India)
  • australia-southeast1 (Sydney)
  • australia-southeast2 (Melbourne)
  • europe-central2 (Warsawa, Polandia)
  • europe-west10 (Berlin)
  • europe-west12 (Turin)
  • europe-west2 (London, Inggris) ikon daun Rendah CO2
  • europe-west3 (Frankfurt, Jerman) ikon daun Rendah CO2
  • europe-west6 (Zurich, Swiss) ikon daun Rendah CO2
  • me-central1 (Doha)
  • me-central2 (Damam)
  • northamerica-northeast1 (Montreal) ikon daun Rendah CO2
  • northamerica-northeast2 (Toronto) ikon daun Rendah CO2
  • southamerica-east1 (Sao Paulo, Brasil) ikon daun Rendah CO2
  • southamerica-west1 (Santiago, Cile) ikon daun Rendah CO2
  • us-west2 (Los Angeles)
  • us-west3 (Salt Lake City)
  • us-west4 (Las Vegas)

Jika sudah membuat layanan Cloud Run, Anda dapat melihat region di dasbor Cloud Run di Konsol Google Cloud.

Mengonfigurasi grup endpoint jaringan regional

Untuk setiap region tempat Anda men-deploy di langkah sebelumnya, Anda harus membuat grup endpoint jaringan tanpa server (NEG) dan menambahkannya ke layanan backend, menggunakan petunjuk berikut:

Command line

  1. Buat grup endpoint jaringan untuk layanan Cloud Run di REGION:

    gcloud compute network-endpoint-groups create NEG_NAME \
                --region=REGION \
                --network-endpoint-type=SERVERLESS \
                --cloud-run-service=SERVICE_NAME

    Pada perintah di atas, ganti:

    • NEG_NAME dengan nama resource grup endpoint jaringan. (contohnya `myservice-neg-uscentral1`)
    • REGION dengan [region][loc] tempat layanan Anda di-deploy.
    • SERVICE_NAME dengan nama layanan Anda.
  2. Tambahkan grup endpoint jaringan ke layanan backend:

    gcloud compute backend-services add-backend --global BACKEND_NAME \
              --network-endpoint-group-region=REGION \
              --network-endpoint-group=NEG_NAME

    Tentukan NEG_NAME yang telah Anda buat di langkah sebelumnya untuk region.

  3. Ulangi langkah-langkah di atas untuk setiap region.

Terraform

  1. Konfigurasikan grup endpoint jaringan dengan nama myservice-neg untuk layanan Cloud Run bagi setiap region yang ditentukan dalam variabel run_regions:

    resource "google_compute_region_network_endpoint_group" "lb_default" {
      provider              = google-beta
      count                 = length(local.run_regions)
      name                  = "myservice-neg"
      network_endpoint_type = "SERVERLESS"
      region                = local.run_regions[count.index]
      cloud_run {
        service = google_cloud_run_v2_service.run_default[count.index].name
      }
    }
  2. Konfigurasikan layanan backend untuk menyertakan grup endpoint jaringan (myservice-neg):

    resource "google_compute_backend_service" "lb_default" {
      provider              = google-beta
      name                  = "myservice-backend"
      load_balancing_scheme = "EXTERNAL_MANAGED"
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[0].id
      }
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[1].id
      }
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api,
      ]
    }

Mengonfigurasi data DNS di domain Anda

Untuk mengarahkan nama domain Anda ke aturan penerusan yang Anda buat, Anda harus memperbarui data DNS-nya dengan alamat IP yang Anda buat.

  1. Temukan alamat IP yang dicadangkan dari load balancer dengan menjalankan:

      gcloud compute addresses describe --global SERVICE_IP --format='value(address)'

    Ganti SERVICE_IP dengan nama alamat IP yang Anda buat sebelumnya. Perintah ini akan mencetak alamat IP ke output.

  2. Update data DNS domain Anda dengan menambahkan kumpulan data A menggunakan alamat IP ini.

Mengonfigurasi audiens kustom jika menggunakan layanan terautentikasi

Layanan terautentikasi dilindungi oleh IAM. Layanan Cloud Run tersebut memerlukan autentikasi klien yang mendeklarasikan penerima permintaan yang dituju pada waktu pembuatan kredensial (audiens).

Audiens biasanya merupakan URL lengkap layanan target, yang secara default bagi layanan Cloud Run adalah URL yang dihasilkan dengan akhiran run.app. Namun, dalam deployment multi-region, klien tidak dapat mengetahui terlebih dahulu ke layanan regional mana permintaan akan dirutekan. Jadi, untuk deployment multi-region, konfigurasikan layanan Anda untuk menggunakan audiens kustom.

Menunggu load balancer tersedia

Setelah mengonfigurasi domain dengan alamat IP load balancer, Anda harus menunggu beberapa saat agar data DNS diterapkan. Demikian pula, Anda perlu menunggu beberapa saat hingga sertifikat TLS yang terkelola diterbitkan untuk domain Anda dan siap untuk mulai menyalurkan traffic HTTPS secara global.

Mungkin perlu waktu hingga 30 menit agar load balancer mulai menyalurkan traffic.

Setelah siap, buka URL situs Anda dengan awalan https:// untuk mencobanya.

Verifikasi status

  1. Untuk memeriksa status penerapan data DNS, menggunakan aplikasi utilitas command line dig:

    dig A +short example.com

    Output akan menampilkan alamat IP yang Anda konfigurasikan di data DNS Anda.

  2. Periksa status penerbitan sertifikat Anda yang terkelola, jalankan:

    gcloud compute ssl-certificates describe CERT_NAME

    Ganti CERT_NAME dengan nama yang telah Anda pilih sebelumnya untuk resource sertifikat SSL.

    Output akan menampilkan baris yang berisi status: ACTIVE.

Menyiapkan pengalihan HTTP-ke-HTTPS

Secara default, aturan penerusan hanya menangani satu protokol, sehingga permintaan ke endpoint http:// Anda akan merespons dengan pesan 404 Not Found. Jika Anda memerlukan permintaan ke URL http:// Anda agar dialihkan ke protokol https://, Anda harus membuat peta URL tambahan dan aturan penerusan dengan menggunakan petunjuk berikut:

Command line

  1. Buat peta URL dengan aturan pengalihan.

    gcloud compute url-maps import HTTP_URLMAP_NAME \
              --global \
              --source /dev/stdin <<EOF
            name: HTTP_URLMAP_NAME
            defaultUrlRedirect:
              redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
              httpsRedirect: True
            EOF

    Ganti HTTP_URLMAP_NAME dengan nama resource peta URL yang akan Anda buat (contohnya myservice-httpredirect).

  2. Buat proxy HTTP target dengan peta URL.

    gcloud compute target-http-proxies create HTTP_PROXY_NAME \
              --url-map=HTTP_URLMAP_NAME

    Ganti HTTP_PROXY_NAME dengan nama proxy HTTP target yang akan Anda buat (contohnya myservice-http).

  3. Buat aturan penerusan di port 80 dengan alamat IP yang dicadangkan yang sama.

    gcloud compute forwarding-rules create --global HTTP_FORWARDING_RULE_NAME \
              --target-http-proxy=HTTP_PROXY_NAME \
              --address=SERVICE_IP \
              --ports=80 \
            

    Ganti HTTP_FORWARDING_RULE_NAME dengan nama aturan penerusan baru yang akan Anda buat (contohnya myservice-httplb).

Terraform

  1. Buat resource peta URL dengan aturan pengalihan:

    resource "google_compute_url_map" "https_default" {
      provider = google-beta
      name     = "myservice-https-urlmap"
    
      default_url_redirect {
        redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
        https_redirect         = true
        strip_query            = false
      }
    }
  2. Buaa proxy HTTP target dengan resource peta URL yang baru dibuat (myservice-https-urlmap):

    resource "google_compute_target_http_proxy" "https_default" {
      provider = google-beta
      name     = "myservice-http-proxy"
      url_map  = google_compute_url_map.https_default.id
    
      depends_on = [
        google_compute_url_map.https_default
      ]
    }
  3. Buat aturan penerusan di port 80 dengan resource alamat IP yang dicadangkan yang sama (myservice-http-proxy):

    resource "google_compute_global_forwarding_rule" "https_default" {
      provider   = google-beta
      name       = "myservice-https-fr"
      target     = google_compute_target_http_proxy.https_default.id
      ip_address = google_compute_global_address.lb_default.id
      port_range = "80"
      depends_on = [google_compute_target_http_proxy.https_default]
    }

Menggunakan langganan push Pub/Sub terautentikasi dengan deployment multi-region

Layanan Pub/Sub secara default mengirimkan pesan ke endpoint push di region Google Cloud yang sama tempat layanan Pub/Sub menyimpan pesan. Untuk solusi atas perilaku ini, lihat Menggunakan langganan push Pub/Sub yang terautentikasi dengan deployment Cloud Run multi-region.