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

Function Compute:ネイティブ OSS トリガーを構成する

最終更新日:May 14, 2025

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

シナリオ例

OSS トリガーを構成し、トリガールールでオブジェクトプレフィックスパラメーターを source に設定できます。この場合、指定された OSS バケットの source ディレクトリに画像が保存されると、関数が自動的にトリガーされます。その後、関数は画像のサイズを変更し、処理された画像を同じバケットの processed ディレクトリに保存します。たとえば、source/a.png 画像は processed/a.png として処理されます。

前提条件

  • Function Compute がアクティブ化されています。

  • OSS がアクティブ化され、バケットが作成されています。

サービスクォータ

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

    説明

    同じバケットにさらに多くの OSS トリガーを関連付ける場合は、EventBridge ベースの OSS トリガーの使用を検討してください。EventBridge を使用してバケットごとに 10 個を超えるトリガーを設定することは技術的には可能ですが、新しいバケットを作成してそこにトリガーを構成することをお勧めします。

  • ネイティブ OSS トリガーと EventBridge ベースの OSS トリガー はどちらも、構成されたオブジェクトのプレフィックスとサフィックスのあいまい一致または正規表現一致をサポートしていません。

  • ネイティブ OSS トリガーは、1 つのオブジェクトプレフィックスと 1 つのサフィックス構成のみをサポートします。複数のプレフィックスまたはサフィックスを指定するには、EventBridge ベースの OSS トリガーを使用します。

手順 1:OSS トリガーを作成する

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

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

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

  4. [トリガーの作成] パネルで、以下に概説するようにパラメーターを構成します。次に、[OK] をクリックします。

    パラメーター

    構成手順

    トリガータイプ

    OSS を選択します。

    OSS

    名前

    トリガーの名前をカスタマイズします。

    oss-trigger

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

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

    LATEST

    バケット名

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

    testbucket

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

    バケット内のどのオブジェクトが関数の実行をトリガーするかを定義するオブジェクトプレフィックスを指定します。再帰ループによって予期しないコストが発生するのを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスの両方を構成することをお勧めします。バケット内の異なるトリガーに同じイベントタイプを指定する場合は、それぞれに異なるプレフィックスと異なるサフィックスを構成する必要があります。詳細については、「トリガールール」をご参照ください。

    重要

    プレフィックスはスラッシュ (/) で始めることはできません。そうしないと、OSS トリガーは機能しません。

    source

    オブジェクトサフィックス

    バケット内のどのオブジェクトが関数の実行をトリガーするかを定義するオブジェクトサフィックスを指定します。再帰的なトリガーによって予期しないコストが発生するのを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスの両方を構成することをお勧めします。バケット内の異なるトリガーに同じイベントタイプを指定する場合は、それぞれに異なるプレフィックスと異なるサフィックスを構成する必要があります。詳細については、「トリガールール」をご参照ください。

    png

    トリガーイベント

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

    この例では、oss:ObjectCreated:PutObject が選択されています。

    oss:ObjectCreated:PutObjectoss:ObjectCreated:PostObjectoss:ObjectCreated:CompleteMultipartUploadoss:ObjectCreated:PutSymlink

    ロール名

    OSS が Function Compute をトリガーするために使用するロールを指定します。この例では、AliyunOSSEventNotificationRole が選択されています。

    説明

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

    AliyunOSSEventNotificationRole

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

手順 2:(オプション)入力パラメーターを構成する

OSS が関数をトリガーすると、イベントオブジェクトの形式で情報を関数に渡します。コードを使用して、イベントを解析および処理できます。コードが期待どおりに機能するかどうかをテストするために、event を手動で関数に渡して、トリガーイベントをシミュレートできます。

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

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

    説明

    トリガーの作成からの情報に基づいてイベントコンテンツを構成します。指定されたオブジェクトが OSS バケットに存在することを確認してください。そうしないと、関数がトリガーされないか、実行が失敗します。この例では、オブジェクトは 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",
                        "objectMeta": {
                           "mimeType": "application/zip",
                           "userMeta": {
                              "x-oss-meta-last-modified":"20250213"
                           }
                        },
                        "size": 122539
                    },
                    "ossSchemaVersion": "1.0",
                    "ruleId": "9adac8e253828f4f7c0466d941fa3db81161****"
                },
                "region": "cn-hangzhou",
                "requestParameters": {
                    "sourceIPAddress": "140.205.XX.XX"
                },
                "responseElements": {
                    "requestId": "58F9FF2D3DF792092E12044C"
                },
                "userIdentity": {
                    "principalId": "164901546557****"
                }
            }
        ]
    }

    次の表は、イベントオブジェクトのパラメーターについて説明しています。

    パラメーター

    タイプ

    説明

    eventName

    文字列

    ObjectCreated:PutObject

    イベントのタイプ。

    eventSource

    文字列

    acs:oss

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

    eventTime

    文字列

    2022-08-13T06:45:43.000Z

    イベントが発生した時刻。値は ISO 8601 標準時刻形式です。

    eventVersion

    文字列

    1.0

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

    oss

    マップ

    イベントのコンテンツ。

    bucket

    マップ

    バケット の詳細。

    name

    文字列

    testbucket

    バケット名。

    arn

    文字列

    acs:oss:cn-hangzhou:123456789:testbucket

    バケットの Alibaba Cloud Resource Name (ARN)。

    ownerIdentity

    文字列

    164901546557****

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

    object

    マップ

    オブジェクト の詳細。

    size

    整数

    122539

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

    deltaSize

    整数

    122539

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

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

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

    eTag

    文字列

    688A7BF4F233DC9C88A80BF985AB****

    オブジェクトタグ。

    key

    文字列

    source/a.png

    オブジェクト名。

    objectMeta

    マップ

    objectMeta パラメーターの詳細。

    mimeType

    文字列

    application/zip

    オブジェクトタイプ。詳細については、「Content-Type ヘッダーを構成する方法」をご参照ください。

    userMeta

    マップ

    ユーザーメタデータ。オブジェクトの目的または属性を識別します。

    x-oss-meta-last-modified

    文字列

    20250213

    ユーザーメタデータは、一連のキーと値のペアで構成されます。ユーザーメタデータヘッダーの名前は、x-oss-meta- で始まる必要があります。この例では、キーと値のペア "x-oss-meta-last-modified":"20250213" は、オブジェクトがオンプレミスマシンで 2025 年 2 月 13 日に最後に変更されたことを示しています。詳細については、「ユーザーメタデータ」をご参照ください。

    ossSchemaVersion

    文字列

    1.0

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

    ruleId

    文字列

    9adac8e253828f4f7c0466d941fa3db81161****

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

    region

    文字列

    cn-hangzhou

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

    requestParameters

    マップ

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

    sourceIPAddress

    文字列

    140.205.XX.XX

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

    responseElements

    マップ

    レスポンスの詳細。

    requestId

    文字列

    58F9FF2D3DF792092E12044C

    リクエスト ID。

    userIdentity

    マップ

    ユーザー属性。

    principalId

    文字列

    164901546557****

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

手順 3:関数コードを記述してテストする

OSS トリガーを作成したら、関数コードの記述とテストに進むことができます。OSS イベントが発生すると、関数の実行がトリガーされます。

警告

コードで再帰ループを防ぐ必要があります。典型的なシナリオでは、オブジェクトが OSS バケットにアップロードされることによって関数がトリガーされます。実行後、関数は新しいオブジェクトを生成し、それらを同じバケットにアップロードして戻します。これにより、関数が再度トリガーされ、無限ループが発生します。詳細については、「トリガールール」をご参照ください。

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

    • オンラインコード編集をサポートするランタイムのサンプルコードは次のとおりです。

      説明

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

      "use strict";
      /*
      次の機能を実装するためにサンプルコードが使用されます。
      * 1. イベントオブジェクトから OSS トリガー情報を解析します。
      * 2. 取得した情報に基づいて OSS クライアントを初期化します。
      * 3. ソース画像のサイズを変更し、処理された画像を OSS バケットの指定された保存先ディレクトリに保存して、画像バックアップを実装します。
      */
      
      const OSS = require("ali-oss");
      
      exports.handler = async function(event, context, callback) {
          console.log("context エンティティのコンテンツ:\n");
          console.dir(context);
      
          const {accessKeyId, accessKeySecret, securityToken} = context.credentials;
      
          const events = JSON.parse(event.toString()).events;
          console.log("event エンティティのコンテンツ:\n");
          console.dir(events);
      
          let objectName = events[0].oss.object.key;
          let region = events[0].region;
          let bucketName = events[0].oss.bucket.name;
      
          // OSS バケットに接続します。
          const client = new OSS({
              region: region,
              accessKeyId: accessKeyId,
              accessKeySecret: accessKeySecret,
              stsToken: securityToken,
              bucket: bucketName,
              endpoint: "https://oss-" + region + "-internal.aliyuncs.com"
          });
      
          console.log("client エンティティ:\n");
          console.dir(events);
      
          const targetImage = objectName.replace("source/", "processed/")
          // 画像のサイズを固定の幅と高さ 128 px に変更します。
          const processStr = "image/resize,m_fixed,w_128,h_128"
          // 処理された画像を保存先ディレクトリに保存します。
          const result = await client.processObjectSave(
              objectName,
              targetImage,
              processStr,
              bucketName
          );
          console.log(result.res.status);
      
          callback(null, "done");
      }
      """
      次の機能を実装するためにサンプルコードが使用されます。
      * イベントオブジェクトから OSS トリガー情報を解析します。
      * 取得した情報に基づいて OSS クライアントを初期化します。
      * ソース画像のサイズを変更し、処理された画像を OSS バケットの指定された保存先ディレクトリに保存して、画像バックアップを実装します。
      
      """
      
      # -*- coding: utf-8 -*-
      import oss2, json
      import base64
      
      def handler(event, context):
          # context.credentials を使用して AccessKey ペアを取得できます。
          print("context エンティティのコンテンツ:\n")
          print(context)
          creds = context.credentials
      
          # OSS SDK の権限を構成します。
          auth = oss2.StsAuth(
              creds.access_key_id,
              creds.access_key_secret,
              creds.security_token)
      
          print("event エンティティのコンテンツ:\n")
          print(event)
          # イベントコンテンツを読み込みます。
          oss_raw_data = json.loads(event)
          # oss トリガーによって渡された oss イベント関連パラメーターを取得します。
          oss_info_map = oss_raw_data['events'][0]['oss']
          # oss バケット名を取得します。
          bucket_name = oss_info_map['bucket']['name']
          # oss サービスエンドポイントを設定します。
          endpoint = 'oss-' + oss_raw_data['events'][0]['region'] + '-internal.aliyuncs.com'
          # oss クライアントを開始します。
          bucket = oss2.Bucket(auth, endpoint, bucket_name)
          object_name = oss_info_map['object']['key']
      
          # oss バケットから元の画像をダウンロードします。
          remote_stream = bucket.get_object(object_name)
          if not remote_stream:
              print(f'{object_name} はバケット {bucket_name} に存在しません')
              return
          # 処理された画像は processed/ に保存されます
          processed_path = object_name.replace('source/', 'processed/')
      
          # 画像のサイズを固定の幅と高さ 128 px に変更します。
          style = 'image/resize,m_fixed,w_128,h_128'
          # 処理された画像の名前を指定します。バケットのルートディレクトリに保存されていない画像の場合は、完全なパスを含める必要があります。例: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)
      /*次の機能を実装するためにサンプルコードが使用されます。
      * 1. リクエストからエンドポイント、バケット、およびオブジェクト情報を解析します。
      * 2. 取得した情報に基づいて OSS クライアントを初期化します。
      * 3. ソース画像のサイズを変更し、処理された画像を OSS バケットの指定された保存先ディレクトリに保存して、画像バックアップを実装します。
      */
      <?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);
        /*
          Alibaba Cloud アカウントの AccessKey ID と AccessKey シークレットを使用して、すべての API 操作にアクセスできます。これらの認証情報を使用して Function Compute で操作を実行することは、リスクの高い操作です。Resource Access Management (RAM) ユーザーを使用して API 操作を呼び出したり、日常的な O&M を実行することをお勧めします。
          AccessKey ペアをプロジェクトコードに保存しないことをお勧めします。この機密情報が漏洩した場合、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。
          この例では、AccessKey ペアはコンテキストから取得されます。
        */
        $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 {
              // OSS に接続します。
              $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
              // 画像のサイズを固定の幅と高さ 128 px に変更します。
              $style = "image/resize,m_fixed,w_128,h_128";
              $process = $style.
                 '|sys/saveas'.
                 ',o_'.base64url_encode($targetObject).
                 ',b_'.base64url_encode($bucketName);
              // 処理された画像を指定された保存先ディレクトリに保存します。
              $result = $ossClient->processObject($bucketName, $objectName, $process);
              // 処理結果を出力します。
              print($result);
          } catch (OssException $e) {
              print_r(__FUNCTION__ . ": FAILED\n");
              printf($e->getMessage() . "\n");
          }
      
          print(__FUNCTION__ . ": OK" . "\n");
      
          return $targetObject;
      }
  2. 関数をテストします。

    方法 1:event を構成してイベントソースをシミュレートした場合は、[関数のテスト] をクリックします。

    方法 2:[構成] > [トリガー] ページで、[バケット名] をクリックして対応するバケットに移動し、指定されたプレフィックスとサフィックスで画像をアップロードします。次に、[関数詳細] ページの [ログ] タブに移動して実行ログを表示し、バケットの保存先ディレクトリで処理された画像を確認することもできます。

    image

    image

FAQ

関連情報

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

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

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

  • トリガー関連の問題:

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

    • 関数内で別の関数を呼び出すには、API 呼び出しを介してターゲット関数を呼び出すか、CloudFlow を使用して関数を調整できます。呼び出された関数の実行に時間がかかり、非同期呼び出しが含まれる場合は、非同期呼び出しの保存先サービスを構成できます。詳細については、「関数は相互に呼び出すことができますか?」および「非同期呼び出し」をご参照ください。