Lihat konektor yang didukung untuk Integration Aplikasi.

Tugas Cloud Function

Tugas Cloud Function memungkinkan Anda 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, yang memanfaatkan platform serverless Cloud Run. Fungsi Cloud Run menyediakan satu solusi serverless untuk semua jenis beban kerja.

Tugas Cloud Function mendukung versi fungsi Cloud Run berikut:

Untuk 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.

  1. 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 terpasang, tetapkan peran IAM Cloud Function Invoker ke akun layanan tersebut.

      Untuk informasi tentang cara memberikan peran ke akun layanan, lihat Mengelola akses ke akun layanan.

    • Tugas Cloud Function hanya mendukung profil autentikasi jenis Token ID OIDC Google. Buat profil autentikasi jenis Token ID OIDC Google menggunakan akun layanan dengan peran IAM Cloud Functions Invoker yang ditetapkan. Jika tugas Cloud Function Anda tidak memerlukan autentikasi, kolom Authentication profile di panel konfigurasi tugas dapat dibiarkan kosong.

    Jika integrasi Anda memiliki profil ID OIDC dan akun layanan yang dikelola pengguna yang dikonfigurasi, secara default profil ID OIDC akan digunakan untuk autentikasi. Jika profil ID OIDC atau akun layanan yang dikelola pengguna tidak dikonfigurasi, akun layanan default (service-PROJECT_NUMBER@gcp-sa-integrations.iam.gserviceaccount.com) akan digunakan untuk memanggil tugas Cloud Function.

  2. Pastikan Kontrol Layanan VPC tidak disiapkan untuk Integrasi Aplikasi di project Google Cloud Anda.

Mengonfigurasi tugas Cloud Function

Untuk mengonfigurasi tugas Cloud Function dalam integrasi Anda, lakukan langkah-langkah berikut:

  1. Di menu navigasi, klik Integrations.

    Tindakan ini akan membuka daftar integrasi yang tersedia di UI Integrasi Aplikasi.

  2. Pilih integrasi yang ada atau klik Buat integrasi.

    Jika Anda membuat integrasi baru, masukkan nama dan deskripsi di dialog pembuatan, lalu klik Buat.

  3. Dari drop-down Tasks, klik Cloud Function untuk menempatkannya di editor integrasi.
  4. Klik elemen Cloud Function di desainer untuk membuka panel konfigurasi, lalu klik Configure Cloud Function.
  5. Jika Anda diminta untuk memberikan izin ke akun layanan, klik Grant.

    Integrasi Aplikasi secara otomatis memberikan izin yang diperlukan ke akun layanan.

  6. Di panel Konfigurasi Cloud Functions, 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

    • Buat fungsi baru: Pilih opsi ini untuk membuat fungsi baru bagi integrasi.
      1. Di kolom Nama Fungsi, masukkan nama unik untuk fungsi Cloud Run baru.
      2. Dari drop-down Region, pilih region tempat fungsi Cloud Run di-deploy.
      3. 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. Dibuat di Cloud Run dan Eventarc, layanan ini mendukung waktu tunggu permintaan yang diperpanjang (hingga 60 menit), menawarkan peningkatan konkurensi, dan menggunakan format endpoint .cloudfunctions.net dan .run.app.
        • Untuk mengetahui informasi selengkapnya tentang perbedaan antara kedua versi tersebut, lihat Membandingkan Cloud Functions.
  7. Klik Simpan.
  8. Mengonfigurasi tugas Cloud Function di Integrasi Aplikasi akan membuat fungsi Cloud Run dasar yang dipicu HTTP 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(**json.loads(json.htmlsafe_dumps(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 Google Cloud yang sesuai untuk mengedit fungsi Cloud Run berdasarkan jenis versi.

Cloud Functions (generasi ke-1)

Untuk mengedit tugas Cloud Function yang dikonfigurasi menggunakan versi Cloud Functions (generasi ke-1), lakukan langkah-langkah berikut:

  1. Di panel konfigurasi tugas, klik Open Cloud Function.

    Anda akan diarahkan ke halaman Cloud Functions (generasi ke-1) > Detail fungsi di Google Cloud console.

  2. Klik Edit.
  3. Di halaman Edit function, langkah Configuration memungkinkan Anda mengedit setelan konfigurasi default Cloud Function. Lihat Mengonfigurasi Cloud Functions untuk mengetahui informasi selengkapnya.
  4. Klik Berikutnya untuk melanjutkan ke langkah Kode dan mengedit 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 Cloud Function yang dapat dieksekusi. Tulis skrip Anda di dalam fungsi run(event). Fungsi ini dipanggil saat tugas Cloud Function dijalankan. Objek event 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.

  5. Klik Deploy.

Cloud Run Functions

Untuk mengedit tugas Cloud Functions yang dikonfigurasi menggunakan versi Cloud Functions (Generasi Terbaru), lakukan langkah-langkah berikut:

  1. Di panel konfigurasi tugas, klik Open Cloud Function.

    Anda akan dialihkan ke halaman Cloud Run functions > Service details di Google Cloud console.

  2. Di tab Source, klik Edit source 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 Cloud Functions yang dapat dieksekusi. Tulis skrip Anda di dalam fungsi run(event). Fungsi ini dipanggil saat tugas Cloud Run functions dijalankan. Objek event 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.

  3. Klik Save and redeploy.

Mengakses variabel integrasi

Untuk mengakses variabel integrasi di Cloud Function, teruskan variabel sebagai parameter tugas ke tugas Cloud Function. Parameter tugas adalah key-value pair 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

Contoh skrip 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 akan diambil 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 terhadap 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