Consulta los conectores compatibles con Application Integration.
Tarea de Cloud Functions
La tarea Cloud Functions te permite configurar y ejecutar funciones de Cloud Run desde tu integración. Las funciones de Cloud Run representan la siguiente evolución de Cloud Functions, ya que ofrecen un modelo de programación basado en eventos con mayor control y escalabilidad, aprovechando la plataforma sin servidor de Cloud Run. Las funciones de Cloud Run ofrecen una única solución sin servidor para todos los tipos de cargas de trabajo.
La tarea de Cloud Functions admite las siguientes versiones de Cloud Run Functions:
- Cloud Functions (1.ª gen.)
- Funciones de Cloud Run creadas con la API Cloud Functions v2
Para obtener información detallada sobre las diferencias entre las versiones de Cloud Functions, consulta la guía de comparación de Cloud Functions.
Antes de empezar
Asegúrate de realizar las siguientes tareas en tu proyecto de Google Cloud antes de configurar la tarea Función de Cloud.
- Para conectarte a Cloud Functions, asegúrate de haber creado un perfil de OAuth 2.0 o de haber vinculado una cuenta de servicio gestionada por el usuario a tu integración:
-
Si tu integración tiene una cuenta de servicio asociada, asigna el rol de gestión de identidades y accesos Invocador de Cloud Functions a esa cuenta de servicio.
Para obtener información sobre cómo conceder roles a una cuenta de servicio, consulta el artículo sobre cómo gestionar el acceso a cuentas de servicio.
- La tarea Función de Cloud solo admite perfiles de autenticación de tipo Token de ID de Google OIDC. Crea un perfil de autenticación de tipo Token de ID de Google OIDC con la cuenta de servicio que tenga asignado el rol de gestión de identidades y accesos Invocador de Cloud Functions. Si tu tarea de función de Cloud no requiere autenticación, puedes dejar vacío el campo Perfil de autenticación del panel de configuración de la tarea.
- Asegúrate de que Controles de Servicio de VPC no esté configurado para Application Integration en tu proyecto de Google Cloud .
Si tu integración tiene configurados tanto el perfil de ID de OIDC como una cuenta de servicio gestionada por el usuario, se usará el perfil de ID de OIDC de forma predeterminada para la autenticación. Si no se configura ningún perfil de ID de OIDC ni ninguna cuenta de servicio gestionada por el usuario, se usará la cuenta de servicio predeterminada (service-PROJECT_NUMBER@gcp-sa-integrations.iam.gserviceaccount.com
) para llamar a la tarea Cloud Function.
Configurar la tarea de Cloud Functions
Para configurar la tarea Función de Cloud en tu integración, sigue estos pasos:
- En el menú de navegación, haz clic en Integraciones.
Se abrirá la lista de integraciones disponibles en la interfaz de usuario de integración de aplicaciones.
- Seleccione una integración o haga clic en Crear integración.
Si vas a crear una integración, introduce un nombre y una descripción en el cuadro de diálogo de creación y haz clic en Crear.
- En el menú desplegable Tareas, haz clic en Función en la nube para colocarla en el editor de integración.
- Haz clic en el elemento Función de Cloud del diseñador para abrir el panel de configuración y, a continuación, haz clic en Configurar función de Cloud.
-
Si se te pide que concedas permisos a la cuenta de servicio, haz clic en Conceder.
Application Integration concede automáticamente los permisos necesarios a la cuenta de servicio.
- En el panel Configuración de la función de Cloud, seleccione una de las siguientes opciones:
- Vincular función: selecciona esta opción para asociar una función a tu integración. Puedes vincular Cloud Functions (1.ª gen.) y Cloud Functions creadas con la API Cloud Functions v2 desde tu integración.
- En el campo URL de activación de Cloud Functions, introduzca la URL de activación de la función.
La URL debe tener uno de los siguientes formatos:
# 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
- En el campo URL de activación de Cloud Functions, introduzca la URL de activación de la función.
- Crear función: selecciona esta opción para crear una función para la integración.
- En el campo Function Name (Nombre de función), introduce un nombre único para las nuevas funciones de Cloud Run.
- En el menú desplegable Región, selecciona la región en la que se ha implementado la función de Cloud Run.
- En el menú desplegable Versión de la función, selecciona la versión de Cloud Run Functions que quieras:
- Cloud Functions (1.ª gen.): es la versión antigua de Cloud Run Functions, antes conocida como Cloud Functions (1.ª gen.), que usa el formato de endpoint
.cloudfunctions.net
. - Cloud Functions (última generación): es la versión más reciente de Cloud Run Functions, creada con la API de Cloud Functions v2. Se basa en Cloud Run y Eventarc, admite tiempos de espera de solicitudes ampliados (hasta 60 minutos), ofrece una mayor simultaneidad y usa los formatos de endpoint
.cloudfunctions.net
y.run.app
.
Para obtener más información sobre las diferencias entre las dos versiones, consulta Comparar Cloud Functions.
- Cloud Functions (1.ª gen.): es la versión antigua de Cloud Run Functions, antes conocida como Cloud Functions (1.ª gen.), que usa el formato de endpoint
- Vincular función: selecciona esta opción para asociar una función a tu integración. Puedes vincular Cloud Functions (1.ª gen.) y Cloud Functions creadas con la API Cloud Functions v2 desde tu integración.
- Haz clic en Guardar.
Al configurar una tarea de Cloud Functions en Application Integration, se crea una función de Cloud Run básica activada por HTTP en tu proyecto de Google Cloud.
Plantilla de función de Cloud
En los siguientes ejemplos se muestra cómo usar la tarea Cloud Function en tu integración para diferentes idiomas.
Python
Cuando configures la función de Cloud usando una función de Cloud Run, asegúrate de que los archivos de origen main.py
, task.py
y requirements.txt
tengan el siguiente formato:
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
Para obtener más información sobre el formato de respuesta, consulta ValueType.
Java
En el siguiente ejemplo se muestra cómo usar la tarea Función de Cloud en tu integración. Asegúrate de que la respuesta siga el formato JSON admitido, tal como se describe en el ejemplo:
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()); }
Para obtener más información sobre el formato de respuesta, consulta ValueType.
JavaScript
En el siguiente ejemplo se muestra cómo usar la tarea Función de Cloud en tu integración. Asegúrate de que la respuesta siga el formato JSON admitido, tal como se describe en el ejemplo:
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)); });
Para obtener más información sobre el formato de respuesta, consulta ValueType.
PHP
En el siguiente ejemplo se muestra cómo usar la tarea Función de Cloud en tu integración. Asegúrate de que la respuesta siga el formato JSON admitido, tal como se describe en el ejemplo:
use Psr\Http\Message\ServerRequestInterface; function execute_function(ServerRequestInterface $request) { return '{"eventParameters":{"parameters":[{"key":"input","value":{"stringValue":"2"}}]}}'; }
Para obtener más información sobre el formato de respuesta, consulta ValueType.
Editar una tarea de Cloud Functions
Integración de aplicaciones te dirige a la página de la consola Google Cloud correspondiente para editar las funciones de Cloud Run en función del tipo de versión.
Cloud Functions (1.ª gen.)
Para editar una tarea de Cloud Functions configurada con la versión de Cloud Functions (1.ª gen.), sigue estos pasos:
- En el panel de configuración de la tarea, haz clic en Abrir función de Cloud.
Se te redirigirá a la página Cloud Functions (1.ª gen.) > Detalles de la función de tu Google Cloud console.
- Haz clic en Editar.
- En la página Editar función, el paso Configuración te permite editar los ajustes de configuración predeterminados de la función de Cloud. Para obtener más información, consulta el artículo sobre cómo configurar Cloud Functions.
- Haga clic en Siguiente para ir al paso Código y editar el código fuente de la función de Cloud.
De forma predeterminada, la función de Cloud contiene los siguientes archivos de origen:
- main.py este archivo contiene el código de inicialización para ejecutar la función de Cloud desde tu integración.
- task.py este archivo contiene el código ejecutable de la función de Cloud.
Escribe tu secuencia de comandos dentro de la función
run(event)
. Esta función se llama cuando se ejecuta la tarea de Cloud Functions. El objetoevent
del archivo main.py contiene todos los parámetros de la tarea.Consulta Acceder a variables de integración para obtener información sobre cómo usar las variables definidas a nivel de integración en tu secuencia de comandos.
- Haz clic en Desplegar.
Cloud Run Functions
Para editar una tarea de Cloud Functions configurada con la versión de Cloud Functions (Latest Gen), sigue estos pasos:
- En el panel de configuración de la tarea, haz clic en Abrir función de Cloud.
Se te redirigirá a la página Funciones de Cloud Run > Detalles del servicio de tu Google Cloud console.
- En la pestaña Fuente, haga clic en Editar fuente para editar los archivos de código fuente de las funciones de Cloud Run.
De forma predeterminada, las funciones de Cloud Run contienen los siguientes archivos de origen:
- main.py este archivo contiene el código de inicialización para ejecutar las funciones de Cloud de tu integración.
- task.py este archivo contiene el código ejecutable de Cloud Functions.
Escribe tu secuencia de comandos dentro de la función
run(event)
. Se llama a esta función cuando se ejecuta la tarea de Cloud Run Functions. El objetoevent
del archivo main.py contiene todos los parámetros de la tarea.Consulta Acceder a variables de integración para obtener información sobre cómo usar las variables definidas a nivel de integración en tu secuencia de comandos.
- Haz clic en Guardar y volver a implementar.
Acceder a las variables de integración
Para acceder a una variable de integración en tu función de Cloud Functions, pasa la variable como parámetro de tarea a la tarea Cloud Functions. El parámetro de tarea es un par clave-valor en el que Clave es el nombre de la variable de referencia que se usa en el archivo de origen de la función de Cloud y Valor es el nombre de la variable de integración correspondiente a la que apunta la variable de referencia. Puedes añadir uno o varios parámetros de tarea en la sección Parámetros de tarea del panel de configuración de la tarea.
Se usan los siguientes métodos para acceder a las variables de integración desde tu función de Cloud:
- set: escribe el valor en una variable.
- get: lee el valor de una variable.
Por ejemplo, si tienes una variable de integración llamada EmployeeName que quieres usar en el archivo de origen de tu función de Cloud, define los siguientes parámetros de tarea:
- Clave: EmployeeKey
- Valor: EmployeeName
En la siguiente secuencia de comandos de ejemplo se muestra el uso de las funciones set y get para acceder a las variables de integración definidas.
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
Estrategia de gestión de errores
Una estrategia de gestión de errores de una tarea especifica la acción que se debe llevar a cabo si la tarea falla debido a un error temporal. Para obtener información sobre cómo usar una estrategia de gestión de errores y conocer los diferentes tipos de estrategias de gestión de errores, consulta Estrategias de gestión de errores.
Exclusiones del SLA
La tarea de Cloud Functions tiene una dependencia del producto Google Cloud Functions.
Como esta dependencia es externa a Application Integration, todas las ejecuciones de integraciones de active
que fallen debido a un error en la tarea de Cloud Functions quedan excluidas de los términos y condiciones del Acuerdo de Nivel de Servicio (ANS) de Application Integration.
Cuotas y límites
Para obtener información sobre las cuotas y los límites de las funciones de Cloud Run y Cloud Functions (1.ª gen.), consulta la comparación de configuraciones.
Siguientes pasos
- Consulta información sobre todas las tareas y los activadores.
- Consulta cómo probar y publicar una integración.
- Consulta información sobre el tratamiento de errores.
- Consulta información sobre los registros de ejecución de integraciones.