Todos los productos
Search
Centro de documentos

Function Compute:Configuración de un activador de OSS de EventBridge

Última actualización: Sep 09, 2026

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.

    Nota

    Se 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

Paso 1: Crear un activador de OSS de EventBridge

  1. Inicie sesión en la consola de Function Compute. En el panel de navegación izquierdo, seleccione Function Management > Functions.

  2. En la barra de navegación superior, seleccione una región. En la página Functions, haga clic en la función de destino.

  3. En la página de detalles de la función, haga clic en la pestaña Trigger y luego en Create Trigger.

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

    Importante

    Un 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:CompleteMultipartUpload

    Event Pattern Content

    Después de configurar Object Prefix, Object Suffix y Event Type, el sistema completa este parámetro automáticamente.

    Importante

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

    Nota

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

  1. En la pestaña Code de la página de detalles de la función, haga clic en el icono image.png situado junto a Test Function y seleccione Configure Test Parameters en la lista desplegable.

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

    struct

    {}

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

    Importante

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

Aviso

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.

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

    Nota

    Si 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());
        }
    }
  2. 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.