Tutorial Terraform (generasi ke-2)


Tutorial ini menunjukkan cara men-deploy fungsi HTTP 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 HTTP Node.js sebagai contoh, tetapi juga dapat digunakan dengan fungsi HTTP Python, Go, dan Java. Petunjuknya tetap sama, apa pun runtime yang Anda gunakan.

Tujuan

  • Pelajari cara menggunakan Terraform untuk men-deploy fungsi HTTP.

Biaya

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

Untuk detailnya, lihat Harga Cloud Functions.

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. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

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

    Mengaktifkan API

  5. Menginstal Google Cloud CLI.
  6. Untuk initialize gcloud CLI, jalankan perintah berikut:

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

    Buka pemilih project

  8. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

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

    Mengaktifkan API

  10. Menginstal Google Cloud CLI.
  11. Untuk initialize gcloud CLI, jalankan perintah berikut:

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

    gcloud components update
  13. 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 memuat kode contoh Cloud Functions:

    cd nodejs-docs-samples/functions/helloworld/helloworldHttp

    Contoh Node.js yang digunakan dalam tutorial ini adalah fungsi HTTP "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 helloworldHttp, 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" "default" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name                        = "${random_id.default.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  = "functions/hello-world/"
    }
    resource "google_storage_bucket_object" "object" {
      name   = "function-source.zip"
      bucket = google_storage_bucket.default.name
      source = data.archive_file.default.output_path # Add path to the zipped function source code
    }
    
    resource "google_cloudfunctions2_function" "default" {
      name        = "function-v2"
      location    = "us-central1"
      description = "a new function"
    
      build_config {
        runtime     = "nodejs16"
        entry_point = "helloHttp" # Set the entry point
        source {
          storage_source {
            bucket = google_storage_bucket.default.name
            object = google_storage_bucket_object.object.name
          }
        }
      }
    
      service_config {
        max_instance_count = 1
        available_memory   = "256M"
        timeout_seconds    = 60
      }
    }
    
    resource "google_cloud_run_service_iam_member" "member" {
      location = google_cloudfunctions2_function.default.location
      service  = google_cloudfunctions2_function.default.name
      role     = "roles/run.invoker"
      member   = "allUsers"
    }
    
    output "function_uri" {
      value = google_cloudfunctions2_function.default.service_config[0].uri
    }
  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 helloHttp.
    • 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 ./helloworld/helloworldHttp/function-source.zip.

Lakukan inisialisasi Terraform

Dalam direktori nodejs-docs-samples/functions/ yang berisi file main.tf, jalankan perintah ini untuk menambahkan plugin yang diperlukan dan membuat direktori .terraform:

terraform init

Menerapkan konfigurasi Terraform

Dalam direktori nodejs-docs-samples/functions/ yang berisi file main.tf Anda, deploy fungsi dengan menerapkan konfigurasi. Saat diminta, masukkan yes:

terraform apply

Menguji fungsi

  1. Setelah fungsi selesai di-deploy, catat properti URI atau temukan menggunakan perintah berikut:

    gcloud functions describe function-v2 --gen2 --region=us-central1 --format="value(serviceConfig.uri)"
    
  2. Buat permintaan ke URL ini untuk melihat pesan "Halo Dunia" dari fungsi Anda. Perhatikan bahwa fungsi yang di-deploy memerlukan autentikasi. Oleh karena itu, Anda harus memberikan kredensial dalam permintaan Anda:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" YOUR_FUNCTION_URL

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 di direktori nodejs-docs-samples/functions/ yang berisi file main.tf Anda:

terraform destroy

Masukkan yes untuk mengizinkan Terraform menghapus resource Anda.