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

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

最終更新日:Sep 09, 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秒待つ必要があります。

サンプルシナリオ

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

前提条件

  • EventBridge

  • Function Compute

    • サービスが作成されていること。 詳しくは、「サービスの作成」をご参照ください。

    • 関数が作成されます。 詳細については、「関数の作成」をご参照ください。

  • OSS

    • バケット作成についての 詳細については、「バケットの作成」をご参照ください。

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

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

  2. 上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。

  3. [関数] ページで、管理する関数をクリックします。

  4. 関数の詳細ページで、[トリガー] タブをクリックし、[バージョンまたはエイリアス] ドロップダウンリストからバージョンまたはエイリアスを選択し、[トリガーの作成] をクリックします。

  5. トリガーの作成パネルで、Object Storage Service (OSS)Alibaba Cloudサービスのイベントトリガーからトリガータイプドロップダウンリストをクリックし、他のパラメータを設定し、OK をクリックします。

    パラメーター

    説明

    名前

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

    oss-trigger

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

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

    LATEST

    バケット名

    現在のリージョンで作成されているバケットを選択します。

    バケット-zh ****

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

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

    [+ File Prefixの追加] をクリックすると、Object Prefixのエントリを追加できます。

    重要

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

    • source

    • test

    オブジェクト接尾辞

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

    [+ ファイルサフィックスの追加] をクリックすると、オブジェクトサフィックスのエントリを追加できます。

    png

    イベントタイプ

    ドロップダウンリストから1つ以上のトリガーイベントを選択します。 OSSイベントタイプの詳細については、「OSSイベント」をご参照ください。

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

    イベントパターンの内容

    [オブジェクトプレフィックス][オブジェクトプレフィックス] 、および [イベントタイプ] を設定すると、システムは自動的にこのパラメーターの値を入力します。

    重要

    イベントパターンコンテンツを変更するときは注意してください。 そうしないと、トリガーのトリガーに失敗する可能性があります。 イベントパターンを変更するかどうかを決める前に、イベントパターンのルールを理解してください。 詳細については、「イベントパターン」をご参照ください。

    {
        "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. 関数の詳細ページで、コードタブをクリックし、xialatubiao隣のアイコンテスト機能を選択し、ドロップダウンリストからテストパラメーターの設定を選択します。

  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: 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バケットにアップロードされると、アップロード操作によって関数がトリガーされます。 次に、この関数はOSSバケットに書き込まれる1つ以上のオブジェクトを生成し、書き込み操作によってこの関数が再びトリガーされます。 これはループにつながります。 詳細については、「トリガールール」をご参照ください。

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

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

    説明

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

    /* Preparations:
    1. Run the following command 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 handler of the function 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 has permissions on 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: 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 RAM role configured for the service to which the function belongs 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 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 has permissions on 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 RAM role configured for the service to which the function belongs 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 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 has permissions on 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 Access Key pair is 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());
      }
    }
  2. コードタブで、テスト機能をクリックします。

    実行が完了したら、[コード] タブで実行結果を表示できます。

よくある質問

関連ドキュメント

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

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

  • トリガー

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

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