Pour spécifier plusieurs préfixes et suffixes d'objets, ou associer plus de 10 déclencheurs à un seul bucket Object Storage Service (OSS), créez un déclencheur OSS basé sur EventBridge afin de répondre à des événements tels que le téléchargement de fichiers.
Remarques
Notez les différences suivantes entre les déclencheurs OSS basés sur EventBridge et les déclencheurs OSS natifs :
-
Vous pouvez associer jusqu'à 10 déclencheurs OSS natifs à un bucket. Pour en associer davantage, utilisez des déclencheurs OSS basés sur EventBridge.
RemarqueNous vous recommandons de ne pas associer plus de 10 déclencheurs à un même bucket. Si vous avez besoin de déclencheurs supplémentaires, créez un nouveau bucket puis configurez-y les déclencheurs nécessaires.
Vous pouvez créer jusqu'à 50 déclencheurs OSS basés sur EventBridge, conformément aux limites de ressources d'EventBridge. Pour plus d'informations, consultez Limites.
Pour les déclencheurs OSS basés sur EventBridge, la combinaison des champs Event Type, Object Prefix et Object Suffix n'a pas besoin d'être unique.
Vous pouvez configurer plusieurs valeurs pour les champs Object Prefix et Object Suffix. Toutefois, la correspondance floue et les expressions régulières ne sont pas prises en charge pour Object Prefix et Object Suffix.
Un déclencheur OSS basé sur EventBridge n'est pas actif immédiatement après sa création. Un délai d'environ 30 secondes est nécessaire avant qu'il ne commence à déclencher la fonction associée.
Exemple
Vous pouvez configurer un déclencheur OSS avec une règle spécifiant les préfixes source et test ainsi que les suffixes .rar et .zip. Lorsqu'un fichier compressé portant le suffixe .rar ou .zip est téléchargé dans le répertoire source ou test d'un bucket OSS spécifié, une fonction se déclenche automatiquement. Une fois l'exécution terminée, le fichier décompressé est stocké dans un autre répertoire du même bucket.
Prérequis
-
EventBridge
-
Function Compute
-
Object Storage Service (OSS)
Étape 1 : Créer un déclencheur OSS EventBridge
Connectez-vous à la console Function Compute. Dans le volet de navigation de gauche, choisissez .
Dans la barre de navigation supérieure, sélectionnez une région. Sur la page Functions, cliquez sur la fonction cible.
Sur la page de détails de la fonction, cliquez sur l'onglet Trigger, puis sur Create Trigger.
-
Dans le panneau Trigger Type, définissez Event triggers for Alibaba Cloud services sur Object Storage Service (OSS) sous OK, configurez les autres paramètres, puis cliquez sur OK.
Paramètre
Actions
Exemple
Name
Saisissez un nom personnalisé pour le déclencheur.
oss-trigger
Version or Alias
La valeur par défaut est LATEST. Pour créer un déclencheur associé à une autre version ou à un alias différent, sélectionnez d'abord la version ou l'alias dans la liste déroulante Version or Alias sur la page de détails de la fonction. Pour plus d'informations sur les versions et les alias, consultez Gérer les versions et Gérer les alias.
LATEST
Bucket Name
Sélectionnez le bucket OSS créé.
bucket-zh****
Object Prefix
Saisissez les préfixes des noms d'objets à faire correspondre. Function Compute recommande de configurer des préfixes et des suffixes afin d'éviter les invocations circulaires et les frais inattendus.
Cliquez sur + Add Object Prefix pour ajouter plusieurs valeurs au champ Object Prefix.
ImportantUn préfixe d'objet ne doit pas commencer par une barre oblique (
/), sinon le déclencheur ne s'activera pas.source
test
Object Suffix
Saisissez les suffixes des noms d'objets à faire correspondre. Function Compute recommande de configurer des préfixes et des suffixes afin d'éviter les invocations circulaires et les frais inattendus.
Cliquez sur + Add Object Suffix pour ajouter plusieurs valeurs au champ Object Suffix.
png
Event Type
Sélectionnez un ou plusieurs événements de déclenchement. Pour plus d'informations sur les types d'événements Function Compute, consultez Définitions des événements OSS.
oss:ObjectCreated:PutObject,oss:ObjectCreated:PostObject,oss:ObjectCreated:CompleteMultipartUploadEvent Pattern Content
Une fois les champs Object Prefix, Object Suffix et Event Type configurés, le système renseigne automatiquement ce paramètre.
ImportantModifiez le contenu du champ Event Pattern Content avec prudence. Une modification incorrecte peut entraîner l'échec du déclencheur. Avant toute modification, assurez-vous de bien comprendre les règles applicables. Pour plus d'informations, consultez Modèles d'événements.
{ "source":[ "acs.oss" ] }Invocation Method
Sélectionnez la méthode d'invocation de la fonction. La méthode par défaut est l'invocation synchrone.
Sync Invocation : Function Compute déclenche la fonction et attend la fin de l'exécution avant de retourner le résultat. Cette méthode convient à un large éventail de cas d'utilisation. Pour plus d'informations, consultez Invocation synchrone.
Async Invocation : Function Compute déclenche la fonction et retourne une réponse immédiate. Le service garantit que la fonction s'exécute au moins une fois, mais ne retourne pas le résultat d'exécution. Cette méthode est adaptée aux fonctions dont le temps d'exécution est long. Pour plus d'informations, consultez Invocation asynchrone.
Sync Invocation
Trigger State
Indique si le déclencheur doit être activé immédiatement lors de sa création. Par défaut, l'option Enable Trigger est sélectionnée, ce qui signifie que le déclencheur est activé dès sa création.
N/A
Push Format
Spécifie le format de données du paramètre d'entrée d'événement de la fonction.
CloudEvents : Spécification décrivant les données d'événement dans un format commun. Elle inclut une description de l'événement et de sa charge utile, simplifiant ainsi la déclaration et la distribution des événements entre les services et les plateformes.
RawData : Distribue uniquement la charge utile de l'événement, sans les autres métadonnées du format CloudEvents.
RemarqueLes déclencheurs OSS natifs diffèrent des déclencheurs OSS basés sur EventBridge. Le paramètre d'événement d'un déclencheur OSS natif prend uniquement en charge le modèle OSSEvents, qui correspond au format d'événement généré par OSS.
CloudEvents
Pour plus d'informations sur les paramètres avancés, tels que les tentatives et les paramètres de lettre morte, consultez Fonctionnalités avancées des déclencheurs.
Une fois créé, le déclencheur apparaît dans la liste Trigger Name. Pour modifier ou supprimer le déclencheur, consultez Gérer les déclencheurs.
Étape 2 : Configurer les paramètres d'entrée de la fonction
Un déclencheur OSS basé sur EventBridge transmet l'événement à la fonction sous forme de paramètre d'entrée au format CloudEvents. Vous pouvez transmettre manuellement un événement à la fonction pour simuler un déclenchement.
Dans l'onglet Code de la page de détails de la fonction, cliquez sur l'icône
située à côté de Test Function, puis sélectionnez Configure Test Parameters dans la liste déroulante.-
Dans le panneau Configure Test Parameters, sélectionnez Create New Test Event ou Modify Existing Test Event. Saisissez un nom d'événement ainsi que son contenu, puis cliquez sur OK.
L'événement constitue le paramètre d'entrée pour Function Compute. Lorsqu'un événement spécifié se produit dans le bucket OSS cible, le système envoie les données de l'événement à la fonction liée au format JSON. L'exemple de code suivant illustre ce processus :
{ "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" }Le tableau suivant décrit les champs du paramètre d'événement.
Paramètre
Type
Exemple
Description
datacontenttype
string
application/json;charset=utf-8
Type de contenu du paramètre data. Le paramètre datacontenttype accepte uniquement la valeur application/json;charset=utf-8.
aliyunaccountid
string
143199913****
ID de votre compte Alibaba Cloud. Vous pouvez le trouver dans la section References de la page Overview de la console Function Compute.
data
{}
Contenu de l'événement OSS, représenté sous forme d'objet JSON. Les CloudEvents contiennent le contexte défini par OSS lors de la survenue de l'événement. Ces informations sont encapsulées dans le paramètre data.
subject
string
acs:oss:cn-hangzhou:143199913**:bucket-zh**/source/a.png
Sujet de l'événement.
Le format est
acs:oss:<region>:<your_account_id>:<your_bucket>, où<region>correspond à la région de la fonction,<your_account_id>à l'ID de votre compte Alibaba Cloud, et<your_bucket>au nom de votre bucket.aliyunoriginalaccountid
string
143199913****
ID du compte Alibaba Cloud à l'origine de l'événement.
source
string
acs.oss
Source de l'événement. Pour les déclencheurs OSS, cette valeur est fixée à
acs.oss.type
string
oss:ObjectCreated:PutObject
Type de l'événement.
aliyunpublishtime
timestamp
2023-11-04T08:49:26.745Z
Heure de réception de l'événement.
specversion
string
1,0
Version du protocole CloudEvents.
aliyuneventbusname
string
default
Nom du bus d'événements ayant reçu l'événement.
id
string
6364D216511B143733C5A67B
ID de l'événement.
time
timestamp
2023-11-04T08:49:26Z
Heure de survenue de l'événement.
aliyunregionid
string
cn-hangzhou
Région dans laquelle l'événement a été reçu.
aliyunpublishaddr
string
140.205.XX.XX
Adresse IP du serveur recevant l'événement.
Vous devez mettre à jour les champs suivants du paramètre data pour les adapter à votre configuration :
userIdentity.principalId: Remplacez cette valeur par l'ID de votre compte Alibaba Cloud.region: Remplacez cette valeur par la région où vous avez créé la fonction.oss.bucket.name: Remplacez cette valeur par le nom de votre bucket, qui doit se trouver dans la même région que la fonction.oss.bucket.arn: Le format estacs:oss:<region>:<your_account_id>:<your_bucket>, où<region>correspond à la région de la fonction,<your_account_id>à l'ID de votre compte Alibaba Cloud, et<your_bucket>au nom de votre bucket situé dans la même région.oss.bucket.ownerIdentity: Remplacez cette valeur par l'ID de votre compte Alibaba Cloud.object.key: Remplacez cette valeur par l'objet que vous avez téléchargé dans le bucket de destination.
ImportantLorsque vous simulez un déclenchement en configurant le paramètre d'événement, assurez-vous que l'objet spécifié (par exemple source/a.png dans ce tutoriel) existe bien dans le bucket configuré. Dans le cas contraire, la fonction ne sera pas déclenchée ou son exécution échouera.
Étape 3 : Écrire et tester le code de la fonction
Après avoir créé le déclencheur OSS, écrivez et testez le code de la fonction pour en vérifier le bon fonctionnement. La fonction sera ensuite déclenchée automatiquement par les événements OSS réels.
Veillez à éviter les déclenchements en boucle dans votre code, sous peine d'engendrer des frais inattendus. Un scénario typique de boucle survient lorsqu'un téléchargement d'objet dans un bucket OSS déclenche une fonction, laquelle génère ensuite un ou plusieurs fichiers et les écrit dans le même bucket, provoquant ainsi un nouveau déclenchement. Pour plus d'informations, consultez Règles des déclencheurs OSS.
-
Dans l'onglet Code de la page de détails de la fonction, saisissez votre code dans l'éditeur, puis cliquez sur Deploy.
La section suivante détaille les préparatifs nécessaires et fournit des exemples de code.
RemarqueSi votre fonction doit lire ou écrire des ressources OSS, nous vous recommandons d'utiliser un endpoint OSS interne afin d'éviter le trafic Internet et les frais associés. Pour plus d'informations sur les endpoints internes OSS, consultez Régions et 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()); } } -
Cliquez sur Test Function.
Une fois l'exécution terminée, vous pouvez consulter le résultat au-dessus de l'onglet Code.
FAQ
Rubriques connexes
Pour connaître les types d'événements OSS configurables, consultez Définitions des événements OSS.
Pour modifier ou supprimer un déclencheur existant, consultez Mettre à jour un déclencheur.
-
Problèmes liés aux déclencheurs :
Pour identifier quel événement a invoqué votre fonction, journalisez le type d'événement dans votre code. Pour plus d'informations, consultez Gestion des journaux.
Pour appeler une fonction depuis une autre, effectuez un appel API direct ou utilisez CloudFlow pour les orchestrer. Si vous invoquez de manière asynchrone une fonction effectuant une tâche de longue durée, configurez une destination pour traiter le résultat de l'invocation. Pour plus d'informations, consultez Les fonctions peuvent-elles s'invoquer mutuellement ? et Configurer une destination pour une invocation asynchrone.