1. Pengantar
Anda dapat menggunakan Workflows untuk membuat alur kerja serverless yang menautkan serangkaian tugas serverless secara bersamaan sesuai urutan yang Anda tetapkan. Anda dapat menggabungkan kecanggihan API Google Cloud, produk serverless seperti Cloud Functions dan Cloud Run, serta panggilan ke API eksternal untuk membuat aplikasi serverless yang fleksibel.
Alur kerja tidak memerlukan pengelolaan infrastruktur dan dapat diskalakan secara lancar dengan permintaan, termasuk memperkecil skala hingga nol. Dengan model harga bayar per penggunaan, Anda hanya membayar waktu eksekusi.
Dalam codelab ini, Anda akan mempelajari cara menghubungkan berbagai layanan Google Cloud dan HTTP API eksternal dengan Workflows. Lebih spesifiknya, Anda akan menghubungkan dua layanan Cloud Functions publik, yaitu satu layanan Cloud Run pribadi dan satu HTTP API publik eksternal ke dalam alur kerja.
Yang akan Anda pelajari
- Dasar-dasar Alur Kerja.
- Cara menghubungkan Cloud Functions publik dengan Workflows.
- Cara menghubungkan layanan Cloud Run pribadi dengan Workflows.
- Cara menghubungkan API HTTP eksternal dengan Workflows.
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau G Suite, Anda harus membuatnya.)
Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID
.
- Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.
Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Pastikan untuk mengikuti petunjuk yang ada di bagian "Membersihkan" yang memberi tahu Anda cara menonaktifkan resource sehingga tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Mulai Cloud Shell
Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.
Dari GCP Console, klik ikon Cloud Shell di toolbar kanan atas:
Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:
Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda di lab ini dapat dilakukan hanya dengan browser.
3. Ringkasan Workflows
Dasar-dasar
Alur kerja terdiri dari serangkaian langkah yang dijelaskan menggunakan sintaksis berbasis YAML Workflows. Ini adalah definisi alur kerja. Untuk mengetahui penjelasan mendetail tentang sintaksis YAML Workflows, lihat halaman Referensi sintaksis.
Saat dibuat, alur kerja akan di-deploy, sehingga membuat alur kerja siap untuk dieksekusi. Eksekusi adalah satu eksekusi logika yang terkandung dalam definisi alur kerja. Semua eksekusi alur kerja bersifat independen dan produk mendukung banyak eksekusi serentak.
Mengaktifkan layanan
Dalam codelab ini, Anda akan menghubungkan layanan Cloud Functions, Cloud Run dengan Workflows. Anda juga akan menggunakan Cloud Build dan Cloud Storage saat membangun layanan.
Aktifkan semua layanan yang diperlukan:
gcloud services enable \ cloudfunctions.googleapis.com \ run.googleapis.com \ workflows.googleapis.com \ cloudbuild.googleapis.com \ storage.googleapis.com
Pada langkah berikutnya, Anda akan menghubungkan dua Cloud Functions bersama-sama dalam alur kerja.
4. Men-deploy Cloud Function pertama
Fungsi pertama adalah generator angka acak di Python.
Buat dan buka direktori untuk kode fungsi:
mkdir ~/randomgen cd ~/randomgen
Buat file main.py
di direktori dengan konten berikut:
import random, json from flask import jsonify def randomgen(request): randomNum = random.randint(1,100) output = {"random":randomNum} return jsonify(output)
Saat menerima permintaan HTTP, fungsi ini menghasilkan angka acak antara 1 sampai 100 dan dikembalikan ke pemanggil dalam format JSON.
Fungsi ini mengandalkan Flask untuk pemrosesan HTTP dan kita perlu menambahkannya sebagai dependensi. Dependensi pada Python dikelola dengan pip dan dinyatakan dalam file metadata bernama requirements.txt
.
Buat file requirements.txt
di direktori yang sama dengan konten berikut:
flask>=1.0.2
Deploy fungsi dengan pemicu HTTP dan izinkan permintaan yang tidak diautentikasi dengan perintah ini:
gcloud functions deploy randomgen \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
Setelah fungsi di-deploy, Anda dapat melihat URL fungsi di bagian properti httpsTrigger.url
ditampilkan di konsol atau dengan perintah gcloud functions describe
.
Anda juga dapat membuka URL fungsi tersebut dengan perintah curl
berikut:
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
Fungsi siap untuk alur kerja.
5. Men-deploy Cloud Function kedua
Fungsi kedua adalah pengganda. {i>Function<i} ini mengalikan input yang diterima dengan 2.
Buat dan buka direktori untuk kode fungsi:
mkdir ~/multiply cd ~/multiply
Buat file main.py
di direktori dengan konten berikut:
import random, json from flask import jsonify def multiply(request): request_json = request.get_json() output = {"multiplied":2*request_json['input']} return jsonify(output)
Saat menerima permintaan HTTP, fungsi ini mengekstrak input
dari isi JSON, mengalikannya dengan 2, dan menampilkan kembali dalam format JSON ke pemanggil.
Buat file requirements.txt
yang sama di direktori yang sama dengan konten berikut:
flask>=1.0.2
Deploy fungsi dengan pemicu HTTP dan izinkan permintaan yang tidak diautentikasi dengan perintah ini:
gcloud functions deploy multiply \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
Setelah fungsi di-deploy, Anda juga dapat membuka URL fungsi tersebut dengan perintah curl
berikut:
curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
Fungsi siap untuk alur kerja.
6. Menghubungkan dua Cloud Functions
Di alur kerja pertama, hubungkan kedua fungsi bersama-sama.
Buat file workflow.yaml
dengan konten berikut.
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - returnResult: return: ${multiplyResult}
Dalam alur kerja ini, Anda mendapatkan angka acak dari fungsi pertama dan meneruskannya ke fungsi kedua. Hasilnya adalah angka acak yang dikalikan.
Deploy alur kerja pertama:
gcloud workflows deploy workflow --source=workflow.yaml
Jalankan alur kerja pertama:
gcloud workflows execute workflow
Setelah alur kerja dieksekusi, Anda dapat melihat hasilnya dengan meneruskan ID eksekusi yang diberikan di langkah sebelumnya:
gcloud workflows executions describe <your-execution-id> --workflow workflow
Output-nya akan mencakup result
dan state
:
result: '{"body":{"multiplied":108},"code":200 ... } ... state: SUCCEEDED
7. Menghubungkan HTTP API eksternal
Selanjutnya, Anda akan menghubungkan math.js sebagai layanan eksternal dalam alur kerja.
Di math.js, Anda dapat mengevaluasi ekspresi matematika seperti ini:
curl https://api.mathjs.org/v4/?'expr=log(56)'
Kali ini, Anda akan menggunakan Konsol Cloud untuk memperbarui alur kerja kami. Temukan Workflows
di Konsol Google Cloud:
Temukan alur kerja Anda dan klik tab Definition
:
Edit definisi alur kerja dan sertakan panggilan ke math.js
.
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - logFunction: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"} result: logResult - returnResult: return: ${logResult}
Alur kerja kini memasukkan output fungsi pengali ke dalam panggilan fungsi log di math.js
.
UI akan memandu Anda untuk mengedit dan men-deploy alur kerja. Setelah di-deploy, klik Execute
untuk menjalankan alur kerja. Anda akan melihat detail eksekusi:
Perhatikan kode status 200
dan body
dengan output fungsi log.
Anda baru saja mengintegrasikan layanan eksternal ke dalam alur kerja kami. Keren sekali!
8. Men-deploy layanan Cloud Run
Di bagian terakhir, selesaikan alur kerja dengan panggilan ke layanan Cloud Run pribadi. Ini berarti alur kerja perlu diautentikasi untuk memanggil layanan Cloud Run.
Layanan Cloud Run menampilkan math.floor
dari nomor yang diteruskan.
Buat dan buka direktori untuk kode layanan:
mkdir ~/floor cd ~/floor
Buat file app.py
di direktori dengan konten 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)))
Cloud Run men-deploy container, sehingga Anda memerlukan Dockerfile
dan container Anda harus mengikat ke variabel env 0.0.0.0
dan PORT
, sehingga menggunakan kode di atas.
Saat menerima permintaan HTTP, fungsi ini mengekstrak input
dari isi JSON, memanggil compute.floor, dan menampilkan hasilnya kembali ke pemanggil.
Dalam direktori yang sama, buat Dockerfile
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
Buat container:
export SERVICE_NAME=floor gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
Setelah container dibuat, deploy ke Cloud Run. Perhatikan flag no-allow-unauthenticated
. Ini memastikan layanan hanya menerima panggilan yang diautentikasi:
gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \ --platform managed \ --no-allow-unauthenticated
Setelah di-deploy, layanan siap untuk alur kerja.
9. Menghubungkan layanan Cloud Run
Sebelum dapat mengonfigurasi Workflows untuk memanggil layanan Cloud Run pribadi, Anda perlu membuat akun layanan untuk Workflows yang akan menggunakan:
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
Beri peran run.invoker
ke akun layanan. Tindakan ini akan memungkinkan akun layanan memanggil layanan Cloud Run yang diautentikasi:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role "roles/run.invoker"
Update, definisi alur kerja di workflow.yaml
untuk menyertakan layanan Cloud Run. Perhatikan bahwa Anda juga menyertakan kolom auth
untuk memastikan Workflows meneruskan token autentikasi dalam panggilannya ke layanan Cloud Run:
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - logFunction: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"} result: logResult - floorFunction: call: http.post args: url: https://floor-<random-hash>.run.app auth: type: OIDC body: input: ${logResult.body} result: floorResult - returnResult: return: ${floorResult}
Perbarui alur kerja. Kali ini teruskan di akun layanan:
gcloud workflows deploy workflow \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
Menjalankan alur kerja:
gcloud workflows execute workflow
Dalam beberapa detik, Anda dapat melihat eksekusi alur kerja untuk melihat hasilnya:
gcloud workflows executions describe <your-execution-id> --workflow workflow
Output-nya akan mencakup bilangan bulat result
dan state
:
result: '{"body":"5","code":200 ... } ... state: SUCCEEDED
10. Selamat!
Selamat, Anda telah menyelesaikan codelab.
Yang telah kita bahas
- Dasar-dasar Alur Kerja.
- Cara menghubungkan Cloud Functions publik dengan Workflows.
- Cara menghubungkan layanan Cloud Run pribadi dengan Workflows.
- Cara menghubungkan API HTTP eksternal dengan Workflows.