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

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

最終更新日:Sep 09, 2024

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

サンプルシナリオ

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

制限事項

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

    説明

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

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

前提条件

  • Function Compute

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

      説明

      サービスを作成するときに、サービスの関数がロールの権限を取得できるようにサービスロールを構成します。 それ以外の場合、関数コードをテストするときにエラーが報告されます。 この例では、サービスロールはAliyunFCDefaultRoleで、AliyunOSSFullAccess権限があります。 サービスロールの詳細については、「他のAlibaba Cloudサービスへのアクセス権限の付与」をご参照ください。

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

  • OSS

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

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

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

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

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

  5. [トリガーの作成] パネルでパラメーターを設定し、[OK] をクリックします。 下表に、各パラメーターを説明します。

    パラメーター

    説明

    トリガータイプ

    トリガーのタイプを指定します。 この例では、[OSS] を選択します。

    OSS

    名前

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

    oss-trigger

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

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

    LATEST

    バケット名

    バケットを選択します。 この例では、ドロップダウンリストから作成したバケットを選択します。

    testbucket

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

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

    重要

    オブジェクトプレフィックスの先頭にスラッシュ (/) を付けることはできません。 それ以外の場合、OSSトリガーはトリガーできません。

    source

    オブジェクト接尾辞

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

    png

    トリガーイベント

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

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

    ロール名

    AliyunOSSEventNotificationRoleを選択します。

    説明

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

    AliyunOSSEventNotificationRole

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

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

OSSイベントは、eventという名前の入力パラメーターとして関数に渡されます。 手動でイベントを関数に渡して、関数をトリガーできます。

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

  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イベントの内容。

    バケット

    地図

    OSSバケットの詳細。

    name

    String

    testbucket

    バケットの名前です。

    arn

    String

    acs:oss:cn-hangzhou:123456789:testbucket

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

    ownerIdentity

    String

    164901546557 ****

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

    オブジェクト

    地図

    OSSオブジェクトの詳細。

    サイズ

    Int

    122539

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

    deltaSize

    Int

    122539

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

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

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

    eTag

    String

    688A7BF4F233DC9C88A80BF985AB ****

    オブジェクトタグ。

    キー

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

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

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

      説明

      関数内で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 the source images and persist the images to the specified destination path in the OSS bucket to back up the images. 
      
      
      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 back up 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/")
          // Scale 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:
      * Parse the OSS event trigger information from event. 
      * Initialize the OSS bucket client based on the obtained information. 
      * Resize the source images and persist the images to the specified destination path in the OSS bucket to back up images. 
      
      
      This sample code is mainly doing the following things:
      * Get OSS processing related information from event.
      * Initiate OSS client with target bucket.
      * Resize the source image and then store the processed image into the same bucket's copy folder to back up the image.
      
      """
      
      # -*- coding: utf-8 -*-
      import oss2, json
      import base64
      
      def handler(event, context):
          # You can use context.credentials to obtain the key information. 
          # Access keys can be fetched through context.credentials
          print("The content in context entity is: \n")
          print(context)
          creds = context.credentials
      
          # Configure the permissions for the OSS SDK. 
          # Setup auth, required by OSS sdk.
          auth = oss2.StsAuth(
              creds.access_key_id,
              creds.access_key_secret,
              creds.security_token)
      
          print("The content in event entity is: \n")
          print(event)
          # Load event content.
          oss_raw_data = json.loads(event)
          # Get oss event related parameters passed by oss trigger.
          oss_info_map = oss_raw_data['events'][0]['oss']
          # Get oss bucket name.
          bucket_name = oss_info_map['bucket']['name']
          # Set oss service endpoint.
          endpoint = 'oss-' + oss_raw_data['events'][0]['region'] + '-internal.aliyuncs.com'
          # Initiate oss client.
          bucket = oss2.Bucket(auth, endpoint, bucket_name)
          object_name = oss_info_map['object']['key']
      
          # Download original image from oss bucket.
          remote_stream = bucket.get_object(object_name)
          if not remote_stream:
              print(f'{object_name} does not exist in bucket {bucket_name}')
              return
          # Processed images will be saved to processed/
          processed_path = object_name.replace('source/', 'processed/')
      
          # Scale images to a fixed width and height of 128 px. 
          style = 'image/resize,m_fixed,w_128,h_128'
          # Specify the name of the processed image. If the image is not stored in the root directory of the bucket, you must add the full path of the image. Example: exampledir/example.jpg. 
          process = "{0}|sys/saveas,o_{1},b_{2}".format(style,
              oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(processed_path))),
              oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(bucket_name))))
          result = bucket.process_object(object_name, process)
          print(result)
      /*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 the source images and persist the images to the specified destination path in the OSS bucket to back up the images. 
      *
      *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 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 Resource Access Management (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);
              // Scale 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イベントトリガーの概要」をご参照ください。

  • Function Computeコンソールとは別に、次の方法を使用してトリガーを設定できます。

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

  • 10を超えるOSSトリガーをバケットに関連付ける場合は、「Configure an EventBridge-based OSS trigger」をご参照ください。

  • トリガー

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

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