Tutorial menggunakan Workflows dengan Cloud Run dan fungsi Cloud Run

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.

Men-deploy 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-function \
        --gen2 \
        --runtime python310 \
        --entry-point=randomgen \
        --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.

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

    gcloud functions describe randomgen-function \
        --gen2 \
        --format="value(serviceConfig.uri)"
  6. Simpan URL. Anda harus menambahkannya ke file sumber Alur Kerja Anda di latihan selanjutnya.

  7. Anda dapat mencoba fungsi ini dengan perintah curl berikut:

    curl $(gcloud functions describe randomgen-function \
        --gen2 \
        --format="value(serviceConfig.uri)")

    Angka dibuat secara acak dan ditampilkan.

Men-deploy 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. Kembali ke direktori utama Anda:

    cd ~
  2. Buat direktori bernama multiply lalu ubah ke direktori tersebut:

    mkdir ~/multiply
    cd ~/multiply
  3. 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)
  4. 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
  5. Deploy fungsi dengan pemicu HTTP, dan izinkan akses yang tidak diautentikasi:

    gcloud functions deploy multiply-function \
        --gen2 \
        --runtime python310 \
        --entry-point=multiply \
        --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.

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

    gcloud functions describe multiply-function \
        --gen2\
        --format="value(serviceConfig.uri)"
  7. Simpan URL. Anda harus menambahkannya ke file sumber Alur Kerja Anda di latihan selanjutnya.

  8. Anda dapat mencoba fungsi ini dengan perintah curl berikut:

    curl -X POST MULTIPLY_FUNCTION_URL \
        -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
        -H "Content-Type: application/json" \
        -d '{"input": 5}'

    Angka 10 harus ditampilkan.

Menghubungkan dua 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: RANDOMGEN_FUNCTION_URL
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: MULTIPLY_FUNCTION_URL
            body:
                input: ${randomgen_result.body.random}
        result: multiply_result
    - return_result:
        return: ${multiply_result}
    

    File sumber ini menautkan dua 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 \
        --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com

    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: RANDOMGEN_FUNCTION_URL
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: MULTIPLY_FUNCTION_URL
            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 fungsi Cloud Run, dan menampilkan hasil akhir.

  2. Deploy alur kerja yang diubah:

    gcloud workflows deploy WORKFLOW_NAME \
        --source=workflow.yaml \
        --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com

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 \
        --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. Kembali ke direktori utama Anda:

    cd ~
  2. Edit file sumber untuk alur kerja Anda dan ganti dengan konten berikut:

    - randomgen_function:
        call: http.get
        args:
            url: RANDOMGEN_FUNCTION_URL
        result: randomgen_result
    - multiply_function:
        call: http.post
        args:
            url: MULTIPLY_FUNCTION_URL
            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 RANDOMGEN_FUNCTION_URL dengan URL fungsi randomgen Anda.
    • Ganti MULTIPLY_FUNCTION_URL dengan URL fungsi multiply Anda.
    • 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.

  3. Deploy alur kerja yang diubah:

    gcloud workflows deploy WORKFLOW_NAME \
        --source=workflow.yaml \
        --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
  4. Jalankan alur kerja akhir:

    gcloud workflows run WORKFLOW_NAME

    Output akan terlihat seperti berikut:

    result: '{"floorResult":{"body":"4","code":200
      ...
      "logResult":{"body":"4.02535169073515","code":200
      ...
      "multiplyResult":{"body":{"multiplied":56},"code":200
      ...
      "randomResult":{"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.