Function ComputeコンソールでネイティブのObject Storage Service (OSS) トリガーを作成して、特定のOSSイベントが関数の実行をトリガーできるようにすることができます。 これにより、ファイルのアップロードなどのイベントに簡単に対応できます。 イベントリスニングロジックをコードに追加することなく、完全なプロセスをすばやく実装できます。
サンプルシナリオ
OSSトリガーを設定し、トリガールールでプレフィックスをsource
に設定できます。 指定されたOSSバケットのソース
ディレクトリにイメージが保存されると、この関数は自動的にトリガーされます。 この関数はイメージのサイズを変更し、処理されたイメージを同じバケットの処理済み
ディレクトリに保存します。 たとえば、source/a.png
イメージはprocessed/a.png
として処理されます。
始める前に
Function Compute
Object Storage Service
制限事項
最大10個のネイティブOSSトリガーをバケットに関連付けることができます。
説明より多くのOSSトリガーをバケットに関連付ける場合は、EventBridgeベースのOSSトリガーを使用します。 10を超えるOSSトリガーをバケットに関連付けないことを推奨します。 10を超えるOSSトリガーが必要な場合は、新しいバケットを作成し、新しいバケットに基づいてOSSトリガーを作成できます。
ネイティブOSSトリガーとEventBridgeベースのOSSトリガーの両方で、設定したオブジェクトプレフィックスとサフィックスに基づいて、ファジーマッチングと正規表現マッチングはサポートされません。 複数のオブジェクトプレフィックスとサフィックスを設定する場合は、EventBridgeベースのOSSトリガーを使用できます。
手順1: OSSトリガーの作成
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
機能の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[トリガー] をクリックします。 次に、[トリガーの作成] をクリックします。
トリガーの作成パネルで、パラメーターを設定し、OK をクリックします。
パラメーター
説明
例
トリガータイプ
トリガーのタイプ。 [OSS] を選択します。
OSS
名前
トリガー名を入力します。
oss-trigger
バージョンまたはエイリアス
バージョンまたはエイリアス。 デフォルト値はLATESTです。 別のバージョンまたはエイリアスのトリガーを作成する場合は、関数の詳細ページのバージョンまたはエイリアスドロップダウンリストからバージョンまたはエイリアスを選択します。 バージョンとエイリアスの詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。
LATEST
バケット名
OSS バケットの名前。 ドロップダウンリストからOSSバケットを選択します。
testbucket
オブジェクトプレフィックス
一致させるオブジェクトのプレフィックス。 ネストされたループによって生成される余分なコストを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスを設定することを推奨します。 バケットの異なるトリガーに同じイベントタイプを指定した場合、プレフィックスとサフィックスを同じにすることはできません。 詳細については、「」をご参照ください。
重要プレフィックスはスラッシュ (
/
) で始めることはできません。 それ以外の場合、OSSトリガーはトリガーできません。source
オブジェクト接尾辞
一致させるオブジェクトのサフィックスです。 ネストされたループによって生成される余分なコストを防ぐために、オブジェクトプレフィックスとオブジェクトサフィックスを設定することを推奨します。 バケットの異なるトリガーに同じイベントタイプを指定した場合、プレフィックスとサフィックスを同じにすることはできません。 詳細については、「トリガールール」をご参照ください。
png
トリガーイベント
トリガーイベント。 ドロップダウンリストから1つ以上のトリガーイベントを選択します。 OSSイベントタイプの詳細については、「」をご参照ください。
たとえば、oss:ObjectCreated:PutObjectを選択できます。
oss:ObjectCreated:PutObject
、oss:ObjectCreated:PostObject
、およびoss:ObjectCreated:CompleteMultipartUpload
ロール名
ロールの名前です。 この例では、AliyunOSSEventNotificationRoleが選択されています。
説明上記のパラメーターを設定したら、[OK] をクリックします。 このタイプのトリガーを初めて作成する場合は、表示されるメッセージの [今すぐ許可] をクリックします。
AliyunOSSEventNotificationRole
ステップ2: 関数の入力パラメータを設定する
OSSイベントソースは、入力パラメーターとして機能するイベントの形式で関数に渡されます。 手動でイベントを関数に渡して、関数をトリガーできます。
関数の詳細ページの [コード] タブで、[テスト関数] の隣のアイコンをクリックし、ドロップダウンリストから [テストパラメーターの設定] を選択します。
[テストパラメーターの設定] パネルで、[新しいテストイベントの作成] または [既存のテストイベントの変更] タブをクリックし、イベント名とイベント内容を入力し、[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イベントが発生すると、関数の実行がトリガーされます。
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; }
クリックテスト機能.
関数の実行後、[コード] タブで結果を表示できます。
トラブルシューティング
追加情報
設定できるOSSイベントタイプの詳細については、「OSSイベントトリガーの概要」をご参照ください。
10を超えるOSSトリガーをバケットに関連付ける場合は、「EventBridgeベースのOSSトリガーの設定」をご参照ください。
トリガー関連の問題:
どのイベントが関数をトリガーするかを確認する場合は、コードにイベントタイプのログを印刷するようにシステムを指定できます。 詳細は、「ログレコード」をご参照ください。
関数を使用して別の関数を呼び出す場合は、API操作を使用して関数を呼び出すか、関数ワークフローを使用して関数を調整できます。 呼び出された関数の実行に時間がかかり、非同期呼び出しが必要な場合は、非同期呼び出し用の宛先サービスを設定できます。 詳細については、「関数はお互いを呼び出すことができますか?」と「 非同期呼び出しの宛先を設定」をご参照ください。