Lihat konektor yang didukung untuk Application Integration.
Tugas Cloud Function
Dengan tugas Cloud Function, Anda dapat mengonfigurasi dan menjalankan fungsi Cloud Run dari integrasi. Fungsi Cloud Run mewakili evolusi Cloud Functions berikutnya, yang menawarkan model pemrograman berbasis peristiwa dengan kontrol dan skalabilitas yang ditingkatkan, dengan memanfaatkan platform serverless Cloud Run. Fungsi Cloud Run menyediakan satu solusi serverless untuk semua jenis beban kerja.
Tugas Cloud Function mendukung fungsi Cloud Run versi berikut:
- Cloud Functions (generasi ke-1)
- Fungsi Cloud Run yang dibuat menggunakan Cloud Functions v2 API
Untuk mengetahui informasi mendetail tentang perbedaan antara versi fungsi Cloud Run, lihat panduan perbandingan Cloud Functions.
Sebelum memulai
Pastikan Anda melakukan tugas berikut di project Google Cloud sebelum mengonfigurasi tugas Cloud Function.
- Untuk terhubung ke Cloud Function, pastikan Anda telah membuat profil OAuth 2.0 atau melampirkan akun layanan yang dikelola pengguna ke integrasi Anda:
-
Jika integrasi Anda memiliki akun layanan yang terlampir, tetapkan peran IAM Cloud Function Invoker ke akun layanan tersebut.
Untuk mengetahui informasi tentang cara memberikan peran ke akun layanan, lihat Mengelola akses ke akun layanan.
- Tugas Cloud Function hanya mendukung profil autentikasi berjenis Token ID OIDC Google. Buat profil autentikasi berjenis Token ID OIDC Google menggunakan akun layanan dengan peran IAM Cloud Functions Invoker yang ditetapkan. Jika tugas Cloud Function Anda tidak memerlukan autentikasi, kolom Profil autentikasi di panel konfigurasi tugas dapat dibiarkan kosong.
- Pastikan VPC Service Controls tidak disiapkan untuk Integrasi Aplikasi di project Google Cloud Anda.
Jika integrasi Anda telah mengonfigurasi profil ID OIDC dan akun layanan yang dikelola pengguna, maka secara default profil ID OIDC akan digunakan untuk autentikasi. Jika profil ID OIDC maupun akun layanan yang dikelola pengguna tidak dikonfigurasi, akun layanan default (service-PROJECT_NUMBER@gcp-sa-integrations.
) akan digunakan untuk memanggil tugas Cloud Function.
Mengonfigurasi tugas Cloud Function
Untuk mengonfigurasi tugas Cloud Function dalam integrasi Anda, lakukan langkah-langkah berikut:
- Di menu navigasi, klik Integrasi.
Tindakan ini akan membuka daftar integrasi yang tersedia di UI Integrasi Aplikasi.
- Pilih integrasi yang ada atau klik Buat integrasi.
Jika Anda membuat integrasi baru, masukkan nama dan deskripsi dalam dialog pembuatan, lalu klik Buat.
- Dari drop-down Tasks, klik Cloud Function untuk menempatkannya di editor integrasi.
- Klik elemen Cloud Function di perancang untuk membuka panel konfigurasi, lalu klik Configure Cloud Function.
-
Jika Anda diminta untuk memberikan izin ke akun layanan, klik
Grant.
Integrasi Aplikasi secara otomatis memberikan izin yang diperlukan ke akun layanan.
- Di panel Konfigurasi Cloud Function, pilih salah satu opsi berikut:
- Tautkan fungsi yang ada: Pilih opsi ini untuk mengaitkan fungsi yang ada dengan integrasi Anda. Anda dapat menautkan Cloud Functions (generasi ke-1) dan Cloud Functions yang dibuat dengan Cloud Functions v2 API dari integrasi Anda.
- Di kolom Cloud Function Trigger URL, masukkan URL pemicu fungsi yang ada.
URL harus mengikuti salah satu format berikut:
# For Cloud Functions (1st gen) https://REGION_NAME-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
# For Cloud Run functions created using the Cloud Functions v2 API https://FUNCTION_NAME-PROJECT_ID.REGION_NAME.run.app
- Di kolom Cloud Function Trigger URL, masukkan URL pemicu fungsi yang ada.
- Buat fungsi baru: Pilih opsi ini untuk membuat fungsi baru untuk integrasi.
- Di kolom Function Name, masukkan nama unik untuk fungsi Cloud Run baru.
- Dari drop-down Region, pilih region tempat fungsi Cloud Run di-deploy.
- Dari dropdown Function Version, pilih versi fungsi Cloud Run yang diinginkan:
- Cloud Functions (Generasi ke-1): Ini adalah versi lama fungsi Cloud Run, yang sebelumnya dikenal sebagai Cloud Functions (generasi ke-1), yang menggunakan format endpoint
.cloudfunctions.net
. - Cloud Functions (Generasi Terbaru): Ini adalah versi terbaru fungsi Cloud Run, yang dibuat menggunakan Cloud Functions v2 API. Dibangun di Cloud Run dan Eventarc, layanan ini mendukung waktu tunggu permintaan yang diperpanjang (hingga 60 menit), menawarkan konkurensi yang ditingkatkan, dan menggunakan format endpoint
.cloudfunctions.net
dan.run.app
.
Untuk mengetahui informasi selengkapnya tentang perbedaan antara kedua versi tersebut, lihat Membandingkan Cloud Functions.
- Cloud Functions (Generasi ke-1): Ini adalah versi lama fungsi Cloud Run, yang sebelumnya dikenal sebagai Cloud Functions (generasi ke-1), yang menggunakan format endpoint
- Tautkan fungsi yang ada: Pilih opsi ini untuk mengaitkan fungsi yang ada dengan integrasi Anda. Anda dapat menautkan Cloud Functions (generasi ke-1) dan Cloud Functions yang dibuat dengan Cloud Functions v2 API dari integrasi Anda.
- Klik Simpan.
Mengonfigurasi tugas Cloud Function di Application Integration akan membuat fungsi Cloud Run yang dipicu HTTP dasar di project Google Cloud Anda.
Template Cloud Function
Contoh berikut menunjukkan cara menggunakan tugas Cloud Function dalam integrasi Anda untuk berbagai bahasa.
Python
Saat mengonfigurasi Cloud Function menggunakan fungsi Cloud Run yang ada, pastikan file sumber main.py
, task.py
, dan requirements.txt
fungsi tersebut dalam format berikut:
task.py
# Sample Code: # print(event.get('task_string_key')) # event.set('task_int_array_key', [456, 789]); # event.log('some logging') def run(event): """Actual cloud function custom logic. Args: event : event object in main.py that contains all parameters. """ return
main.py
"""Un-editable platform wrapper which invokes user code.""" import traceback from flask import json from flask import jsonify from task import run VALUE_NAME = [ 'stringValue', 'intValue', 'doubleValue', 'booleanValue', 'protoValue' ] ARRAY_VALUE_NAME = { 'stringArray': 'stringValues', 'intArray': 'intValues', 'doubleArray': 'doubleValues', 'booleanArray': 'booleanValues', 'protoArray': 'protoValues' } VALUE_TYPE_URL = 'type.googleapis.com/google.protobuf.Value' CLOUD_FUNCTION_EXCEPTION_KEY = 'CloudFunctionException' CLOUD_FUNCTION_LOGGING_KEY = 'CloudFunctionLogging' class _Event(object): """Event object.""" def __init__(self, json_payload): self._event_params = json_payload.get('eventParameters', dict()) self._task_params = json_payload.get('taskParameters', dict()) self._log = [] print('Event param is ' + str(self._event_params)) print('Task param is ' + str(self._task_params)) def set(self, key, value): """Set the event parameters key-value. Args: key: parameter key. value: parameter value. """ new_param = self._create_param(key, value) param = self._get_param_by_key(key) if param is None: if 'parameters' not in self._event_params: self._event_params['parameters'] = [] self._event_params['parameters'].append(new_param) else: param['value'] = new_param['value'] def _create_param(self, key, value): """Create a new parameter with given key value pair. Args: key: parameter key. value: parameter value. Returns: parameter. """ new_param = {} new_param['key'] = key if isinstance(value, str): new_param['value'] = {'stringValue': value} elif isinstance(value, int): new_param['value'] = {'intValue': value} elif isinstance(value, float): new_param['value'] = {'doubleValue': value} elif isinstance(value, bool): new_param['value'] = {'booleanValue': value} elif isinstance(value, dict): if 'type@' in value: new_param['value'] = {'protoValue': value} else: new_param['value'] = { 'protoValue': { '@type': 'type.googleapis.com/google.protobuf.Value', 'value': value } } elif isinstance(value, list): if not value: raise RuntimeError('Cannot create a param with empty list') if any(not isinstance(val, type(value[0])) for val in value): print('Not all elements in the list have the same type') new_param['value'] = { 'protoValue': { '@type': 'type.googleapis.com/google.protobuf.Value', 'value': value } } elif isinstance(value[0], str): new_param['value'] = {'stringArray': {'stringValues': value}} elif isinstance(value[0], int): new_param['value'] = {'intArray': {'intValues': value}} elif isinstance(value[0], float): new_param['value'] = {'doubleArray': {'doubleValues': value}} elif isinstance(value[0], bool): new_param['value'] = {'booleanArray': {'booleanValues': value}} elif isinstance(value[0], dict): if all('@type' in val and val['@type'] == value[0]['@type'] for val in value): new_param['value'] = {'protoArray': {'protoValues': value}} else: new_param['value'] = { 'protoValue': { '@type': 'type.googleapis.com/google.protobuf.Value', 'value': value } } else: raise RuntimeError('The type ' + type(value[0]) + ' in the list is not supported') else: raise RuntimeError('Value ' + str(value) + ' has the type ' + type(value) + ' that is not supported') return new_param def get(self, key): """Get the event parameter value for specified key. Args: key: parameter key. Returns: Parameter value. """ param = self._get_param_by_key(key) if param is None: raise RuntimeError('Can not find param with key ' + key) return self._get_param_value(param) def _get_param_by_key(self, key): """Get the parameter for specified key. Args: key: parameter key. Returns: Parameter. """ param = self._get_param_by_key_from_params(key, self._task_params) if param is None: return self._get_param_by_key_from_params(key, self._event_params) value = self._get_param_value(param) if isinstance(value, str) and len(value) > 2 and value.startswith( '$') and value.endswith('$'): return self._get_param_by_key_from_params(value[1:-1], self._event_params) return param def _get_param_by_key_from_params(self, key, params): """Get the parameter for specified key from event parameters. Args: key: parameter key. params: event parameters. Returns: Parameter. """ if not isinstance(params, dict) or 'parameters' not in params: return None for param in params['parameters']: if param['key'] == key: return param return None def _get_param_value(self, param): """Get the parameter value for specified parameter. Args: param: parameter. Returns: Parameter value. """ value = param['value'] if len(value) != 1: raise RuntimeError('param does not have size of 1') for value_name in VALUE_NAME: if value_name in value: if value_name == 'protoValue' and value[value_name][ '@type'] == VALUE_TYPE_URL: return value[value_name]['value'] return value[value_name] for array_value_name in ARRAY_VALUE_NAME: if array_value_name in value: return value[array_value_name][ARRAY_VALUE_NAME[array_value_name]] raise RuntimeError('Cannot get value from param ' + str(param)) def set_error(self): """Set the cloud function error to event parameters in order for user to see on IP.""" self.set(CLOUD_FUNCTION_EXCEPTION_KEY, traceback.format_exc()) def log(self, message): self._log.append(str(message)) def get_response(self): """Get the response that can be returned to IP. Returns: The response text or any set of values that can be turned into a Response object using `make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`. """ if self._log: self.set(CLOUD_FUNCTION_LOGGING_KEY, self._log) res = { 'eventParameters': self._event_params, } return jsonify(res) def execute_function(request): """Entry point of the cloud function. Args: request (flask.Request): HTTP request object. Returns: The response text or any set of values that can be turned into a Response object using `make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`. """ try: request_json = request.get_json(silent=True) event = _Event(request_json) run(event) except: event.set_error() return event.get_response()
requirements.txt
# Function dependencies, for example: # package>=version
Untuk mengetahui informasi selengkapnya tentang format respons, lihat ValueType.
Java
Contoh berikut menunjukkan cara menggunakan tugas Cloud Function dalam integrasi Anda. Pastikan respons mengikuti format JSON yang didukung seperti yang dijelaskan dalam contoh:
private static final Gson gson = new Gson(); @Override public void service(HttpRequest request, HttpResponse response) throws Exception { JsonObject body = gson.fromJson(request.getReader(), JsonObject.class); JsonArray resParams = new JsonArray(); for (JsonElement param: body.getAsJsonObject("eventParameters").getAsJsonArray("parameters")) { if (param.getAsJsonObject().get("key").getAsString().equals("input")) { JsonObject newParam= new JsonObject(); newParam.addProperty("key", "input"); JsonObject value = new JsonObject(); value.addProperty("stringValue","2"); newParam.add("value", value); resParams.add(newParam); } else { resParams.add(param); } } JsonObject parameters = new JsonObject(); parameters.add("parameters", resParams); JsonObject res = new JsonObject(); res.add("eventParameters", parameters); System.out.println(res); BufferedWriter writer = response.getWriter(); writer.write(res.toString()); }
Untuk mengetahui informasi selengkapnya tentang format respons, lihat ValueType.
JavaScript
Contoh berikut menunjukkan cara menggunakan tugas Cloud Function dalam integrasi Anda. Pastikan respons mengikuti format JSON yang didukung seperti yang dijelaskan dalam contoh:
const functions = require('@google-cloud/functions-framework'); functions.http('execute_function', (req, res) => { console.log(JSON.stringify(req.body)); let response = {"eventParameters":{"parameters":[{"key":"input","value":{"stringValue":"2"}}]}}; res.send(JSON.stringify(response)); });
Untuk mengetahui informasi selengkapnya tentang format respons, lihat ValueType.
PHP
Contoh berikut menunjukkan cara menggunakan tugas Cloud Function dalam integrasi Anda. Pastikan respons mengikuti format JSON yang didukung seperti yang dijelaskan dalam contoh:
use Psr\Http\Message\ServerRequestInterface; function execute_function(ServerRequestInterface $request) { return '{"eventParameters":{"parameters":[{"key":"input","value":{"stringValue":"2"}}]}}'; }
Untuk mengetahui informasi selengkapnya tentang format respons, lihat ValueType.
Mengedit tugas Cloud Function
Integrasi Aplikasi akan mengarahkan Anda ke halaman konsol yang sesuai untuk mengedit fungsi Cloud Run berdasarkan jenis versi. Google Cloud
Cloud Functions (generasi ke-1)
Untuk mengedit tugas Cloud Function yang dikonfigurasi menggunakan versi Cloud Functions (generasi ke-1), lakukan langkah-langkah berikut:
- Di panel konfigurasi tugas, klik Open Cloud Function.
Anda akan diarahkan ke halaman Cloud Functions (generasi ke-1) > Function details di Google Cloud console.
- Klik Edit.
- Di halaman Edit function, langkah Configuration memungkinkan Anda mengedit setelan konfigurasi default Cloud Function. Lihat Mengonfigurasi Cloud Functions untuk mengetahui informasi selengkapnya.
- Klik Berikutnya untuk melanjutkan ke langkah Kode dan edit kode sumber Cloud Function.
Secara default, Cloud Function berisi file sumber berikut:
- main.py : File ini berisi kode inisialisasi untuk menjalankan Cloud Function dari integrasi Anda.
- task.py : File ini berisi kode yang dapat dieksekusi dari Cloud Function.
Tulis skrip Anda di dalam fungsi
run(event)
. Fungsi ini dipanggil saat tugas Cloud Function dijalankan. Objekevent
dari file main.py berisi semua parameter tugas.Lihat Mengakses variabel integrasi untuk mengetahui informasi tentang cara menggunakan variabel yang ditentukan di tingkat integrasi dalam skrip Anda.
- Klik Deploy.
Cloud Run Functions
Untuk mengedit tugas Cloud Function yang dikonfigurasi menggunakan versi Cloud Functions (Generasi Terbaru), lakukan langkah-langkah berikut:
- Di panel konfigurasi tugas, klik Open Cloud Function.
Anda akan dialihkan ke halaman Cloud Run functions > Service details di Google Cloud console.
- Di tab Sumber, klik Edit sumber untuk mengedit file kode sumber fungsi Cloud Run.
Secara default, fungsi Cloud Run berisi file sumber berikut:
- main.py : File ini berisi kode inisialisasi untuk menjalankan Cloud Functions dari integrasi Anda.
- task.py: File ini berisi kode yang dapat dieksekusi dari Cloud Functions.
Tulis skrip Anda di dalam fungsi
run(event)
. Fungsi ini dipanggil saat tugas Cloud Run functions dijalankan. Objekevent
dari file main.py berisi semua parameter tugas.Lihat Mengakses variabel integrasi untuk mengetahui informasi tentang cara menggunakan variabel yang ditentukan di tingkat integrasi dalam skrip Anda.
- Klik Simpan dan deploy ulang.
Mengakses variabel integrasi
Untuk mengakses variabel integrasi di Cloud Function, teruskan variabel sebagai parameter tugas ke tugas Cloud Function. Parameter tugas adalah pasangan nilai kunci dengan Key adalah nama variabel referensi yang digunakan dalam file sumber Cloud Function Anda dan Value adalah nama variabel integrasi yang sesuai yang ditunjuk oleh variabel referensi. Anda dapat menambahkan satu atau beberapa parameter tugas di bagian Parameter tugas pada panel konfigurasi tugas.
Metode berikut digunakan untuk mengakses variabel integrasi dari Cloud Function Anda:
- set: Menulis nilai ke variabel.
- get: Membaca nilai variabel.
Misalnya, jika Anda memiliki variabel integrasi bernama EmployeeName yang ingin digunakan dalam file sumber Cloud Function, tentukan parameter tugas berikut:
- Kunci: EmployeeKey
- Nilai: EmployeeName
Skrip contoh berikut menunjukkan penggunaan fungsi set dan get untuk mengakses variabel integrasi yang ditentukan.
def run(event): # Read the integration variable EmployeeName using the reference variable EmployeeKey value = event.get('EmployeeKey'); # Change the integration variable EmployeeName value using the reference variable EmployeeKey event.set('EmployeeKey' , 'XYZ'); # The new value of the integration variable is retained throughout the Cloud Function task. return
Strategi penanganan error
Strategi penanganan error untuk tugas menentukan tindakan yang harus dilakukan jika tugas gagal karena error sementara. Untuk mengetahui informasi tentang cara menggunakan strategi penanganan error, dan untuk mengetahui berbagai jenis strategi penanganan error, lihat Strategi penanganan error.
Pengecualian SLA
Tugas Cloud Function memiliki dependensi pada
produk Google Cloud Functions.
Karena dependensi ini bersifat eksternal untuk Integrasi Aplikasi, semua eksekusi integrasi active
yang gagal karena kegagalan dalam tugas Cloud Function dikecualikan dari persyaratan dan ketentuan Perjanjian Tingkat Layanan (SLA) Integrasi Aplikasi.
Kuota dan batas
Untuk mengetahui informasi tentang kuota dan batas untuk fungsi Cloud Run dan Cloud Functions (generasi ke-1), lihat Perbandingan Konfigurasi.
Langkah berikutnya
- Pelajari semua tugas dan pemicu.
- Pelajari cara menguji dan memublikasikan integrasi.
- Pelajari penanganan error.
- Pelajari log eksekusi integrasi.