すべてのプロダクト
Search
ドキュメントセンター

Function Compute:EventBridgeベースのOSSトリガーの設定

最終更新日:Jul 24, 2024

object Storage Service (OSS) トリガーに複数のオブジェクトプレフィックスとサフィックスを指定する必要がある場合、または10を超えるトリガーをOSSバケットに関連付ける必要がある場合は、EventBridgeベースのOSSトリガーを作成して、ファイルアップロードなどのイベントに簡単に応答できます。

使用上の注意

EventBridgeベースのOSSトリガーは、ネイティブOSSトリガーとは異なります。 EventBridgeベースのOSSトリガーを作成するときは、次の項目に注意してください。

  • 最大10個のネイティブOSSトリガーをバケットに関連付けることができます。 より多くのOSSトリガーをバケットに関連付ける場合は、EventBridgeベースのOSSトリガーを使用できます。

    説明

    10個を超えるトリガーをバケットに関連付けないことを推奨します。 さらにトリガーが必要な場合は、新しいバケットを作成し、新しいバケットに基づいてトリガーを作成することを推奨します。

  • 最大50個のEventBridgeベースのOSSトリガーを作成できます。 これは、EventBridgeのリソース制限と一致します。 詳細については、「制限」をご参照ください。

  • EventBridgeベースのOSSトリガーのセマンティック一意性を保証する必要はありません。 Event TypeObject Prefix、およびObject Suffixパラメーターによって指定されるセマンティクスは、一意である必要はありません。

  • オブジェクトプレフィックスオブジェクトサフィックスには複数のエントリを設定できます。 ただし、Object PrefixObject Suffixに基づくファジーマッチングと正規表現マッチングはサポートされていません。

  • EventBridgeベースのOSSトリガーは、作成後すぐには有効になりません。 OSSイベントが関連する関数をトリガーするまで、約30秒待つ必要があります。

サンプルシナリオ

OSSトリガーを設定し、プレフィックスをソーステストになり、サフィックスが. rar. zipトリガールールで 圧縮されたファイルがソースまたはテスト指定されたOSSバケット内のディレクトリで、ファイルサフィックスは. rarまたは. zip、関数がトリガーされます。 関数の実行後、解凍されたファイルは同じバケットの別のディレクトリに保存されます。

始める前に

手順1: EventBridgeベースのOSSトリガーを作成する

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 機能の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[トリガー] をクリックします。 次に、[トリガーの作成] をクリックします。

  4. [トリガーの作成] パネルで、[トリガーの種類] ドロップダウンリストから [Alibaba Cloudサービスのイベントトリガー][Object Storage Service (OSS)] を選択し、その他のパラメーターを設定して [OK] をクリックします。 下表に、各パラメーターを説明します。

    パラメーター

    説明

    名前

    トリガー名を入力します。

    oss-trigger

    バージョンまたはエイリアス

    エイリアスまたはバージョンを選択します。 デフォルト値: LATEST。 別のバージョンまたはエイリアスのトリガーを作成する場合は、関数の詳細ページのバージョンまたはエイリアスドロップダウンリストからバージョンまたはエイリアスを選択します。 バージョンとエイリアスの詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。

    LATEST

    バケット名

    作成したバケットを選択します。

    バケット-zh ****

    オブジェクトプレフィックス

    照合するオブジェクト名のプレフィックスを入力します。 ネストされたループによる追加コストを回避するために、Function Computeでオブジェクトプレフィックスとオブジェクトサフィックスを指定することを推奨します。

    [+ Object Prefixの追加] をクリックすると、Object Prefixパラメーターのエントリを追加できます。

    重要

    プレフィックスはスラッシュ (/) で始めることはできません。 それ以外の場合、OSSトリガーはトリガーできません。

    • source

    • test

    オブジェクト接尾辞

    照合するオブジェクト名のサフィックスを入力します。 ネストされたループによる追加コストを回避するために、Function Computeでオブジェクトプレフィックスとオブジェクトサフィックスを指定することを推奨します。

    [+ Object Suffix] をクリックすると、Object Suffixパラメーターのエントリを追加できます。

    png

    イベントタイプ

    1つ以上のトリガーイベントを選択します。 Function ComputeでのOSSイベントタイプの定義の詳細については、「」をご参照ください。

    oss:ObjectCreated:PutObjectoss:ObjectCreated:PostObject、およびoss:ObjectCreated:CompleteMultipartUpload

    イベントパターンの内容

    [オブジェクトプレフィックス][オブジェクトサフィックス] 、および [イベントタイプ] パラメーターを設定すると、このパラメーターが自動的に設定されます。

    重要

    Event Pattern Contentパラメーターを変更するときは注意してください。 誤操作はトリガリングの失敗につながる可能性があります。 イベントパターンを変更するかどうかを決める前に、イベントパターンのルールを理解しておく必要があります。 詳細については、「イベントパターン」をご参照ください。

    {
        "source":[
            "acs.oss"
        ]
    }

    呼び出しメソッド

    関数の呼び出しに使用するメソッドを選択します。 デフォルト値: Sync Invocation。

    • 同期呼び出し: イベントが関数をトリガーした後、function Computeは実行が完了すると実行結果を返します。 この方法は、幅広いシナリオに適しています。 詳細については、「」をご参照ください。

    • 非同期呼び出し: イベントが関数をトリガーした後、function Computeはすぐに応答を返し、関数が少なくとも1回実行されるようにします。 ただし、詳細な実行結果は返されません。 この呼び出し方法は、高いスケジューリング待ち時間を有する関数に適している。 詳細については、「概要」をご参照ください。

    同期呼び出し

    トリガー状態

    トリガーの作成直後に有効にするかどうかを指定します。 デフォルトでは、[トリガーの有効化] が選択されています。これは、トリガーが作成された直後に有効になることを示します。

    非該当

    プッシュ形式

    関数の入力パラメータのデータ形式を指定します。 データは、関数のeventパラメーターを使用して渡されます。 有効な値:

    • CloudEvents: イベントデータを共通の形式で記述する仕様 (イベント記述とイベントペイロードデータを含む) 。 この仕様は、異なるサービスとプラットフォーム間のイベント宣言と送信を簡素化するために使用されます。

    • RawData: イベントペイロードデータのみを配信し、CloudEvents形式の他のメタデータ情報を含まない仕様。

    説明

    ネイティブOSSトリガーとEventBridgeベースのOSSトリガーは、異なるプッシュ形式を使用します。 ネイティブOSSトリガーのイベントパラメーターは、OSSによって生成されるイベント形式であるOSSEventsテンプレートをサポートしています。

    CloudEvents

    トリガーが作成されると、[トリガー] タブに表示されます。 トリガーを変更または削除するには、「」をご参照ください。

ステップ2: 関数の入力パラメータを設定する

EventBridgeベースのOSSトリガーのイベントソースは、入力パラメーターとして機能するCloudEvents形式の関数に渡されます。 手動でイベントを関数に渡して、関数をトリガーできます。

  1. 関数の詳細ページの [コード] タブで、[テスト関数] の隣のimage.pngアイコンをクリックし、ドロップダウンリストから [テストパラメーターの設定] を選択します。

  2. [テストパラメーターの設定] パネルで、[新しいテストイベントの作成] または [既存のテストイベントの変更] タブをクリックし、イベント名とイベント内容を入力し、[OK] をクリックします。

    指定されたOSSバケットで指定されたイベントが発生すると、イベントデータはJSON形式でバインドされた関数に送信されます。 イベントデータは、eventパラメーターでFunction Computeに渡されます。 以下にコードの例を示します。

    {
        "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"
    }

    次の表では、イベントのフィールドについて説明します。

    パラメーター

    データ型

    説明

    datacontenttype

    String

    application/json;charset=utf-8

    dataパラメーターのコンテンツタイプ。 datacontenttypeは、application/json;charset=utf-8のみをサポートします。

    aliyunaccountid

    String

    143199913 ****

    Alibaba Cloud アカウントの ID です。 Alibaba CloudアカウントのIDは、Function Computeコンソールの概要ページの参照セクションで取得できます。

    データ

    Struct

    {}

    OSSイベントコンテンツ。JSONオブジェクトです。 CloudEventsには、イベントの発生時にOSSによって定義されたコンテキストが含まれます。 この情報は、データパラメータにカプセル化される。

    件名

    String

    acs:oss:cn-hangzhou:143199913 ****:bucket-zh ****/source/a.png

    イベントの件名。

    形式: acs:oss:<region >:< your_account_id >:< your_bucket> <region> は、関数の作成時に選択したリージョンを示します。 <your_account_id> は、Alibaba CloudアカウントのIDを示します。 <your_bucket> は、同じリージョンで作成したバケットの名前を示します。

    aliyunoriginalaccountid

    String

    143199913 ****

    Alibaba Cloud アカウントの ID です。

    ソース

    String

    acs.oss

    イベントソース。 値はacs.ossに固定されています。

    タイプ

    String

    oss:ObjectCreated:PutObject

    イベントタイプ。

    aliyunpublishtime

    Timestamp

    2023-11-04T08:49:26.745Z

    イベントが受信された時刻。

    specversion

    String

    1.0

    CloudEvents仕様のバージョン。

    aliyuneventbusname

    String

    default

    イベントを受信するイベントバスの名前。

    id

    String

    6364D216511B143733C5A67B

    イベントID。

    時間

    Timestamp

    2023-11-04T08:49:26Z

    イベントが発生した時刻。

    aliyunregionid

    String

    cn-hangzhou

    イベントが受信された地域。

    aliyunpublishaddr

    String

    140.205.XX.XX

    イベントを受信するサーバーのIPアドレス。

    ビジネス要件に基づいて、Eventパラメーターのデータフィールドを設定します。

    • userIdentity.principalId: Alibaba CloudアカウントのID。

    • region: 関数を作成したときに選択したリージョン。

    • oss.bucket.name: 関数と同じリージョンに作成されたバケットの名前。

    • oss.bucket.arn: バケットのAlibaba Cloudリソース名 (ARN) 。acs:<region >:< your_account_id >:< your_bucket> 形式です。 <region> は、関数の作成時に選択したリージョンを示します。 <your_account_id> は、Alibaba CloudアカウントのIDを示します。 <your_bucket> は、同じリージョンで作成したバケットの名前を示します。

    • oss.bucket.ownerIdentity: Alibaba CloudアカウントのID。

    • object.key: 宛先バケットにアップロードしたオブジェクト。

      説明

      指定されたオブジェクトが指定されたバケットに存在することを確認します。 それ以外の場合、関数を実行できないか、実行に失敗します。 この例では、source/a.pngが使用されます。

ステップ3: 関数の書き込みとテスト

トリガーを作成した後、関数コードを記述し、関数をテストしてコードが正しいかどうかを確認できます。 OSSイベントが発生すると、関数は自動的にトリガーされます。

警告

コード内のループトリガーを回避する必要があります。 さもなければ、不必要な費用が発生する。 たとえば、オブジェクトがOSSバケットにアップロードされると、アップロード操作によって関数がトリガーされます。 次に、関数は1つ以上のオブジェクトを生成し、オブジェクトをOSSバケットに書き込み、書き込み操作によって関数が再びトリガーされます。 これはループにつながります。 詳細については、「トリガールール」をご参照ください。

  1. [関数の詳細] ページのコードタブで、コードエディターでコードを記述し、デプロイをクリックします。

    次のセクションでは、必要な準備とサンプルコードについて説明します。

    説明

    関数内でOSSリソースからデータを読み書きする場合は、OSSの内部エンドポイントを使用してOSSリソースにアクセスすることを推奨します。 パブリックエンドポイントを使用する場合、インターネット経由で転送されたデータに対して課金されます。 OSS内部エンドポイントの形式の詳細については、「リージョンとエンドポイント」をご参照ください。

    /* Preparations:
    1. Run the following commands on the client to create the package.json file and install the jimp module. 
      a. Run the npm init command on the client to create the package.json file. 
      b. Run the npm install jimp command 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,
             /*
             The AccessKey pair of an Alibaba Cloud account can be used to access all API operations. Using these credentials to perform operations in Function Compute is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. 
             We recommend that you do not save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources under your account may be compromised. 
             In this example, the AccessKey ID and AccessKey secret are obtained 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 the 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 handler of the function 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
        # The AccessKey pair of an Alibaba Cloud account can be used to access all API operations. Using these credentials to perform operations in Function Compute is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. 
        # We recommend that you do not save the AccessKey ID and AccessKey secret to your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources in your account may be compromised. 
        # In this example, the AccessKey ID and AccessKey secret are obtained 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 the 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 handler of the function is index.handler. 
    */
    
    <?php
      use OSS\OssClient;
    function handler($event, $context) {
      $event           = json_decode($event, $assoc = true);
      /*
        The AccessKey pair of an Alibaba Cloud account can be used to access all API operations. Using these credentials to perform operations in Function Compute is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. 
        We recommend that you do not save the AccessKey ID and AccessKey secret to your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources in your account may be compromised. 
        In this example, the AccessKey ID and AccessKey secret are obtained 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 the pom.xml file. 
    <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. テスト機能 をクリックします。

    関数の実行後、[コード] タブで結果を表示できます。

よくある質問

追加情報

  • 設定できるOSSイベントタイプの詳細については、「」をご参照ください。

  • 既存のトリガーを変更または削除する場合は、「」をご参照ください。

  • トリガー関連の問題:

    • 関数をトリガーするイベントを確認する場合は、コードにイベントタイプのログを印刷するようにシステムを指定できます。 詳細は、「ログレコード」をご参照ください。

    • 関数を使用して別の関数を呼び出す場合は、API操作を使用して関数を呼び出すか、関数ワークフローを使用して関数を調整できます。 呼び出された関数の実行に時間がかかり、非同期呼び出しが必要な場合は、非同期呼び出し用の宛先サービスを設定できます。 詳細については、「関数はお互いを呼び出すことができますか?」と「 非同期呼び出しの宛先を設定」をご参照ください。