Application Integration でサポートされているコネクタをご覧ください。
Cloud Function タスク
Cloud Function タスクを使用すると、統合から Cloud Run functions を構成して実行できます。Cloud Run functions は、Cloud Functions の次世代の進化形であり、Cloud Run サーバーレス プラットフォームを活用して、制御とスケーラビリティが強化されたイベント ドリブン プログラミング モデルを提供します。Cloud Run functions は、すべてのワークロード タイプに対応する単一のサーバーレス ソリューションを提供します。
Cloud Functions タスクは、次のバージョンの Cloud Run functions をサポートしています。
- Cloud Functions(第 1 世代)
- Cloud Functions v2 API を使用して作成された Cloud Run functions
Cloud Run functions のバージョンの違いの詳細については、Cloud Functions の比較ガイドをご覧ください。
始める前に
Cloud Function タスクを使用する前に、Google Cloud プロジェクトで次のタスクを行う必要があります。
- Cloud Functions に接続するには、すでに OAuth 2.0 プロファイルが作成されているか、統合にユーザー管理のサービス アカウントが接続されていることを確認します。
-
統合にサービス アカウントが関連付けられている場合は、そのサービス アカウントに Cloud Functions の関数の起動元の IAM ロールを割り当てます。
サービス アカウントへのロールの付与については、サービス アカウントに対するアクセス権の管理をご覧ください。
- Cloud Functions のタスクは、Google OIDC ID トークンタイプの認証プロファイルのみをサポートします。[Cloud Functions の関数の起動元] の IAM ロールが割り当てられたサービス アカウントを使用して、Google OIDC ID トークンタイプの認証プロファイルを作成します。Cloud Function タスクで認証が不要な場合、タスク構成ペインの [認証プロファイル] フィールドは空のままにしておくことができます。
- Google Cloud プロジェクトの Application Integration で VPC Service Controls が設定されていないことを確認します。
統合で OIDC ID プロファイルとユーザー管理のサービス アカウントの両方が構成されている場合、デフォルトでは OIDC ID プロファイルが認証に使用されます。OIDC ID プロファイルもユーザー管理のサービス アカウントも構成されていない場合、Cloud Function タスクの呼び出しにデフォルトのサービス アカウント(service-PROJECT_NUMBER@gcp-sa-integrations.iam.gserviceaccount.com
)が使用されます。
Cloud Function タスクを構成する
統合で Cloud Function タスクを構成するには、次の手順に従います。
- ナビゲーション メニューで [統合] をクリックします。
Application Integration UI で使用可能な統合のリストが開きます。
- 既存の統合を選択するか、[統合の作成] をクリックします。
新しい統合を作成する場合は、作成ダイアログで名前と説明を入力し、[作成] をクリックします。
- [タスク] プルダウンから [Cloud Function] をクリックして、統合エディタに配置します。
- デザイナーで [Cloud Function] 要素をクリックして構成ペインを開き、[Configure Cloud Function] をクリックします。
-
サービス アカウントに権限を付与するように求められたら、[付与] をクリックします。
Application Integration は、サービス アカウントに必要な権限を自動的に付与します。
- [Cloud Functions の構成] ペインで、次のいずれかのオプションを選択します。
- 既存の関数をリンク: このオプションを選択すると、既存の関数が統合に関連付けられます。インテグレーションから、Cloud Functions(第 1 世代)と Cloud Functions v2 API で作成された Cloud Functions をリンクできます。
- [Cloud Function の関数のトリガー URL] フィールドに、既存の関数のトリガー URL を入力します。
URL は次のいずれかの形式にする必要があります。
# 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
- [Cloud Function の関数のトリガー URL] フィールドに、既存の関数のトリガー URL を入力します。
- 新しい関数を作成: 統合の新しい関数を作成するには、このオプションを選択します。
- [関数名] フィールドに、新しい Cloud Run 関数の固有の名前を入力します。
- [リージョン] プルダウンから、Cloud Run functions がデプロイされているリージョンを選択します。
- [関数バージョン] プルダウンから、目的の Cloud Run functions バージョンを選択します。
- Cloud Functions(第 1 世代): これは、Cloud Run functions のレガシー バージョンです。以前は Cloud Functions(第 1 世代)と呼ばれており、
.cloudfunctions.net
エンドポイント形式を使用します。 - Cloud Functions(最新世代): Cloud Functions v2 API を使用して作成された Cloud Run functions の最新バージョンです。Cloud Run と Eventarc を基盤として構築されており、リクエスト タイムアウトの延長(最大 60 分)をサポートし、同時実行数の増加を実現し、
.cloudfunctions.net
と.run.app
の両方のエンドポイント形式を使用します。
2 つのバージョンの違いの詳細については、Cloud Functions を比較するをご覧ください。
- Cloud Functions(第 1 世代): これは、Cloud Run functions のレガシー バージョンです。以前は Cloud Functions(第 1 世代)と呼ばれており、
- 既存の関数をリンク: このオプションを選択すると、既存の関数が統合に関連付けられます。インテグレーションから、Cloud Functions(第 1 世代)と Cloud Functions v2 API で作成された Cloud Functions をリンクできます。
- [保存] をクリックします。
Application Integration で Cloud Function タスクを構成すると、Google Cloud プロジェクトに HTTP でトリガーされる基本的な Cloud Run functions が作成されます。
Cloud Functions のテンプレート
次のサンプルは、さまざまな言語で統合の Cloud Function タスクを使用する方法を示しています。
Python
既存の Cloud Run functions を使用して Cloud Functions を構成する場合は、関数の main.py
、task.py
、requirements.txt
の各ソースファイルが次の形式になっていることを確認します。
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
レスポンス形式の詳細については、ValueType をご覧ください。
Java
次のサンプルは、統合で Cloud Function タスクを使用する方法を示しています。レスポンスが、サンプルで説明されているサポート対象の JSON 形式に準拠していることを確認します。
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()); }
レスポンス形式の詳細については、ValueType をご覧ください。
JavaScript
次のサンプルは、統合で Cloud Function タスクを使用する方法を示しています。レスポンスが、サンプルで説明されているサポート対象の JSON 形式に準拠していることを確認します。
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)); });
レスポンス形式の詳細については、ValueType をご覧ください。
PHP
次のサンプルは、統合で Cloud Function タスクを使用する方法を示しています。レスポンスが、サンプルで説明されているサポート対象の JSON 形式に準拠していることを確認します。
use Psr\Http\Message\ServerRequestInterface; function execute_function(ServerRequestInterface $request) { return '{"eventParameters":{"parameters":[{"key":"input","value":{"stringValue":"2"}}]}}'; }
レスポンス形式の詳細については、ValueType をご覧ください。
Cloud Function タスクを編集する
Application Integration は、バージョン タイプに基づいて適切な Google Cloud コンソールページに移動し、Cloud Run functions を編集します。
Cloud Functions(第 1 世代)
Cloud Functions(第 1 世代)バージョンを使用して構成された Cloud Functions タスクを編集するには、次の操作を行います。
- タスク構成ペインで、[Open Cloud Function] をクリックします。
Google Cloud consoleの [Cloud Functions(第 1 世代)> 関数の詳細] ページに移動します。
- [編集] をクリックします。
- [関数の編集] ページの [構成] ステップでは、Cloud Functions のデフォルトの構成設定を編集できます。詳細については、Cloud Functions の構成をご覧ください。
- [次へ] をクリックして [コード] ステップに進み、Cloud Functions の関数のソースコードを編集します。
デフォルトでは、Cloud Functions には次のソースファイルが含まれています。
- main.pymain.py : このファイルには、統合から Cloud Function を実行する初期化コードが含まれています。
- task.pytask.py : このファイルには、Cloud Function の実行可能コードが含まれています。
run(event)
関数内でスクリプトを記述します。この関数は、Cloud Functions タスクの実行時に呼び出されます。main.pymain.py ファイルのevent
オブジェクトには、すべてのタスク パラメータが含まれています。スクリプトの統合レベルで定義された変数を使用する方法については、統合変数へのアクセスをご覧ください。
- [デプロイ] をクリックします。
Cloud Run functions
Cloud Functions(最新世代)バージョンを使用して構成された Cloud Functions タスクを編集するには、次の操作を行います。
- タスク構成ペインで、[Open Cloud Function] をクリックします。
Google Cloud consoleの [Cloud Run functions > Service details] ページにリダイレクトされます。
- [ソース] タブで、[ソースを編集] をクリックして、Cloud Run functions のソースコード ファイルを編集します。
デフォルトでは、Cloud Run functions には次のソースファイルが含まれています。
- main.pymain.py : このファイルには、統合から Cloud Functions を実行する初期化コードが含まれています。
- task.pytask.py: このファイルには、Cloud Functions の実行可能コードが含まれています。
run(event)
関数内でスクリプトを記述します。この関数は、Cloud Run functions タスクの実行時に呼び出されます。main.pymain.py ファイルのevent
オブジェクトには、すべてのタスク パラメータが含まれています。スクリプトの統合レベルで定義された変数を使用する方法については、統合変数へのアクセスをご覧ください。
- [保存して再デプロイ] をクリックします。
統合変数にアクセスする
Cloud Function の統合変数にアクセスするには、タスク パラメータとして変数を Cloud Function のタスクに渡します。タスク パラメータは Key-Value ペアです。Key は Cloud Function のソースファイルで使用される参照変数の名前で、Value は、参照変数がポイントする、対応する統合変数名です。タスク構成ペインの [タスク パラメータ] セクションで、1 つ以上のタスク パラメータを追加できます。
Cloud Functions の関数から統合変数にアクセスするには、次のメソッドを使用します。
- set: 値を変数に書き込みます。
- get: 変数の値を取得します。
たとえば、Cloud Function のソースファイルで使用する EmployeeName という名前の統合変数がある場合は、次のタスク パラメータを定義します。
- キー: EmployeeKey
- 値: EmployeeName
次のサンプル スクリプトは、set 関数と get 関数を使用して、定義された統合変数にアクセスします。
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
エラー処理方法
タスクのエラー処理方法では、一時的なエラーによってタスクが失敗した場合のアクションを指定します。エラー処理方式と、さまざまな種類のエラー処理方式の詳細については、エラー処理方法をご覧ください。
SLA の免責
Cloud Functions のタスクは、Google Cloud Functions プロダクトに依存しています。
この依存関係は Application Integration の外部にあるため、Cloud Functions タスクの失敗が原因で実行がすべて失敗した active
統合は、Application Integration サービスレベル契約(SLA)の利用規約から除外されます。
割り当てと上限
Cloud Run functions と Cloud Functions(第 1 世代)の両方の割り当てと上限については、構成の比較をご覧ください。
次のステップ
- すべてのタスクとトリガーを確認する。
- インテグレーションをテストして公開する方法について学習する。
- エラー処理について学習する。
- 統合の実行ログについて学習する。