Para especificar varios prefijos y sufijos de objeto, o para asociar más de 10 activadores con un solo bucket de Object Storage Service (OSS), cree un activador de OSS basado en EventBridge que responda a eventos como la carga de archivos.
Notas
Tenga en cuenta las siguientes diferencias entre los activadores de OSS basados en EventBridge y native OSS triggers:
-
Como máximo se pueden asociar 10 native OSS triggers con un bucket. Si necesita vincular más activadores de OSS a un bucket, utilice activadores de OSS basados en EventBridge.
NotaSe recomienda no asociar más de 10 activadores con un mismo bucket. Si requiere más activadores, cree un bucket nuevo y después configure los activadores correspondientes.
Es posible crear hasta 50 activadores de OSS basados en EventBridge, lo cual coincide con los límites de recursos de EventBridge. Para obtener más información, consulte Limits.
En los activadores de OSS basados en EventBridge, la combinación de Event Type, Object Prefix y Object Suffix no tiene que ser única.
Puede configurar varios valores para Object Prefix y Object Suffix. Sin embargo, ni Object Prefix ni Object Suffix admiten coincidencias aproximadas ni expresiones regulares.
Un activador de OSS basado en EventBridge no está activo de inmediato. Después de crearlo, transcurren unos 30 segundos antes de que comience a ejecutar la función asociada.
Ejemplo
Configure un activador de OSS con una regla que especifique los prefijos source y test, junto con los sufijos .rar y .zip. Cuando se cargue un archivo comprimido con el sufijo .rar o .zip en el directorio source o test de un bucket de OSS específico, se ejecutará automáticamente una función. Una vez que finalice la ejecución, el archivo descomprimido se almacenará en otro directorio del mismo bucket.
Requisitos previos
-
EventBridge
-
Function Compute
-
Object Storage Service (OSS)
Paso 1: Crear un activador de OSS de EventBridge
Inicie sesión en la consola de Function Compute. En el panel de navegación izquierdo, seleccione .
En la barra de navegación superior, seleccione una región. En la página Functions, haga clic en la función de destino.
En la página de detalles de la función, haga clic en la pestaña Trigger y luego en Create Trigger.
-
En el panel Trigger Type, establezca Event triggers for Alibaba Cloud services en Object Storage Service (OSS) dentro de OK, configure el resto de los parámetros y haga clic en OK.
Parámetro
Acciones
Ejemplo
Name
Introduzca un nombre personalizado para el activador.
oss-trigger
Version or Alias
El valor predeterminado es LATEST. Si desea crear un activador para otra versión o alias, primero selecciónelo en la lista desplegable Version or Alias de la página de detalles de la función. Para obtener más información sobre versiones y alias, consulte Manage versions y Manage aliases.
LATEST
Bucket Name
Seleccione el bucket de OSS que creó.
bucket-zh****
Object Prefix
Introduzca los prefijos de los nombres de objeto que desea coincidir. Function Compute recomienda configurar prefijos y sufijos para evitar invocaciones circulares y cargos inesperados.
Haga clic en + Add Object Prefix para agregar varios valores a Object Prefix.
ImportanteUn prefijo de objeto no puede comenzar con una barra diagonal (
/); de lo contrario, el activador no se ejecutará.source
test
Object Suffix
Introduzca los sufijos de los nombres de objeto que desea coincidir. Function Compute recomienda configurar prefijos y sufijos para evitar invocaciones circulares y cargos inesperados.
Haga clic en + Add Object Suffix para agregar varios valores a Object Suffix.
png
Event Type
Seleccione uno o más eventos de activación. Para obtener más información sobre los tipos de eventos de Function Compute, consulte OSS event definitions.
oss:ObjectCreated:PutObject,oss:ObjectCreated:PostObject,oss:ObjectCreated:CompleteMultipartUploadEvent Pattern Content
Después de configurar Object Prefix, Object Suffix y Event Type, el sistema completa este parámetro automáticamente.
ImportanteModifique Event Pattern Content con precaución. Un cambio incorrecto provocará errores en el activador. Antes de modificar un patrón de eventos, asegúrese de comprender las reglas. Para obtener más información, consulte Event patterns.
{ "source":[ "acs.oss" ] }Invocation Method
Seleccione el método para invocar la función. El método predeterminado es la invocación síncrona.
Sync Invocation: Function Compute ejecuta la función y espera a que termine antes de devolver el resultado. Este método es adecuado para una amplia variedad de casos de uso. Para obtener más información, consulte Sync invocation.
Async Invocation: Function Compute ejecuta la función y devuelve una respuesta de inmediato. El servicio garantiza que la función se ejecute como mínimo una vez, pero no devuelve el resultado. Más indicado para funciones con tiempos de ejecución prolongados. Para obtener más información, consulte Async invocation.
Sync Invocation
Trigger State
Indica si el activador se habilita inmediatamente al crearlo. De forma predeterminada, Enable Trigger está seleccionado, por lo que el activador queda habilitado justo después de su creación.
N/A
Push Format
Especifica el formato de datos del parámetro de entrada de evento de la función.
CloudEvents: Especificación que describe datos de eventos en un formato común. Incluye una descripción del evento y de su carga útil, lo que simplifica la declaración y entrega de eventos entre servicios y plataformas.
RawData: Entrega únicamente la carga útil del evento, sin los metadatos adicionales del formato CloudEvents.
Notanative OSS triggers son distintos de los activadores de OSS basados en EventBridge. El parámetro de evento de un activador nativo de OSS solo admite la plantilla OSSEvents, que corresponde al formato de evento generado por OSS.
CloudEvents
Para obtener información sobre parámetros avanzados, como la configuración de reintentos y de mensajes no entregados, consulte Advanced trigger features.
Una vez creado, el activador aparece en la lista Trigger Name. Para modificarlo o eliminarlo, consulte Manage triggers.
Paso 2: Configurar los parámetros de entrada de la función
Un activador de OSS basado en EventBridge pasa el evento a la función como parámetro de entrada en formato CloudEvents. También puede pasar un evento manualmente para simular la activación.
En la pestaña Code de la página de detalles de la función, haga clic en el icono
situado junto a Test Function y seleccione Configure Test Parameters en la lista desplegable.-
En el panel Configure Test Parameters, seleccione Create New Test Event o Modify Existing Test Event. Introduzca un nombre y el contenido del evento, y luego haga clic en OK.
El evento constituye el parámetro de entrada de Function Compute. Cuando ocurre el evento especificado en el bucket de OSS de destino, el sistema envía los datos del evento a la función vinculada en formato JSON. A continuación se muestra un ejemplo de código:
{ "datacontenttype": "application/json;charset=utf-8", "aliyunaccountid": "143199913****", "data": { "eventVersion": "1.0", "responseElements": { "requestId": "6364D216511B143733C5A67B" }, "eventSource": "acs:oss", "eventTime": "2023-11-04T08:49:26.000Z", "requestParameters": { "sourceIPAddress": "140.205.XX.XX" }, "eventName": "ObjectCreated:PutObject", "userIdentity": { "principalId": "143199913****" }, "region": "cn-hangzhou", "oss": { "bucket": { "name": "bucket-zh***", "arn": "acs:oss:cn-hangzhou:143199913****:bucket-zh***", "virtualBucket": "", "ownerIdentity": "143199913****" }, "ossSchemaVersion": "1.0", "object": { "size": 13, "objectMeta": { "mimeType": "text/plain" }, "deltaSize": 13, "eTag": "59CA0EFA9F5633CB0371BBC0355478D8", "key": "source/a.png" } } }, "subject": "acs:oss:cn-hangzhou:143199913****:bucket-zh***/source/a.png", "aliyunoriginalaccountid": "143199913****", "source": "acs.oss", "type": "oss:ObjectCreated:PutObject", "aliyunpublishtime": "203-11-04T08:49:26.745Z", "specversion": "1.0", "aliyuneventbusname": "default", "id": "6364D216511B143733C5A67B", "time": "2023-11-04T08:49:26Z", "aliyunregionid": "cn-hangzhou" }La siguiente tabla describe los campos del parámetro de evento.
Parámetro
Tipo
Ejemplo
Descripción
datacontenttype
string
application/json;charset=utf-8
Tipo de contenido del parámetro data. El parámetro datacontenttype solo admite application/json;charset=utf-8.
aliyunaccountid
string
143199913****
ID de su cuenta de Alibaba Cloud. Lo encontrará en la sección References de la página Overview de la consola de Function Compute.
data
{}
Contenido del evento de OSS, representado como un objeto JSON. Los eventos CloudEvents incluyen el contexto definido por OSS cuando ocurre el evento. Esta información se encapsula en el parámetro data.
subject
string
acs:oss:cn-hangzhou:143199913**:bucket-zh**/source/a.png
Asunto del evento.
El formato es
acs:oss:<region>:<your_account_id>:<your_bucket>, donde<region>es la región de la función,<your_account_id>es el ID de su cuenta de Alibaba Cloud y<your_bucket>es el nombre de su bucket.aliyunoriginalaccountid
string
143199913****
ID de la cuenta de Alibaba Cloud que originó el evento.
source
string
acs.oss
Origen del evento. Para los activadores de OSS, el valor es fijo:
acs.oss.type
string
oss:ObjectCreated:PutObject
Tipo de evento.
aliyunpublishtime
timestamp
2023-11-04T08:49:26.745Z
Hora en la que se recibió el evento.
specversion
string
1.0
Versión del protocolo CloudEvents.
aliyuneventbusname
string
default
Nombre del bus de eventos que recibe el evento.
id
string
6364D216511B143733C5A67B
ID del evento.
time
timestamp
2023-11-04T08:49:26Z
Hora en la que ocurrió el evento.
aliyunregionid
string
cn-hangzhou
Región donde se recibió el evento.
aliyunpublishaddr
string
140.205.XX.XX
Dirección IP del servidor que recibe el evento.
Debe actualizar los siguientes campos del parámetro data para que coincidan con su configuración:
userIdentity.principalId: Sustitúyalo por el ID de su cuenta de Alibaba Cloud.region: Sustitúyalo por la región donde creó la función.oss.bucket.name: Sustitúyalo por el nombre de su bucket, el cual debe estar en la misma región que la función.oss.bucket.arn: El formato esacs:oss:<region>:<your_account_id>:<your_bucket>, donde<region>es la región de la función,<your_account_id>es el ID de su cuenta de Alibaba Cloud y<your_bucket>es el nombre de su bucket en esa misma región.oss.bucket.ownerIdentity: Sustitúyalo por el ID de su cuenta de Alibaba Cloud.object.key: Sustitúyalo por el objeto que cargó en el bucket de destino.
ImportanteCuando simule una activación mediante la configuración del parámetro de evento, compruebe que el objeto especificado (por ejemplo, source/a.png en este tutorial) exista en el bucket configurado. De lo contrario, la función no se ejecutará o terminará con errores.
Paso 3: Escribir y probar el código de la función
Después de crear el activador de OSS, escriba y pruebe el código de la función para comprobar su correcto funcionamiento. Posteriormente, los eventos reales de OSS ejecutarán la función de manera automática.
Evite las activaciones en bucle dentro de su código, ya que podrían generar cargos inesperados. Un escenario típico ocurre cuando la carga de un objeto en un bucket de OSS ejecuta una función que genera uno o más archivos y los escribe de vuelta en el mismo bucket, lo que vuelve a activar la función. Para obtener más información, consulte OSS trigger rules.
-
En la pestaña Code de la página de detalles de la función, introduzca su código en el editor y haga clic en Deploy.
A continuación se describen los preparativos y se proporciona código de ejemplo.
NotaSi su función necesita leer o escribir recursos de OSS, se recomienda usar un endpoint interno de OSS para evitar tráfico de internet y los costos asociados. Para obtener más información sobre los endpoints internos de OSS, consulte Regions and endpoints.
/* Preparations: 1. Run the following commands in a terminal to create the package.json file and install the jimp module. a. Run npm init to create the package.json file. b. Run npm install jimp to install the jimp module. 2. Make sure that the function handler is index.handler. */ 'use strict'; console.log('Loading function ...'); var oss = require('ali-oss'); var fs = require('fs'); var jimp = require("jimp"); module.exports.handler = function (eventBuf, ctx, callback) { console.log('Received event:', eventBuf.toString()); var event = JSON.parse(eventBuf); var ossEvent = event.data; // OSS regions are prefixed with "oss-". Example: oss-cn-shanghai. var ossRegion = "oss-" + ossEvent.region; // Create an OSS client. var client = new oss({ region: ossRegion, /* An Alibaba Cloud account's AccessKey pair grants full API access. For security, use a RAM user for API calls and routine O&M. Do not hard-code your AccessKey ID and secret in your code, as this can lead to leaks and compromise your account's security. This example retrieves credentials from the context. */ accessKeyId: ctx.credentials.accessKeyId, accessKeySecret: ctx.credentials.accessKeySecret, stsToken: ctx.credentials.securityToken }); // Obtain the bucket name from the event. client.useBucket(ossEvent.oss.bucket.name); // The processed image is saved to the processed/ directory. var newKey = ossEvent.oss.object.key.replace("source/", "processed/"); var tmpFile = "/tmp/processed.png"; // Obtain the OSS object. console.log('Getting object: ', ossEvent.oss.object.key) client.get(ossEvent.oss.object.key).then(function (val) { // Read the content of the OSS object from the cache. jimp.read(val.content, function (err, image) { if (err) { console.error("Failed to read image"); callback(err); return; } // Resize the image and save it to the tmp file. image.resize(128, 128).write(tmpFile, function (err) { if (err) { console.error("Failed to write image locally"); callback(err); return; } // Upload the read OSS object to the OSS bucket and rename the object. console.log('Putting object: ', newKey); client.put(newKey, tmpFile).then(function (val) { console.log('Put object:', val); callback(null, val); return; }).catch(function (err) { console.error('Failed to put object: %j', err); callback(err); return }); }); }); }).catch(function (err) { console.error('Failed to get object: %j', err); callback(err); return }); };# Preparations: # 1. Make sure that the role configured for the function has permissions to access OSS. You can log on to the RAM console to grant the required permissions to the role. # 2. Make sure that the function's request handler is index.handler. # -*- coding: utf-8 -*- import oss2, json from wand.image import Image def handler(event, context): evt = json.loads(event) creds = context.credentials # Required by OSS SDK # An Alibaba Cloud account's AccessKey pair grants full API access. For security, use a RAM user for API calls and routine O&M. # Do not hard-code your AccessKey ID and secret in your code, as this can lead to leaks and compromise your account's security. # This example retrieves credentials from the context. auth=oss2.StsAuth( creds.access_key_id, creds.access_key_secret, creds.security_token) evt = evt['data'] bucket_name = evt['oss']['bucket']['name'] endpoint = 'oss-' + evt['region'] + '-internal.aliyuncs.com' bucket = oss2.Bucket(auth, endpoint, bucket_name) objectName = evt['oss']['object']['key'] # Processed images will be saved to processed/ newKey = objectName.replace("source/", "processed/") remote_stream = bucket.get_object(objectName) if not remote_stream: return remote_stream = remote_stream.read() with Image(blob=remote_stream) as img: with img.clone() as i: i.resize(128, 128) new_blob = i.make_blob() bucket.put_object(newKey, new_blob)/* Preparations: 1. Make sure that the role configured for the function has permissions to access OSS. You can log on to the RAM console and grant the role permissions to access OSS. 2. Make sure that the function's request handler is index.handler. */ <?php use OSS\OssClient; function handler($event, $context) { $event = json_decode($event, $assoc = true); /* An Alibaba Cloud account's AccessKey pair grants full API access. For security, use a RAM user for API calls and routine O&M. Do not hard-code your AccessKey ID and secret in your code, as this can lead to leaks and compromise your account's security. This example retrieves credentials from the context. */ $accessKeyId = $context["credentials"]["accessKeyId"]; $accessKeySecret = $context["credentials"]["accessKeySecret"]; $securityToken = $context["credentials"]["securityToken"]; $evt = $event['data']; $bucketName = $evt['oss']['bucket']['name']; $endpoint = 'oss-' . $evt['region'] . '-internal.aliyuncs.com'; $objectName = $evt['oss']['object']['key']; $newKey = str_replace("source/", "processed/", $objectName); try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken); $content = $ossClient->getObject($bucketName , $objectName); if ($content == null || $content == "") { return; } $imagick = new Imagick(); $imagick->readImageBlob($content); $imagick->resizeImage(128, 128, Imagick::FILTER_LANCZOS, 1); $ossClient->putObject($bucketName, $newKey, $imagick->getImageBlob()); } catch (OssException $e) { print($e->getMessage()); } }/* Preparations: 1. Add the following dependencies to pom.xml. <dependencies> <dependency> <groupId>com.aliyun.fc.runtime</groupId> <artifactId>fc-java-core</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>com.aliyun.fc.runtime</groupId> <artifactId>fc-java-event</artifactId> <version>1.2.0</version> </dependency> </dependencies> 2. Make sure that the function handler is example.App::handleRequest. */ package example; import java.io.*; import java.util.Map; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.fc.runtime.event.OSSEvent.Event; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; public class App implements StreamRequestHandler { private static final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); public static final class CloudEvent { public final String id; public final String source; public final String specversion; public final String type; public final String datacontenttype; public final String dataschema; public final String subject; public final String time; public final Map<String, ?> extensions; public final Event data; @JsonCreator public CloudEvent(@JsonProperty("id") String id, @JsonProperty("source") String source, @JsonProperty("specversion") String specversion, @JsonProperty("type") String type, @JsonProperty("datacontenttype") String datacontenttype, @JsonProperty("dataschema") String dataschema, @JsonProperty("subject") String subject, @JsonProperty("time") String time, @JsonProperty("extensions") Map<String, ?> extensions, @JsonProperty("data") Event data) { this.id = id; this.source = source; this.specversion = specversion; this.type = type; this.datacontenttype = datacontenttype; this.dataschema = dataschema; this.subject = subject; this.time = time; this.extensions = extensions; this.data = data; } public String getId() { return this.id; } public String getSource() { return this.source; } public String getSpecversion() { return this.specversion; } public String getType() { return this.type; } public String getDatacontenttype() { return this.datacontenttype; } public String getDataschema() { return this.dataschema; } public String getSubject() { return this.subject; } public String getTime() { return this.time; } public Map<String, ?> getExtensions() { return this.extensions; } public Event getData() { return this.data; } } @Override public void handleRequest( InputStream inputStream, OutputStream outputStream, Context context) throws IOException { CloudEvent cloudEvents = mapper.readValue(inputStream, new TypeReference<CloudEvent>() {}); Event ossEvent = cloudEvents.getData(); context.getLogger().info(String.format("received %s from %s @ %s", ossEvent.eventName, ossEvent.eventSource, ossEvent.region)); outputStream.write(String.format("received %s from %s @ %s", ossEvent.eventName, ossEvent.eventSource, ossEvent.region).getBytes()); outputStream.write(String.format("received bucket %s", ossEvent.oss.bucket.arn).getBytes()); outputStream.write(String.format("received object %s and it's size is %s", ossEvent.oss.object.key, ossEvent.oss.object.size).getBytes()); } } -
Haga clic en Test Function.
Una vez finalizada la ejecución, podrá consultar el resultado encima de la pestaña Code.
Preguntas frecuentes
Temas relacionados
Para conocer los tipos de eventos de OSS que se pueden configurar, consulte OSS event definitions.
Para modificar o eliminar un activador existente, consulte Update a trigger.
-
Problemas relacionados con los activadores:
Para identificar qué evento ejecutó su función, registre el tipo de evento en su código. Para obtener más información, consulte Log management.
Para llamar a una función desde otra, realice una llamada directa a la API o utilice CloudFlow para orquestarlas. Si invoca de forma asíncrona una función que ejecuta una tarea prolongada, configure un destino para procesar el resultado de la invocación. Para obtener más información, consulte Can functions invoke each other? y Configure a destination for an asynchronous invocation.