Tutorial Pub/Sub Terraform


Tutorial ini menunjukkan cara menerapkan fungsi Pub/Sub dengan mengupload file zip kode sumber fungsi ke bucket Cloud Storage, menggunakan Terraform untuk menyediakan resource. Terraform adalah alat open source yang dapat Anda gunakan untuk menyediakan resource Google Cloud dengan file konfigurasi deklaratif

Tutorial ini menggunakan fungsi Node.js sebagai contoh, tetapi juga dapat digunakan dengan fungsi Python, Go, dan Java. Petunjuknya sama, terlepas dari runtime mana yang Anda gunakan. Lihat halaman referensi Hashicorp untuk mengetahui detail tentang cara menggunakan Terraform dengan Cloud Functions v2 API.

Tujuan

  • Pelajari cara menggunakan Terraform untuk men-deploy fungsi Pub/Sub.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

For details, see Cloud Run functions pricing.

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  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. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

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

  4. Aktifkan API Cloud Functions, Cloud Build, Artifact Registry, and Cloud Storage.

    Mengaktifkan API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

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

  9. Aktifkan API Cloud Functions, Cloud Build, Artifact Registry, and Cloud Storage.

    Mengaktifkan API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Jika Anda sudah menginstal gcloud CLI, update dengan menjalankan perintah berikut:

    gcloud components update
  13. Berikan roles/run.invoker dan roles/cloudbuild.builds.builder ke akun layanan komputasi default.
  14. Menyiapkan lingkungan pengembangan.

    Buka panduan penyiapan Node.js

Menyiapkan lingkungan Anda

Dalam tutorial ini, Anda akan menjalankan perintah di Cloud Shell. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, termasuk Google Cloud CLI, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Cloud Shell dapat memerlukan waktu beberapa menit untuk proses inisialisasi:

Buka Cloud Shell

Menyiapkan aplikasi

Di Cloud Shell, lakukan langkah-langkah berikut:

  1. Clone repositori aplikasi contoh ke instance Cloud Shell Anda:

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
  2. Ubah ke direktori yang berisi kode contoh fungsi Cloud Run:

    cd nodejs-docs-samples/functions/v2/helloPubSub/

    Contoh Node.js yang digunakan dalam tutorial ini adalah fungsi Pub/Sub "Halo Dunia" dasar.

  3. Buat file zip yang berisi kode sumber fungsi yang akan diupload Terraform ke bucket Cloud Storage:

    zip -r function-source.zip .

    Perhatikan bahwa root file zip harus menjadi direktori utama kode sumber fungsi Anda, sehingga perintah di atas menyertakan file dalam direktori helloworld, tetapi tidak menyertakan direktori itu sendiri.

Membuat file main.tf

  1. Di direktori nodejs-docs-samples/functions/, buat file main.tf untuk konfigurasi Terraform:

    touch main.tf
    
  2. Salin konfigurasi Terraform ini ke dalam file main.tf Anda:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = ">= 4.34.0"
        }
      }
    }
    
    resource "random_id" "bucket_prefix" {
      byte_length = 8
    }
    
    
    resource "google_service_account" "default" {
      account_id   = "test-gcf-sa"
      display_name = "Test Service Account"
    }
    
    resource "google_pubsub_topic" "default" {
      name = "functions2-topic"
    }
    
    resource "google_storage_bucket" "default" {
      name                        = "${random_id.bucket_prefix.hex}-gcf-source" # Every bucket name must be globally unique
      location                    = "US"
      uniform_bucket_level_access = true
    }
    
    data "archive_file" "default" {
      type        = "zip"
      output_path = "/tmp/function-source.zip"
      source_dir  = "function-source/"
    }
    
    resource "google_storage_bucket_object" "default" {
      name   = "function-source.zip"
      bucket = google_storage_bucket.default.name
      source = data.archive_file.default.output_path # Path to the zipped function source code
    }
    
    resource "google_cloudfunctions2_function" "default" {
      name        = "function"
      location    = "us-central1"
      description = "a new function"
    
      build_config {
        runtime     = "nodejs16"
        entry_point = "helloPubSub" # Set the entry point
        environment_variables = {
          BUILD_CONFIG_TEST = "build_test"
        }
        source {
          storage_source {
            bucket = google_storage_bucket.default.name
            object = google_storage_bucket_object.default.name
          }
        }
      }
    
      service_config {
        max_instance_count = 3
        min_instance_count = 1
        available_memory   = "256M"
        timeout_seconds    = 60
        environment_variables = {
          SERVICE_CONFIG_TEST = "config_test"
        }
        ingress_settings               = "ALLOW_INTERNAL_ONLY"
        all_traffic_on_latest_revision = true
        service_account_email          = google_service_account.default.email
      }
    
      event_trigger {
        trigger_region = "us-central1"
        event_type     = "google.cloud.pubsub.topic.v1.messagePublished"
        pubsub_topic   = google_pubsub_topic.default.id
        retry_policy   = "RETRY_POLICY_RETRY"
      }
    }
  3. Edit file main.tf untuk memastikannya memiliki nilai yang benar untuk item berikut. Anda perlu mengedit file ini setiap kali konfigurasi berubah (misalnya, untuk menggunakan runtime yang berbeda atau men-deploy fungsi yang berbeda):

    • Runtime: Dalam contoh ini, runtime-nya adalah nodejs16.
    • Titik entri fungsi: Dalam contoh ini, titik masuk fungsi adalah helloPubSub.
    • Jalur ke file zip: Dalam contoh ini, jika Anda menempatkan file main.tf di direktori nodejs-docs-samples/functions/ seperti yang dijelaskan di atas, jalurnya adalah ./v2/helloPubSub/function-source.zip.

Lakukan inisialisasi Terraform

  1. Di Cloud Shell, jalankan perintah berikut untuk melakukan inisialisasi Terraform:

    docker run -v $(pwd):/app -w /app hashicorp/terraform:0.12.0 init
    

    Anda menggunakan image Docker Terraform publik. Docker sudah terinstal di Cloud Shell. Direktori kerja saat ini dipasang sebagai volume sehingga container Docker dapat membaca file konfigurasi Terraform.

  2. Jalankan perintah ini untuk menambahkan plugin yang diperlukan dan membuat direktori .terraform:

    terraform init
    

Memvalidasi konfigurasi Terraform

Lihat pratinjau konfigurasi Terraform. Langkah ini bersifat opsional, tetapi memungkinkan Anda memverifikasi bahwa sintaksis main.tf sudah benar. Perintah ini menampilkan pratinjau resource yang akan dibuat:

terraform plan

Menerapkan konfigurasi Terraform

Deploy fungsi dengan menerapkan konfigurasi. Saat diminta, masukkan yes.

terraform apply

Memicu fungsi

Untuk menguji fungsi Pub/Sub:

  1. Memublikasikan pesan ke topik (dalam contoh ini, nama topiknya adalah functions2-topic):

    gcloud pubsub topics publish TOPIC_NAME --message="Friend"
  2. Baca log fungsi untuk melihat hasilnya, dengan FUNCTION_NAME adalah nama fungsi Anda (dalam contoh ini, nama fungsi hanya function):

    gcloud beta functions logs read FUNCTION_NAME --gen2

    Anda akan melihat output logging yang menyertakan pesan "Teman" baru.

Pembersihan

Setelah menyelesaikan tutorial, Anda dapat menghapus semua yang telah dibuat sehingga tidak menimbulkan biaya lebih lanjut.

Terraform memungkinkan Anda menghapus semua resource yang ditentukan dalam file konfigurasi dengan menjalankan perintah terraform destroy:

terraform destroy

Masukkan yes untuk mengizinkan Terraform menghapus resource Anda.