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

Function Compute:ネイティブOSSトリガーの設定

最終更新日:Jul 24, 2024

Function ComputeコンソールでネイティブのObject Storage Service (OSS) トリガーを作成して、特定のOSSイベントが関数の実行をトリガーできるようにすることができます。 これにより、ファイルのアップロードなどのイベントに簡単に対応できます。 イベントリスニングロジックをコードに追加することなく、完全なプロセスをすばやく実装できます。

サンプルシナリオ

OSSトリガーを設定し、トリガールールでプレフィックスをsourceに設定できます。 指定されたOSSバケットのソースディレクトリにイメージが保存されると、この関数は自動的にトリガーされます。 この関数はイメージのサイズを変更し、処理されたイメージを同じバケットの処理済みディレクトリに保存します。 たとえば、source/a.pngイメージはprocessed/a.pngとして処理されます。

始める前に

制限事項

  • 最大10個のネイティブOSSトリガーをバケットに関連付けることができます。

    説明

    より多くのOSSトリガーをバケットに関連付ける場合は、EventBridgeベースのOSSトリガーを使用します。 10を超えるOSSトリガーをバケットに関連付けないことを推奨します。 10を超えるOSSトリガーが必要な場合は、新しいバケットを作成し、新しいバケットに基づいてOSSトリガーを作成できます。

  • ネイティブOSSトリガーとEventBridgeベースのOSSトリガーの両方で、設定したオブジェクトプレフィックスとサフィックスに基づいて、ファジーマッチングと正規表現マッチングはサポートされません。 複数のオブジェクトプレフィックスとサフィックスを設定する場合は、EventBridgeベースのOSSトリガーを使用できます。

手順1: OSSトリガーの作成

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

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

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

  4. トリガーの作成パネルで、パラメーターを設定し、OK をクリックします。

    パラメーター

    説明

    トリガータイプ

    トリガーのタイプ。 [OSS] を選択します。

    OSS

    名前

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

    oss-trigger

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

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

    LATEST

    バケット名

    OSS バケットの名前。 ドロップダウンリストからOSSバケットを選択します。

    testbucket

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

    一致させるオブジェクトのプレフィックス。 ネストされたループによって生成される余分なコストを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスを設定することを推奨します。 バケットの異なるトリガーに同じイベントタイプを指定した場合、プレフィックスとサフィックスを同じにすることはできません。 詳細については、「」をご参照ください。

    重要

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

    source

    オブジェクト接尾辞

    一致させるオブジェクトのサフィックスです。 ネストされたループによって生成される余分なコストを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスを設定することを推奨します。 バケットの異なるトリガーに同じイベントタイプを指定した場合、プレフィックスとサフィックスを同じにすることはできません。 詳細については、「トリガールール」をご参照ください。

    png

    トリガーイベント

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

    たとえば、oss:ObjectCreated:PutObjectを選択できます。

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

    ロール名

    ロールの名前です。 この例では、AliyunOSSEventNotificationRoleが選択されています。

    説明

    上記のパラメーターを設定したら、[OK] をクリックします。 このタイプのトリガーを初めて作成する場合は、表示されるメッセージの [今すぐ許可] をクリックします。

    AliyunOSSEventNotificationRole

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

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

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

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

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

    説明

    トリガーに関する情報に基づいてイベントコンテンツを設定します。 指定されたオブジェクトがバケットに存在することを確認します。 この例では、オブジェクトはsource/a.pngです。 それ以外の場合、関数をトリガーできないか、関数の実行に失敗します。

    イベントはFunction Computeの入力パラメーターです。 指定されたOSSバケットにオブジェクトが作成されると、イベントデータはJSON形式で対応する関数に送信されます。 サンプルコード:

    {
        "events": [
            {
                "eventName": "ObjectCreated:PutObject",
                "eventSource": "acs:oss",
                "eventTime": "2022-08-13T06:45:43.000Z",
                "eventVersion": "1.0",
                "oss": {
                    "bucket": {
                        "arn": "acs:oss:cn-hangzhou:123456789:testbucket",
                        "name": "testbucket",
                        "ownerIdentity": "164901546557****"
                    },
                    "object": {
                        "deltaSize": 122539,
                        "eTag": "688A7BF4F233DC9C88A80BF985AB****",
                        "key": "source/a.png",
                        "size": 122539
                    },
                    "ossSchemaVersion": "1.0",
                    "ruleId": "9adac8e253828f4f7c0466d941fa3db81161****"
                },
                "region": "cn-hangzhou",
                "requestParameters": {
                    "sourceIPAddress": "140.205.XX.XX"
                },
                "responseElements": {
                    "requestId": "58F9FF2D3DF792092E12044C"
                },
                "userIdentity": {
                    "principalId": "164901546557****"
                }
            }
        ]
    }

    イベントのパラメーターを次の表に示します。

    パラメーター

    データ型

    説明

    eventName

    String

    ObjectCreated:PutObject

    イベントタイプ。

    eventSource

    String

    acs:oss

    イベントソース。 値をacs.ossに設定します。

    eventTime

    String

    2022-08-13T06:45:43.000Z

    イベントが発生した時刻。 時間は、ISO 8601標準フォーマットに従う。

    eventVersion

    String

    1.0

    イベントプロトコルのバージョン。

    oss

    地図

    OSSイベントの内容。

    bucket

    地図

    OSSバケットの詳細。

    name

    String

    testbucket

    バケットの名前です。

    arn

    String

    acs:oss:cn-hangzhou:123456789:testbucket

    バケットのAlibaba Cloudリソース名 (ARN) 。

    ownerIdentity

    String

    164901546557 ****

    バケットを作成したユーザーのID。

    object

    地図

    OSSオブジェクトの詳細。

    size

    Int

    122539

    OSSオブジェクトのサイズ。 単位: バイト。

    deltaSize

    Int

    122539

    OSSオブジェクトのサイズのバリエーション。 単位: バイト。

    • オブジェクトが追加された場合、このパラメーターの値はオブジェクトのサイズを示します。

    • 新しいオブジェクトが同じ名前の既存のオブジェクトを上書きする場合、このパラメーターの値は、新しいオブジェクトと元のオブジェクトのサイズの違いを示します。

    eTag

    String

    688A7BF4F233DC9C88A80BF985AB ****

    オブジェクトタグ。

    key

    String

    ソース /a.png

    オブジェクト名。

    ossSchemaVersion

    String

    1.0

    OSSスキーマのバージョン。

    ruleId

    String

    9adac8e253828f4f7c0466d941fa3db81161 ****

    イベントに一致するルールのID。

    region

    String

    cn-hangzhou

    バケットが存在するリージョン。

    requestParameters

    地図

    リクエストのパラメーター

    sourceIPAddress

    String

    140.205.XX.XX

    リクエストの送信元のIPアドレス。

    responseElements

    地図

    レスポンス要素。

    requestId

    String

    58F9FF2D3DF792092E12044C

    リクエスト ID。

    userIdentity

    地図

    ユーザーのプロパティ。

    principalId

    String

    164901546557 ****

    リクエストを開始したAlibaba CloudアカウントのID。

ステップ3: 関数コードを記述し、関数をテストする

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

警告

コード内のループを避けます。 ループの例: オブジェクトがOSSバケットにアップロードされると、アップロード操作によって関数がトリガーされ、新しいオブジェクトが生成され、OSSバケットに書き込まれます。 書き込み動作は、この機能を再びトリガする。 その結果、呼び出しループが形成される。 詳細については、「」をご参照ください。

  1. On theコード[関数の詳細] ページのタブで、コードエディターでコードを記述し、デプロイ.

    • このセクションでは、オンライン編集をサポートするランタイムのサンプルコードを示します。

      説明

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

      "use strict";
      /*
      The sample code is used to implement the following features:
      * 1. Parse the OSS event trigger information from event. 
      * 2. Initialize the OSS client based on the obtained information. 
      * 3. Resize source images and persist processed images to the specified destination path in the OSS bucket to implement image backup. 
      
      
      This code sample mainly implements the following functions:
      * 1. Parse the OSS event trigger related information from the event.
      * 2. According to the above information, initialize the OSS client.
      * 3. Resize the source image and then store the processed image into the same bucket's copy folder to backup the image.
      */
      
      const OSS = require("ali-oss");
      
      exports.handler = async function(event, context, callback) {
          console.log("The content in context entity is: \n");
          console.dir(context);
      
          const {accessKeyId, accessKeySecret, securityToken} = context.credentials;
      
          const events = JSON.parse(event.toString()).events;
          console.log("The content in event entity is: \n");
          console.dir(events);
      
          let objectName = events[0].oss.object.key;
          let region = events[0].region;
          let bucketName = events[0].oss.bucket.name;
      
          // Connect to the OSS bucket. 
          // Connect to the target OSS
          const client = new OSS({
              region: region,
              accessKeyId: accessKeyId,
              accessKeySecret: accessKeySecret,
              stsToken: securityToken,
              bucket: bucketName,
              endpoint: "https://oss-" + region + "-internal.aliyuncs.com"
          });
      
          console.log("The client entity is: \n");
          console.dir(events);
      
          const targetImage = objectName.replace("source/", "processed/")
          // Resize images to a fixed width and height of 128 px. 
          const processStr = "image/resize,m_fixed,w_128,h_128"
          // Resize the source images and then store the processed images to the destination directory. 
          const result = await client.processObjectSave(
              objectName,
              targetImage,
              processStr,
              bucketName
          );
          console.log(result.res.status);
      
          callback(null, "done");
      }
      "use strict";
      /*
      The sample code is used to implement the following features:
      * 1. Parse the OSS event trigger information from event. 
      * 2. Initialize the OSS client based on the obtained information. 
      * 3. Resize source images and persist processed images to the specified destination path in the OSS bucket to implement image backup. 
      
      
      This code sample mainly implements the following functions:
      * 1. Parse the OSS event trigger related information from the event.
      * 2. According to the above information, initialize the OSS client.
      * 3. Resize the source image and then store the processed image into the same bucket's copy folder to backup the image.
      */
      
      const OSS = require("ali-oss");
      
      exports.handler = async function(event, context, callback) {
          console.log("The content in context entity is: \n");
          console.dir(context);
      
          const {accessKeyId, accessKeySecret, securityToken} = context.credentials;
      
          const events = JSON.parse(event.toString()).events;
          console.log("The content in event entity is: \n");
          console.dir(events);
      
          let objectName = events[0].oss.object.key;
          let region = events[0].region;
          let bucketName = events[0].oss.bucket.name;
      
          // Connect to the OSS bucket. 
          // Connect to the target OSS
          const client = new OSS({
              region: region,
              accessKeyId: accessKeyId,
              accessKeySecret: accessKeySecret,
              stsToken: securityToken,
              bucket: bucketName,
              endpoint: "https://oss-" + region + "-internal.aliyuncs.com"
          });
      
          console.log("The client entity is: \n");
          console.dir(events);
      
          const targetImage = objectName.replace("source/", "processed/")
          // Resize images to a fixed width and height of 128 px. 
          const processStr = "image/resize,m_fixed,w_128,h_128"
          // Resize the source images and then store the processed images to the destination directory. 
          const result = await client.processObjectSave(
              objectName,
              targetImage,
              processStr,
              bucketName
          );
          console.log(result.res.status);
      
          callback(null, "done");
      }
      /*The sample code is used to implement the following features:
      * 1. Parse the endpoint, bucket, and object information from the request. 
      * 2. Initialize the OSS client based on the obtained information. 
      * 3. Resize source images and persist processed images to the specified destination path in the OSS bucket to implement image backup. 
      *
      *This code sample mainly implements the following functions:
      * 1. Parse out endpoint, bucket, object from request.
      * 2. According to the information obtained above, initialize the OSS client.
      * 3. Resize the source image and then store the processed image into the same bucket's copy folder to backup the image.
      */
      <?php
      
      use RingCentral\Psr7\Response;
      use OSS\OssClient;
      use OSS\Core\OssException;
      
      function base64url_encode($data)
      {
          return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
      }
      
      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['events']{0};
        $bucketName = $evt['oss']['bucket']['name'];
        $endpoint   = 'oss-' . $evt['region'] . '-internal.aliyuncs.com';
        $objectName = $evt['oss']['object']['key'];
        $targetObject = str_replace("source/", "processed/", $objectName);
      
          try {
              // Connect to OSS. 
              // Connect to OSS.
              $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
              // Resize the image to a fixed width and height of 128px. 
              $style = "image/resize,m_fixed,w_128,h_128";
              $process = $style.
                 '|sys/saveas'.
                 ',o_'.base64url_encode($targetObject).
                 ',b_'.base64url_encode($bucketName);
              // Resize image and save the processed images to the destination path. 
              $result = $ossClient->processObject($bucketName, $objectName, $process);
              // Print the processing result. 
              print($result);
          } catch (OssException $e) {
              print_r(__FUNCTION__ . ": FAILED\n");
              printf($e->getMessage() . "\n");
          }
      
          print(__FUNCTION__ . ": OK" . "\n");
      
          return $targetObject;
      }
  2. クリックテスト機能.

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

トラブルシューティング

追加情報

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

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

  • 10を超えるOSSトリガーをバケットに関連付ける場合は、「EventBridgeベースのOSSトリガーの設定」をご参照ください。

  • トリガー関連の問題:

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

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