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 トリガーを作成する
Function Compute コンソール にログオンします。左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。[関数] ページで、管理する関数をクリックします。
関数詳細ページで、[構成] タブをクリックします。左側のナビゲーションウィンドウで、[トリガー] をクリックします。次に、[トリガーの作成] をクリックします。
[トリガーの作成] パネルで、以下に概説するようにパラメーターを構成します。次に、[OK] をクリックします。
パラメーター
構成手順
例
トリガータイプ
OSS を選択します。
OSS
名前
トリガーの名前をカスタマイズします。
oss-trigger
バージョンまたはエイリアス
関数のバージョンまたはエイリアスを指定します。デフォルト値は LATEST です。別のバージョンまたはエイリアスのトリガーを作成する場合は、[関数詳細] ページの [バージョンまたはエイリアス] ドロップダウンリストからバージョンまたはエイリアスを選択します。バージョンとエイリアスの詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。
LATEST
バケット名
作成したバケットを選択します。
testbucket
オブジェクトプレフィックス
バケット内のどのオブジェクトが関数の実行をトリガーするかを定義するオブジェクトプレフィックスを指定します。再帰ループによって予期しないコストが発生するのを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスの両方を構成することをお勧めします。バケット内の異なるトリガーに同じイベントタイプを指定する場合は、それぞれに異なるプレフィックスと異なるサフィックスを構成する必要があります。詳細については、「トリガールール」をご参照ください。
重要プレフィックスはスラッシュ (
/) で始めることはできません。そうしないと、OSS トリガーは機能しません。source
オブジェクトサフィックス
バケット内のどのオブジェクトが関数の実行をトリガーするかを定義するオブジェクトサフィックスを指定します。再帰的なトリガーによって予期しないコストが発生するのを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスの両方を構成することをお勧めします。バケット内の異なるトリガーに同じイベントタイプを指定する場合は、それぞれに異なるプレフィックスと異なるサフィックスを構成する必要があります。詳細については、「トリガールール」をご参照ください。
png
トリガーイベント
ドロップダウンリストから 1 つ以上のトリガーイベントを選択します。OSS イベントタイプの詳細については、「OSS イベント」をご参照ください。
この例では、oss:ObjectCreated:PutObject が選択されています。
oss:ObjectCreated:PutObject、oss:ObjectCreated:PostObject、oss:ObjectCreated:CompleteMultipartUpload、oss:ObjectCreated:PutSymlinkロール名
OSS が Function Compute をトリガーするために使用するロールを指定します。この例では、AliyunOSSEventNotificationRole が選択されています。
説明上記のパラメーターを構成した後、[OK] をクリックします。このタイプのトリガーを初めて作成する場合は、表示されるメッセージの [今すぐ承認] をクリックします。
AliyunOSSEventNotificationRole
トリガーが作成されると、[トリガー] タブに表示されます。トリガーを変更または削除するには、「トリガー管理」をご参照ください。
手順 2:(オプション)入力パラメーターを構成する
OSS が関数をトリガーすると、イベントオブジェクトの形式で情報を関数に渡します。コードを使用して、イベントを解析および処理できます。コードが期待どおりに機能するかどうかをテストするために、event を手動で関数に渡して、トリガーイベントをシミュレートできます。
関数詳細ページの [コード] タブで、
アイコン([関数のテスト] の横)をクリックし、ドロップダウンリストから [テストパラメーターの構成] を選択します。[テストパラメーターの構成] パネルで、[新しいテストイベントの作成] タブまたは [既存のテストイベントの変更] タブをクリックし、イベント名とイベントコンテンツを入力して、[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 バケットにアップロードされることによって関数がトリガーされます。実行後、関数は新しいオブジェクトを生成し、それらを同じバケットにアップロードして戻します。これにより、関数が再度トリガーされ、無限ループが発生します。詳細については、「トリガールール」をご参照ください。
[コード] タブ([関数詳細] ページ)で、コードエディターにコードを記述し、[デプロイ] をクリックします。
オンラインコード編集をサポートするランタイムのサンプルコードは次のとおりです。
説明関数で 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; }
関数をテストします。
方法 1:
eventを構成してイベントソースをシミュレートした場合は、[関数のテスト] をクリックします。方法 2: ページで、[バケット名] をクリックして対応するバケットに移動し、指定されたプレフィックスとサフィックスで画像をアップロードします。次に、[関数詳細] ページの [ログ] タブに移動して実行ログを表示し、バケットの保存先ディレクトリで処理された画像を確認することもできます。


FAQ
関連情報
OSS イベントタイプの詳細については、「OSS イベント」をご参照ください。
既存のトリガーを変更または削除する場合は、「トリガーの変更」をご参照ください。
10 個を超える OSS トリガーをバケットに関連付ける場合は、「EventBridge ベースの OSS トリガーの構成」をご参照ください。
トリガー関連の問題:
どのイベントが関数をトリガーするかを確認する場合は、コードでイベントタイプログを出力するようにシステムを指定できます。詳細については、「ログ」をご参照ください。
関数内で別の関数を呼び出すには、API 呼び出しを介してターゲット関数を呼び出すか、CloudFlow を使用して関数を調整できます。呼び出された関数の実行に時間がかかり、非同期呼び出しが含まれる場合は、非同期呼び出しの保存先サービスを構成できます。詳細については、「関数は相互に呼び出すことができますか?」および「非同期呼び出し」をご参照ください。