Function Compute コンソールでネイティブ OSS トリガーを作成および設定できます。Object Storage Service (OSS) で特定のイベントが発生すると、トリガーが自動的に関数を呼び出します。これにより、ファイルアップロードなどのイベントに簡単に応答し、コードにイベントリッスンロジックを追加することなく、完全なワークフローを迅速に実装できます。
利用シーンの例
OSS トリガーを設定し、そのオブジェクトプレフィックスを source に設定できます。指定された OSS バケットの source ディレクトリに画像がアップロードされると、トリガーは自動的に関数を呼び出します。関数は画像のサイズを変更し、同じバケットの processed ディレクトリに保存します。たとえば、関数は source/a.png を処理し、結果を processed/a.png として保存します。
前提条件
-
Function Compute
-
Object Storage Service (OSS)
制限事項
-
1 つのバケットには、最大 10 個のネイティブ OSS トリガーを設定できます。
説明バケットにさらに多くの OSS トリガーを関連付ける必要がある場合は、EventBridge ベースの OSS トリガーを作成できます。ただし、1 つのバケットに 10 個を超えるトリガーを関連付けることは推奨しません。さらに必要な場合は、新しいバケットを作成してトリガーを設定することを検討してください。
-
ネイティブ OSS トリガーと EventBridge ベースの OSS トリガーは、オブジェクトプレフィックスとサフィックスのワイルドカードまたは正規表現マッチングをサポートしていません。
-
ネイティブ OSS トリガーは、1 つのオブジェクトプレフィックスと 1 つのオブジェクトサフィックスのみをサポートします。複数のプレフィックスまたはサフィックスを設定するには、EventBridge ベースの OSS トリガーを使用してください。
ステップ 1: OSS トリガーの作成
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択します。[関数] ページで、対象の関数をクリックします。
-
関数詳細ページで、トリガー タブを選択し、トリガーの作成 をクリックします。[トリガーの作成] パネルでパラメーターを設定し、OK をクリックします。
パラメーター
操作
例
トリガータイプ
OSS を選択します。
OSS
名前
トリガーのカスタム名を入力します。
oss-trigger
バージョンまたはエイリアス
デフォルト値は LATEST です。別のバージョンまたはエイリアスのトリガーを作成する場合は、まず関数詳細ページの バージョンまたはエイリアス ドロップダウンリストから選択する必要があります。バージョンとエイリアスの詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。
LATEST
バケット名
作成した OSS バケットを選択します。
testbucket
オブジェクトプレフィックス
一致させるオブジェクト名のプレフィックスを入力します。追加料金の原因となる再帰的なトリガー呼び出しを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスの両方を指定することを推奨します。さらに、同じバケット内の異なるトリガーが同じイベントタイプを共有する場合、それらのプレフィックスとサフィックスは同一であってはなりません。詳細については、「OSS トリガーのトリガールール」をご参照ください。
重要オブジェクトプレフィックスはスラッシュ (
/) で始めることはできません。そうしないと、トリガーを呼び出すことができません。source
オブジェクトのサフィックス
一致させるオブジェクト名のサフィックスを入力します。追加料金の原因となる再帰的なトリガー呼び出しを防ぐために、プレフィックスとサフィックスの両方を指定することを強く推奨します。さらに、同じバケット内の異なるトリガーが同じイベントタイプを共有する場合、それらのプレフィックスとサフィックスは同一であってはなりません。詳細については、「OSS トリガーのトリガールール」をご参照ください。
png
トリガーイベント
1 つ以上のトリガーイベントを選択します。OSS のイベントタイプの詳細については、「OSS イベントの定義」をご参照ください。
この例では oss:ObjectCreated:PutObject を使用します。
oss:ObjectCreated:PutObject、oss:ObjectCreated:PostObject、oss:ObjectCreated:CompleteMultipartUpload、oss:ObjectCreated:PutSymlinkロール名
AliyunOSSEventNotificationRole を選択します。
説明このタイプのトリガーを初めて作成する場合、OK をクリックした後に表示されるダイアログボックスで 今すぐ権限付与 をクリックします。
AliyunOSSEventNotificationRole
トリガーが作成されると、[トリガー名] リストに表示されます。トリガーを変更または削除するには、「トリガーの管理」をご参照ください。
ステップ 2: (オプション) 関数の入力パラメーターの設定
OSS イベントソースは、データを event オブジェクトとして関数に渡します。コード内でこのオブジェクトを解析して処理できます。また、サンプルの event を手動で関数に渡してトリガーをシミュレートし、コードをテストすることもできます。
関数の詳細ページの [コード] タブで、[テスト機能] の横にある
アイコンをクリックし、ドロップダウンリストから [テストパラメーターの設定] を選択します。-
テストパラメーターの設定 パネルで、新規テストイベントの作成 または 既存のテストイベントの変更 タブを選択します。イベント名とイベント内容を入力し、[OK] をクリックします。
説明トリガーを作成したときに提供した情報に基づいてイベント内容を設定します。指定したオブジェクト (この例では
source/a.png) がバケットに存在することを確認してください。そうしないと、関数が呼び出されないか、呼び出しが失敗します。イベントは FC 関数の入力パラメーターです。指定された OSS バケットでオブジェクトが作成または削除されると、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
String
ObjectCreated:PutObject
イベントタイプ。
eventSource
String
acs:oss
イベントソース。値は
acs:ossに固定されています。eventTime
String
2022-08-13T06:45:43.000Z
イベントが発生した時刻 (ISO 8601 形式)。
eventVersion
String
1.0
イベントプロトコルのバージョン。
oss
Map
OSS イベントの詳細が含まれます。
bucket
Map
bucket パラメーターの値。
name
String
testbucket
バケットの名前。
arn
String
acs:oss:cn-hangzhou:123456789:testbucket
バケットの一意の識別子。
ownerIdentity
String
164901546557****
バケットを作成したユーザーの ID。
object
Map
object パラメーターの内容。
size
Int
122539
object のサイズ。単位:バイト。
deltaSize
Int
122539
object のサイズの変更。単位:バイト。
-
新しいオブジェクトが追加された場合、この値はオブジェクトサイズです。
-
既存のオブジェクトが同じ名前のオブジェクトで上書きされた場合、この値は新しいオブジェクトと古いオブジェクトのサイズの差です。
eTag
String
688A7BF4F233DC9C88A80BF985AB****
オブジェクトの ETag。
key
String
source/a.png
オブジェクトの完全なパス。
objectMeta
Map
objectMeta パラメーターの内容。
mimeType
String
application/zip
オブジェクトのファイルタイプ。詳細については、「mimeType」をご参照ください。
userMeta
Map
オブジェクトの目的または属性を識別するユーザーメタデータ。
x-oss-meta-last-modified
String
20250213
ユーザーメタデータはキーと値のペアで構成されます。メタデータキーは
x-oss-meta-で始まる必要があります。たとえば、ペア"x-oss-meta-last-modified":"20250213"は、ローカルファイルが 2025 年 2 月 13 日に最後に変更されたことを示します。詳細については、「ユーザーメタデータ」をご参照ください。ossSchemaVersion
String
1.0
OSS スキーマバージョン。
ruleId
String
9adac8e253828f4f7c0466d941fa3db81161****
イベントが一致したトリガールールの ID。
region
String
cn-hangzhou
バケットのリージョン。
requestParameters
Map
リクエストパラメーター。
sourceIPAddress
String
140.205.XX.XX
リクエストのソース IP アドレス。
responseElements
Map
応答要素。
requestId
String
58F9FF2D3DF792092E12044C
リクエスト ID。
userIdentity
Map
リクエストを行ったユーザーの ID。
principalId
String
164901546557****
リクエストを開始した Alibaba Cloud アカウントの ID。
-
ステップ 3: 関数コードの作成とテスト
OSS トリガーを作成した後、関数コードを作成してテストし、正しく動作することを確認できます。実際のシナリオでは、指定された OSS イベントが発生すると、トリガーが自動的に関数を呼び出します。
コード内で再帰的な呼び出しを防ぐ必要があります。一般的な再帰シナリオは、関数が OSS バケットへのオブジェクトアップロードによってトリガーされる場合に発生します。関数が実行された後、1 つ以上の新しいオブジェクトを生成し、同じバケットに書き戻します。この書き込み操作が再び関数をトリガーし、無限ループを作成します。詳細については、「OSS トリガーのトリガールール」をご参照ください。
-
関数詳細ページの コード タブで、エディターにコードを入力し、デプロイメントコード をクリックします。
-
以下のサンプルコードは、オンライン編集をサポートするランタイム用です。
説明関数内で OSS バケットからデータを読み書きするには、内部エンドポイントを使用することを推奨します。パブリックエンドポイントを使用すると、インターネットデータ転送料金が発生します。内部エンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
"use strict"; /* このサンプルコードは、次の操作を実行する方法を示しています: * 1. イベントから OSS イベント情報を解析します。 * 2. 解析された情報に基づいて OSS クライアントを初期化します。 * 3. ソース画像をリサイズし、同じバケット内の宛先ディレクトリに保存します。 */ 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; // ターゲット 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/") // 画像を幅と高さが 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 クライアントを初期化します。 * ソース画像をリサイズし、宛先ディレクトリに保存します。 """ # -*- coding: utf-8 -*- import oss2, json import base64 def handler(event, context): # context.credentials からキー情報を取得します。 print("The content in context entity is: \n") print(context) creds = context.credentials # 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) # イベントコンテンツをロードします。 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} does not exist in bucket {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. ソース画像をリサイズし、処理後の画像を同じバケット内の宛先ディレクトリに保存します。 */ <?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 ペアは、すべての API 操作に対する権限を持っています。RAM ユーザーを使用して API 操作を呼び出すか、日常の O&M を実行することを推奨します。 プロジェクトコードに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングすると、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: ページで、[バケット名] をクリックして対応するバケットに移動します。指定されたオブジェクトプレフィックスとサフィックスに一致する画像をアップロードします。関数が実行された後、[ログ] タブで実行ログを表示し、バケットの宛先フォルダーで結果を確認できます。
よくある質問
参考
-
設定可能な OSS イベントのタイプについては、「OSS イベントの定義」をご参照ください。
-
トリガーを変更または削除するには、「トリガーの更新」をご参照ください。
-
バケットに 10 個を超える OSS トリガーを関連付ける必要がある場合は、「EventBridge ベースの OSS トリガーの設定」をご参照ください。
-
トリガー関連の問題:
-
どのイベントが関数を呼び出したかを確認するには、コードでイベントタイプをログに記録できます。詳細については、「ログ管理」をご参照ください。
-
別の関数から関数を呼び出すには、直接 API 呼び出しを行うか、CloudFlow を使用してそれらをオーケストレーションできます。長時間実行されるタスクを実行する関数を非同期で呼び出す場合は、呼び出し結果を処理するための送信先を設定できます。詳細については、「関数は互いに呼び出すことができますか?」および「非同期呼び出しの送信先の設定」をご参照ください。
-