Tutorial Workflows (generasi ke-1)


Tutorial ini menunjukkan cara menggunakan Workflows untuk menautkan serangkaian layanan bersama-sama. Dengan menghubungkan dua layanan HTTP publik (menggunakan fungsi Cloud Run), REST API eksternal, dan layanan Cloud Run pribadi, Anda dapat membuat aplikasi serverless yang fleksibel.

Tujuan

Dalam tutorial ini, Anda menggunakan Google Cloud CLI untuk membuat satu alur kerja yang menghubungkan satu layanan dalam satu waktu:

  1. Deploy dua layanan fungsi Cloud Run: fungsi pertama menghasilkan angka acak, lalu meneruskan angka tersebut ke fungsi kedua yang mengalikannya.
  2. Dengan menggunakan Workflows, hubungkan kedua fungsi HTTP. Menjalankan alur kerja dan menampilkan hasil yang kemudian diteruskan ke API eksternal.
  3. Dengan menggunakan Workflows, hubungkan API HTTP eksternal yang menampilkan log untuk nomor tertentu. Jalankan alur kerja dan tampilkan hasil yang kemudian diteruskan ke layanan Cloud Run.
  4. Deploy layanan Cloud Run yang hanya mengizinkan akses terautentikasi. Layanan menampilkan math.floor untuk nomor tertentu.
  5. Dengan menggunakan Workflows, hubungkan layanan Cloud Run, jalankan seluruh alur kerja, dan tampilkan hasil akhir.

Diagram berikut menunjukkan ringkasan proses serta visualisasi alur kerja akhir:

Visualisasi Workflows

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

Batasan keamanan yang ditentukan oleh organisasi mungkin mencegah Anda menyelesaikan langkah-langkah berikut. Untuk mengetahui informasi pemecahan masalah, lihat Mengembangkan aplikasi di lingkungan yang terbatas 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. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  4. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  5. 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.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com
  8. Install the Google Cloud CLI.

  9. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  10. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  11. 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.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com
  14. Update komponen Google Cloud CLI:
    gcloud components update
  15. Jika menjalankan perintah di dalam Cloud Shell, berarti Anda sudah diautentikasi dengan gcloud CLI; jika tidak, login dengan akun Anda:
    gcloud auth login
  16. Buat akun layanan untuk Workflows yang akan digunakan:

    export SERVICE_ACCOUNT=workflows-sa
    gcloud iam service-accounts create ${SERVICE_ACCOUNT}

  17. Untuk mengizinkan akun layanan memanggil layanan Cloud Run yang diautentikasi, berikan peran run.invoker ke akun layanan Workflows:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \
        --role "roles/run.invoker"

    Ganti PROJECT_ID dengan Google Cloud project ID Anda.

  18. Setel lokasi default yang digunakan dalam tutorial ini:
    gcloud config set project PROJECT_ID
    export REGION=REGION
    gcloud config set functions/region ${REGION}
    gcloud config set run/region ${REGION}
    gcloud config set workflows/location ${REGION}

    Ganti REGION dengan lokasi Workflows yang didukung pilihan Anda.

  19. Men-deploy layanan fungsi Cloud Run pertama

    Setelah menerima permintaan HTTP, fungsi HTTP ini menghasilkan angka acak antara 1 dan 100, lalu menampilkan angka dalam format JSON.

    1. Buat direktori bernama randomgen lalu ubah ke direktori tersebut:

      mkdir ~/randomgen
      cd ~/randomgen
    2. Buat file teks dengan nama file main.py yang berisi kode Python berikut:

      import functions_framework
      import random
      from flask import jsonify
      
      
      @functions_framework.http
      def randomgen(request):
          randomNum = random.randint(1, 100)
          output = {"random": randomNum}
          return jsonify(output)
    3. Agar dapat mendukung dependensi pada Flask untuk pemrosesan HTTP, buat file teks untuk pengelola paket pip. Berikan nama file requirements.txt dan tambahkan hal berikut:

      flask>=1.0.2
      functions-framework==3.0.0
    4. Deploy fungsi dengan pemicu HTTP, dan izinkan akses yang tidak diautentikasi:

      gcloud functions deploy randomgen \
          --runtime python37 \
          --trigger-http \
          --allow-unauthenticated

    Fungsi mungkin memerlukan waktu beberapa menit untuk di-deploy. Atau, Anda dapat menggunakan antarmuka fungsi Cloud Run di konsol Google Cloud untuk men-deploy fungsi tersebut.

    1. Setelah fungsi di-deploy, Anda dapat mengonfirmasi properti httpsTrigger.url:

      gcloud functions describe randomgen
    2. Anda dapat mencoba fungsi ini dengan perintah curl berikut:

      curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')

      Angka dibuat secara acak dan ditampilkan.

    Men-deploy layanan fungsi Cloud Run kedua

    Setelah menerima permintaan HTTP, fungsi HTTP ini akan mengekstrak input dari isi JSON, mengalikannya dengan 2, dan menampilkan hasilnya dalam format JSON.

    1. Buat direktori bernama multiply lalu ubah ke direktori tersebut:

      mkdir ~/multiply
      cd ~/multiply
    2. Buat file teks dengan nama file main.py yang berisi kode Python berikut:

      import functions_framework
      from flask import jsonify
      
      
      @functions_framework.http
      def multiply(request):
          request_json = request.get_json()
          output = {"multiplied": 2 * request_json['input']}
          return jsonify(output)
    3. Agar dapat mendukung dependensi pada Flask untuk pemrosesan HTTP, buat file teks untuk pengelola paket pip. Berikan nama file requirements.txt dan tambahkan hal berikut:

      flask>=1.0.2
      functions-framework==3.0.0
    4. Deploy fungsi dengan pemicu HTTP, dan izinkan akses yang tidak diautentikasi:

      gcloud functions deploy multiply \
          --runtime python37 \
          --trigger-http \
          --allow-unauthenticated

    Fungsi ini mungkin memerlukan waktu beberapa menit untuk di-deploy.Atau, Anda dapat menggunakan antarmuka fungsi Cloud Run di konsol Google Cloud untuk men-deploy fungsi tersebut.

    1. Setelah fungsi di-deploy, Anda dapat mengonfirmasi properti httpsTrigger.url:

      gcloud functions describe multiply
    2. Anda dapat mencoba fungsi ini dengan perintah curl berikut:

      curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \
          -X POST \
          -H "content-type: application/json" \
          -d '{"input": 5}'

      Angka 10 harus ditampilkan.

    Menghubungkan dua layanan fungsi Cloud Run dalam alur kerja

    Alur kerja terdiri dari serangkaian langkah yang dijelaskan menggunakan sintaksis Workflows, yang dapat ditulis dalam format YAML atau JSON. Ini adalah definisi alur kerja. Untuk penjelasan mendetail, lihat halaman Referensi sintaksis.

    1. Kembali ke direktori utama Anda:

      cd ~
    2. Buat file teks dengan nama file workflow.yaml yang berisi konten berikut:

      - randomgen_function:
          call: http.get
          args:
              url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen
          result: randomgen_result
      - multiply_function:
          call: http.post
          args:
              url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply
              body:
                  input: ${randomgen_result.body.random}
          result: multiply_result
      - return_result:
          return: ${multiply_result}
      

      Ini menautkan kedua fungsi HTTP bersama-sama dan menampilkan hasil akhir.

    3. Setelah membuat alur kerja, Anda dapat men-deploy alur kerja tersebut sehingga siap untuk dieksekusi.

      gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml

      Ganti WORKFLOW_NAME dengan nama untuk alur kerja Anda.

    4. Menjalankan alur kerja:

      gcloud workflows run WORKFLOW_NAME

      Eksekusi adalah satu eksekusi logika yang terkandung dalam definisi alur kerja. Semua eksekusi alur kerja bersifat independen, dan penskalaan Workflows yang cepat memungkinkan banyak eksekusi serentak.

      Setelah alur kerja dieksekusi, output-nya akan terlihat seperti berikut:

      result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\";
      ...
      startTime: '2021-05-05T14:17:39.135251700Z'
      state: SUCCEEDED
      ...
      

    Menghubungkan layanan REST publik dalam alur kerja

    Memperbarui alur kerja yang ada dan menghubungkan REST API publik (math.js) yang dapat mengevaluasi ekspresi matematika. Contoh, curl https://api.mathjs.org/v4/?'expr=log(56)'.

    Perlu diperhatikan bahwa karena telah men-deploy alur kerja, Anda juga dapat mengeditnya melalui halaman Workflows di konsol Google Cloud .

    1. Edit file sumber untuk alur kerja Anda dan ganti dengan konten berikut:

      - randomgen_function:
          call: http.get
          args:
              url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen
          result: randomgen_result
      - multiply_function:
          call: http.post
          args:
              url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply
              body:
                  input: ${randomgen_result.body.random}
          result: multiply_result
      - log_function:
          call: http.get
          args:
              url: https://api.mathjs.org/v4/
              query:
                  expr: ${"log(" + string(multiply_result.body.multiplied) + ")"}
          result: log_result
      - return_result:
          return: ${log_result}
      

      Tindakan ini akan menautkan layanan REST eksternal ke layanan fungsi Cloud Run, dan menampilkan hasil akhir.

    2. Deploy alur kerja yang diubah:

      gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml

    Men-deploy layanan Cloud Run

    Deploy layanan Cloud Run yang, setelah menerima permintaan HTTP, mengekstrak input dari isi JSON, menghitung math.floor-nya, dan menampilkan hasilnya.

    1. Buat direktori bernama floor lalu ubah ke direktori tersebut:

      mkdir ~/floor
      cd ~/floor
    2. Buat file teks dengan nama file app.py yang berisi kode Python berikut:

      import json
      import logging
      import os
      import math
      
      from flask import Flask, request
      
      app = Flask(__name__)
      
      
      @app.route('/', methods=['POST'])
      def handle_post():
          content = json.loads(request.data)
          input = float(content['input'])
          return f"{math.floor(input)}", 200
      
      
      if __name__ != '__main__':
          # Redirect Flask logs to Gunicorn logs
          gunicorn_logger = logging.getLogger('gunicorn.error')
          app.logger.handlers = gunicorn_logger.handlers
          app.logger.setLevel(gunicorn_logger.level)
          app.logger.info('Service started...')
      else:
          app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

    3. Dalam direktori yang sama, buat Dockerfile dengan konten berikut:

      # Use an official lightweight Python image.
      # https://hub.docker.com/_/python
      FROM python:3.7-slim
      
      # Install production dependencies.
      RUN pip install Flask gunicorn
      
      # Copy local code to the container image.
      WORKDIR /app
      COPY . .
      
      # Run the web service on container startup. Here we use the gunicorn
      # webserver, with one worker process and 8 threads.
      # For environments with multiple CPU cores, increase the number of workers
      # to be equal to the cores available.
      CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app

    4. Buat repositori standar Artifact Registry tempat Anda dapat menyimpan image container Docker:

      gcloud artifacts repositories create REPOSITORY \
          --repository-format=docker \
          --location=${REGION}

      Ganti REPOSITORY dengan nama unik untuk repositori.

    5. Build image container:

      export SERVICE_NAME=floor
      gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
    6. Deploy image container ke Cloud Run untuk memastikan bahwa image tersebut hanya menerima panggilan yang diautentikasi:

      gcloud run deploy ${SERVICE_NAME} \
          --image ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \
          --platform managed \
          --no-allow-unauthenticated

    Jika Anda melihat URL layanan, berarti deployment selesai. Anda harus menentukan URL tersebut saat memperbarui definisi alur kerja.

    Menghubungkan layanan Cloud Run dalam alur kerja

    Perbarui alur kerja yang ada dan tentukan URL untuk layanan Cloud Run.

    1. Edit file sumber untuk alur kerja Anda dan ganti dengan konten berikut:

      - randomgen_function:
          call: http.get
          args:
              url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen
          result: randomgen_result
      - multiply_function:
          call: http.post
          args:
              url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply
              body:
                  input: ${randomgen_result.body.random}
          result: multiply_result
      - log_function:
          call: http.get
          args:
              url: https://api.mathjs.org/v4/
              query:
                  expr: ${"log(" + string(multiply_result.body.multiplied) + ")"}
          result: log_result
      - floor_function:
          call: http.post
          args:
              url: CLOUD_RUN_SERVICE_URL
              auth:
                  type: OIDC
              body:
                  input: ${log_result.body}
          result: floor_result
      - create_output_map:
          assign:
            - outputMap:
                randomResult: ${randomgen_result}
                multiplyResult: ${multiply_result}
                logResult: ${log_result}
                floorResult: ${floor_result}
      - return_output:
          return: ${outputMap}
      

      Ganti CLOUD_RUN_SERVICE_URL dengan URL layanan Cloud Run Anda.

      Tindakan ini akan menghubungkan layanan Cloud Run dalam alur kerja. Perlu diperhatikan bahwa kunci auth memastikan bahwa token autentikasi diteruskan dalam panggilan ke layanan Cloud Run. Untuk mengetahui informasi selengkapnya, lihat Membuat permintaan yang diautentikasi dari alur kerja.

    2. Deploy alur kerja yang diubah:

      gcloud workflows deploy WORKFLOW_NAME \
          --source=workflow.yaml
    3. Jalankan alur kerja akhir:

      gcloud workflows run WORKFLOW_NAME

      Output akan terlihat seperti berikut:

      result: '{"Floor":{"body":"4","code":200
        ...
        "Log":{"body":"4.02535169073515","code":200
        ...
        "Multiply":{"body":{"multiplied":56},"code":200
        ...
        "Random":{"body":{"random":28},"code":200
        ...
      startTime: '2023-11-13T21:22:56.782669001Z'
      state: SUCCEEDED
      

    Selamat! Anda telah men-deploy dan menjalankan alur kerja yang menghubungkan serangkaian layanan secara bersamaan.

    Untuk membuat Workflows yang lebih kompleks menggunakan ekspresi, lompatan kondisional, encoding atau decoding Base64, subalur kerja, dan lainnya, lihat Referensi sintaksis Workflows dan Ringkasan library standar.

    Pembersihan

    Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan ingin mempertahankannya tanpa perubahan yang ditambahkan dalam tutorial ini, hapus resource yang dibuat untuk tutorial.

    Menghapus project

    Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

    Untuk menghapus project:

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Menghapus resource tutorial

    Langkah berikutnya