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
バケット作成についての 詳細については、「OSSコンソールでのバケットの作成」をご参照ください。
手順1: OSSトリガーの作成
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
[関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[トリガー] タブをクリックし、[バージョンまたはエイリアス] ドロップダウンリストからバージョンまたはエイリアスを選択し、[トリガーの作成] をクリックします。
[トリガーの作成] パネルでパラメーターを設定し、[OK] をクリックします。 下表に、各パラメーターを説明します。
パラメーター
説明
例
トリガータイプ
トリガーのタイプを指定します。 この例では、[OSS] を選択します。
OSS
名前
トリガー名を入力します。
oss-trigger
バージョンまたはエイリアス
サービスのバージョンまたはエイリアスを指定します。 デフォルト値はLATESTです。 別のバージョンまたはエイリアスのトリガーを作成する場合は、関数の詳細ページのバージョンまたはエイリアスドロップダウンリストからバージョンまたはエイリアスを選択します。 バージョンとエイリアスの詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。
LATEST
バケット名
バケットを選択します。 この例では、ドロップダウンリストから作成したバケットを選択します。
testbucket
オブジェクトプレフィックス
一致させたいオブジェクト名のプレフィックスを入力します。 ループのネストによる余分なコストを防ぐために、プレフィックスとサフィックスを設定することを推奨します。 バケット内の異なるトリガーに同じイベントタイプを指定した場合、プレフィックスまたはサフィックスを同じにすることはできません。 詳細については、「トリガールール」をご参照ください。
重要オブジェクトプレフィックスの先頭にスラッシュ (
/
) を付けることはできません。 それ以外の場合、OSSトリガーはトリガーできません。source
オブジェクト接尾辞
一致させたいオブジェクト名のサフィックスを入力します。 ループのネストによる余分なコストを防ぐために、プレフィックスとサフィックスを設定することを推奨します。 バケット内の異なるトリガーに同じイベントタイプを指定した場合、プレフィックスまたはサフィックスを同じにすることはできません。 詳細については、「トリガールール」をご参照ください。
png
トリガーイベント
ドロップダウンリストから1つ以上のトリガーイベントを選択します。 OSSイベントタイプの詳細については、「OSSイベント」をご参照ください。
oss:ObjectCreated:PutObject
、oss:ObjectCreated:PostObject
、およびoss:ObjectCreated:CompleteMultipartUpload
ロール名
AliyunOSSEventNotificationRoleを選択します。
説明上記のパラメーターを設定したら、[OK] をクリックします。 このタイプのトリガーを初めて作成する場合は、表示されるメッセージの [今すぐ許可] をクリックします。
AliyunOSSEventNotificationRole
トリガーが作成されると、[トリガー] タブに表示されます。 既存のトリガーを変更または削除するには、「トリガーの管理」をご参照ください。
ステップ2: 関数の入力パラメータを設定する
OSSイベントは、eventという名前の入力パラメーターとして関数に渡されます。 手動でイベントを関数に渡して、関数をトリガーできます。
関数の詳細ページで、コードタブをクリックし、隣のアイコンテスト機能を選択し、テストパラメーターの設定ドロップダウンリストから
テストパラメーターの設定パネルで、新しいテストイベントの作成または既存のテストイベントの変更タブを選択し、イベント名とコードエディターでイベントの内容を設定して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つ以上のオブジェクトを生成し、書き込み操作によってこの関数が再びトリガーされます。 これはループにつながります。 詳細については、「トリガールール」をご参照ください。
関数の詳細ページで、コードタブで、コードエディターに関数コードを入力し、デプロイをクリックします。
このセクションでは、オンライン編集をサポートするランタイムのサンプルコードを示します。
説明関数内で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; }
コードタブで、テスト機能をクリックします。
関数の実行後、[コード] タブで結果を表示できます。
よくある質問
関連ドキュメント
設定できるOSSイベントタイプの詳細については、「OSSイベントトリガーの概要」をご参照ください。
Function Computeコンソールとは別に、次の方法を使用してトリガーを設定できます。
サーバーレスDevs。 詳細については、「トリガー関連のコマンド」をご参照ください。
SDK。 詳細は、SDK をご参照ください。
既存のトリガーを変更または削除する場合は、「トリガーの設定の変更」をご参照ください。
10を超えるOSSトリガーをバケットに関連付ける場合は、「Configure an EventBridge-based OSS trigger」をご参照ください。
トリガー
どのイベントが関数をトリガーするかを確認する場合は、コードにイベントタイプのログを印刷するようにシステムを設定できます。 詳細は、「ログレコード」をご参照ください。
関数を使用して別の関数を呼び出す場合は、API操作を指定して関数を呼び出すか、CloudFlowを使用して関数を調整できます。 呼び出された関数の実行に時間がかかり、非同期呼び出しが必要な場合は、非同期呼び出し用の宛先サービスを設定できます。 詳細については、「関数はお互いを呼び出すことができますか?」と「 非同期呼び出しの宛先を設定」」をご参照ください。