OSS トリガーに複数のファイルプレフィックスとサフィックスを設定したり、単一の OSS バケットに 10 個を超えるトリガーを関連付けたりするには、EventBridge ベースの OSS トリガーを作成して、ファイルアップロードなどのイベントを処理できます。
注意事項
EventBridge ベースの OSS トリガーは、ネイティブ OSS トリガーとは異なります。次の点にご注意ください。
ネイティブ OSS トリガーは、バケットごとに最大 10 個のトリガーをサポートします。1 つのバケットに 10 個を超える OSS トリガーが必要な場合は、EventBridge ベースの OSS トリガーを使用してください。
説明通常、単一のバケットに 10 個を超えるトリガーを関連付けないでください。さらに多くのトリガーが必要な場合は、新しいバケットを作成し、そのバケットにトリガーを設定してください。
EventBridge ベースの OSS トリガーは、EventBridge と同じリソース制限に従います。最大 50 個の EventBridge ベースの OSS トリガーを作成できます。詳細については、「制限事項」をご参照ください。
EventBridge ベースの OSS トリガーは、意味的な一意性を必要としません。[イベントタイプ]、[ファイルプレフィックス]、および [ファイルサフィックス] の組み合わせは、一意である必要はありません。
EventBridge ベースの OSS トリガーでは、複数の [ファイルプレフィックス] および [ファイルサフィックス] をサポートしています。ただし、[ファイルプレフィックス] および [ファイルサフィックス] は、あいまい一致または正規表現によるマッチングをサポートしていません。
EventBridge ベースの OSS トリガーを作成した後、アクティブになるまで約 30 秒かかります。Object Storage Service (OSS) の操作は、トリガーがアクティブになった後にのみ関数をトリガーできます。
シナリオ例
この例では、プレフィックス source と test、およびサフィックス .rar と .zip を持つ OSS トリガーを設定する方法を示します。.rar または .zip サフィックスを持つ圧縮ファイルが、指定された OSS バケットの source または test ディレクトリにアップロードされると、関数が自動的に実行されます。関数が実行された後、解凍されたファイルは同じバケット内の別のディレクトリに保存されます。
前提条件
EventBridge
Function Compute
Object Storage Service (OSS)
ステップ 1:EventBridge ベースの OSS トリガーの作成
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[サービスと関数] をクリックします。
上部のナビゲーションバーでリージョンを選択します。[サービス] ページで、目的のサービスをクリックします。
- [関数] ページで、管理する関数をクリックします。
- 関数の詳細ページで、[トリガー] タブをクリックし、[バージョンまたはエイリアス] ドロップダウンリストからバージョンまたはエイリアスを選択し、[トリガーの作成] をクリックします。
[トリガーの作成] パネルで、[クラウドサービスイベントトリガー] の下にある [トリガータイプ] を [Object Storage Service (OSS)] に設定します。残りの設定を構成し、[OK] をクリックします。
設定項目
操作
このトピックでの例
名前
カスタムのトリガー名を入力します。
oss-trigger
バージョンまたはエイリアス
デフォルト値は [LATEST] です。別のバージョンまたはエイリアスのトリガーを作成するには、まず関数の詳細ページの [バージョンまたはエイリアス] ドロップダウンリストからそれを選択します。バージョンとエイリアスの詳細については、「バージョンの管理」および「エイリアスの管理」をご参照ください。
LATEST
バケット名
現在のリージョンで作成された OSS バケットを選択します。
bucket-zh****
ファイルプレフィックス
一致させるファイル名のプレフィックスを入力します。Function Compute は、余分な料金を引き起こす循環ループを避けるために、プレフィックスとサフィックスの両方を設定することを推奨します。
複数のファイルプレフィックスを追加するには、コンソールで[+ ファイルプレフィックスを追加]をクリックします。
重要ファイルプレフィックスは
/で始めることはできません。そうしないと、OSS トリガーはアクティブになりません。source
test
ファイルサフィックス
一致させるファイル名のサフィックスを入力します。Function Compute は、余分な料金を引き起こす循環ループを避けるために、プレフィックスとサフィックスの両方を設定することを推奨します。
複数の [ファイル拡張子] を追加するには、コンソールで [+ ファイル拡張子の追加] をクリックします。
png
イベントタイプ
1 つ以上のトリガーイベントを選択します。Object Storage Service (OSS) のイベントタイプについては、「OSS イベントの定義」をご参照ください。
oss:ObjectCreated:PutObject、oss:ObjectCreated:PostObject、oss:ObjectCreated:CompleteMultipartUploadイベントパターン
このフィールドは、[ファイルプレフィックス]、[ファイルサフィックス]、および [トリガーイベント] を設定した後に自動的に入力されます。
重要必要な場合を除き、[イベントパターン] を変更しないでください。誤った変更はトリガーの失敗を引き起こす可能性があります。変更を行う前に、イベントパターンのルールを理解してください。詳細については、「イベントパターン」をご参照ください。
{ "source":[ "acs.oss" ] }呼び出しメソッド
関数の呼び出しメソッドを選択します。デフォルトは同期呼び出しです。
同期呼び出し
トリガーステータス
作成後すぐにトリガーを有効にするかどうかを選択します。デフォルトでは、[トリガーを有効にする] が選択されています。
トリガーを有効にする
ペイロード形式
関数の入力パラメーターのデータ形式を指定します。データは関数の Event パラメーターを介して渡されます。
CloudEvents:イベントデータを記述するための標準形式です。イベントのメタデータとペイロードを含み、サービスやプラットフォーム間でのイベントの宣言と転送を簡素化します。
RawData:CloudEvents のメタデータなしで、イベントペイロードのみを配信します。
説明[ペイロード形式] は、ネイティブ OSS トリガーと EventBridge ベースの OSS トリガーで異なります。ネイティブ OSS トリガーは、Alibaba Cloud Object Storage Service (OSS) によって生成されるイベント形式である [OSSEvents] テンプレートをサポートします。
CloudEvents
トリガーが作成されると、[トリガー] タブに表示されます。既存のトリガーを変更または削除するには、「トリガーの管理」をご参照ください。
ステップ 2:関数の入力パラメーターの設定
EventBridge ベースの OSS トリガーは、CloudEvents テンプレートを使用してイベントデータを関数に渡します。手動でイベントを関数に渡して、トリガーイベントをシミュレートできます。
「関数詳細」ページで、[関数コード] タブをクリックします。次に、[関数をテスト] の右側にある
アイコンをクリックし、ドロップダウンリストから [テストパラメーターの設定] を選択します。[テストパラメーターの設定] パネルで、[新しいテストイベントの作成] タブまたは [既存のテストイベントの編集] タブを選択します。[イベント名] とイベントの内容を入力し、[OK] をクリックします。
イベントは Function Compute の入力パラメーターです。OSS バケットで指定されたイベントが発生すると、イベントデータは JSON 形式でバインドされた関数に送信されます。形式は次のとおりです。
{ "datacontenttype": "application/json;charset=utf-8", "aliyunaccountid": "143199913****", "data": { "eventVersion": "1.0", "responseElements": { "requestId": "6364D216511B143733C5A67B" }, "eventSource": "acs:oss", "eventTime": "2023-11-04T08:49:26.000Z", "requestParameters": { "sourceIPAddress": "140.205.XX.XX" }, "eventName": "ObjectCreated:PutObject", "userIdentity": { "principalId": "143199913****" }, "region": "cn-hangzhou", "oss": { "bucket": { "name": "bucket-zh***", "arn": "acs:oss:cn-hangzhou:143199913****:bucket-zh***", "virtualBucket": "", "ownerIdentity": "143199913****" }, "ossSchemaVersion": "1.0", "object": { "size": 13, "objectMeta": { "mimeType": "text/plain" }, "deltaSize": 13, "eTag": "59CA0EFA9F5633CB0371BBC0355478D8", "key": "source/a.png" } } }, "subject": "acs:oss:cn-hangzhou:143199913****:bucket-zh***/source/a.png", "aliyunoriginalaccountid": "143199913****", "source": "acs.oss", "type": "oss:ObjectCreated:PutObject", "aliyunpublishtime": "203-11-04T08:49:26.745Z", "specversion": "1.0", "aliyuneventbusname": "default", "id": "6364D216511B143733C5A67B", "time": "2023-11-04T08:49:26Z", "aliyunregionid": "cn-hangzhou" }次の表に、イベントパラメーターのフィールドを示します。
パラメーター
タイプ
値の例
説明
datacontenttype
String
application/json;charset=utf-8
data パラメーターのコンテンツタイプ。datacontenttype は application/json;charset=utf-8 のみをサポートします。
aliyunaccountid
String
143199913****
Alibaba Cloud アカウント ID。Alibaba Cloud アカウント ID は、Function Compute コンソールの [概要] ページの [一般情報] セクションで確認できます。
data
{}
JSON オブジェクトとしての OSS イベントコンテンツ。CloudEvents は、OSS で定義されたコンテキストを data フィールドにラップします。
subject
String
acs:oss:cn-hangzhou:143199913****:bucket-zh****/source/a.png
イベントの件名。
フォーマット:
acs:oss:<region>:<your_account_id>:<your_bucket>。<region>を関数の作成時に選択したリージョンに、<your_account_id>をご利用の Alibaba Cloud アカウント ID に、<your_bucket>を同じリージョン内の実際のバケット名に置き換えます。aliyunoriginalaccountid
String
143199913****
Alibaba Cloud アカウント ID。
source
String
acs.oss
イベントソース。OSS トリガーの場合、これは常に
acs.ossです。type
String
oss:ObjectCreated:PutObject
イベントタイプ。
aliyunpublishtime
Timestamp
2023-11-04T08:49:26.745Z
イベントが受信された時刻。
specversion
String
1.0
CloudEvents プロトコルのバージョン。
aliyuneventbusname
String
default
イベントを受信するイベントバスの名前。
id
String
6364D216511B143733C5A67B
イベント ID。
time
Timestamp
2023-11-04T08:49:26Z
イベントが発生した時刻。
aliyunregionid
String
cn-hangzhou
イベントが受信されたリージョン。
aliyunpublishaddr
String
140.205.XX.XX
イベントを受信したサーバーアドレス。
設定に基づいて、イベントパラメーターの data セクションの次のフィールドを更新します。
userIdentity.principalId:ご利用の Alibaba Cloud アカウント ID に置き換えます。region:関数の作成時に選択したリージョンに置き換えます。oss.bucket.name:同じリージョン内のバケットの名前に置き換えます。oss.bucket.arn:フォーマットはacs:oss:<region>:<your_account_id>:<your_bucket>です。<region>を関数の作成時に選択したリージョンに、<your_account_id>をご利用の Alibaba Cloud アカウント ID に、<your_bucket>を同じリージョン内のバケットの名前に置き換えます。oss.bucket.ownerIdentity:ご利用の Alibaba Cloud アカウント ID に置き換えます。object.key:ターゲットバケットにアップロードされた実際のファイルに置き換えます。説明指定されたファイルが設定されたバケットに存在することを確認してください。この例では、ファイルは source/a.png です。そうでない場合、関数はトリガーされないか、実行に失敗します。
ステップ 3:関数コードの作成とテスト
OSS トリガーを作成した後、関数コードを作成してテストし、その正しさを確認できます。OSS イベントが発生すると、関数は自動的に実行されます。
不要な課金を防ぐため、コード内で循環トリガーを避けてください。一般的な循環トリガーのシナリオは、OSS バケットへのファイルアップロードが関数をトリガーし、その関数が 1 つ以上のファイルを同じバケットに書き戻す場合です。このアクションは再び関数をトリガーし、ループを作成します。詳細については、「OSS トリガーのルール」をご参照ください。
関数の詳細ページで、[コード] タブをクリックします。エディターでコードを記述し、[コードのデプロイ] をクリックします。
次のセクションでは、準備とコード例について説明します。
説明関数が OSS リソースからデータを読み取ったり、書き込んだりする必要がある場合は、パブリックネットワーク料金を避けるために OSS 内部エンドポイントを使用することを推奨します。OSS 内部エンドポイントのフォーマットの詳細については、「リージョンとエンドポイント」をご参照ください。
/* 事前準備: 1. ターミナルで次のコマンドを実行して、package.json と jimp 画像処理モジュールをインストールします。 a. npm init を実行して package.json を作成します。 b. npm install jimp を実行して jimp モジュールをインストールします。 2. 関数のハンドラが index.handler であることを確認します。 */ 'use strict'; console.log('関数をロードしています...'); var oss = require('ali-oss'); var fs = require('fs'); var jimp = require("jimp"); module.exports.handler = function (eventBuf, ctx, callback) { console.log('受信したイベント:', eventBuf.toString()); var event = JSON.parse(eventBuf); var ossEvent = event.data; // OSS リージョンは「oss-」プレフィックスを使用します。例:「oss-cn-shanghai」。 var ossRegion = "oss-" + ossEvent.region; // OSS クライアントを作成します。 var client = new oss({ region: ossRegion, /* Alibaba Cloud アカウントの AccessKey は、すべての API へのアクセス権限を持ちます。API 呼び出しや日常の運用保守には、RAM ユーザーを使用することを推奨します。 コードに AccessKey ID と AccessKey Secret をハードコーディングしないでください。AccessKey が漏洩すると、アカウント配下のすべてのリソースが危険にさらされる可能性があります。 この例では、コンテキストから AccessKeyId と AccessKeySecret を取得します。 */ accessKeyId: ctx.credentials.accessKeyId, accessKeySecret: ctx.credentials.accessKeySecret, stsToken: ctx.credentials.securityToken }); // イベントからバケット名を取得します。 client.useBucket(ossEvent.oss.bucket.name); // 処理されたイメージを processed/ ディレクトリに保存します。 var newKey = ossEvent.oss.object.key.replace("source/", "processed/"); var tmpFile = "/tmp/processed.png"; // OSS オブジェクトを取得します。 console.log('オブジェクトを取得しています:', ossEvent.oss.object.key) client.get(ossEvent.oss.object.key).then(function (val) { // バッファーから OSS オブジェクトのコンテンツを読み取ります。 jimp.read(val.content, function (err, image) { if (err) { console.error("イメージの読み取りに失敗しました"); callback(err); return; } // イメージのサイズを変更し、一時ファイルに保存します。 image.resize(128, 128).write(tmpFile, function (err) { if (err) { console.error("イメージのローカルへの書き込みに失敗しました"); callback(err); return; } // 処理されたイメージを新しい名前で OSS にアップロードします。 console.log('オブジェクトを配置しています:', newKey); client.put(newKey, tmpFile).then(function (val) { console.log('オブジェクトを配置しました:', val); callback(null, val); return; }).catch(function (err) { console.error('オブジェクトの配置に失敗しました: %j', err); callback(err); return; }); }); }); }).catch(function (err) { console.error('オブジェクトの取得に失敗しました: %j', err); callback(err); return }); };# 事前準備: # 1. 関数のサービスにアタッチされたロールに OSS アクセス権限があることを確認します。RAM コンソールにログインして、ロールに OSS 権限を付与します。 # 2. 関数のハンドラが index.handler であることを確認します。 # -*- coding: utf-8 -*- import oss2, json from wand.image import Image def handler(event, context): evt = json.loads(event) creds = context.credentials # OSS SDK に必要 # Alibaba Cloud アカウントの AccessKey は、すべての API へのアクセス権限を持ちます。API 呼び出しや日常の運用保守には、RAM ユーザーを使用することを推奨します。 # コードに AccessKey ID と AccessKey Secret をハードコーディングしないでください。AccessKey が漏洩すると、アカウント配下のすべてのリソースが危険にさらされる可能性があります。 # この例では、コンテキストから AccessKeyId と AccessKeySecret を取得します。 auth=oss2.StsAuth( creds.access_key_id, creds.access_key_secret, creds.security_token) evt = evt['data'] bucket_name = evt['oss']['bucket']['name'] endpoint = 'oss-' + evt['region'] + '-internal.aliyuncs.com' bucket = oss2.Bucket(auth, endpoint, bucket_name) objectName = evt['oss']['object']['key'] # 処理されたイメージは processed/ に保存されます newKey = objectName.replace("source/", "processed/") remote_stream = bucket.get_object(objectName) if not remote_stream: return remote_stream = remote_stream.read() with Image(blob=remote_stream) as img: with img.clone() as i: i.resize(128, 128) new_blob = i.make_blob() bucket.put_object(newKey, new_blob)/* 事前準備: 1. 関数のサービスにアタッチされたロールに OSS アクセス権限があることを確認します。RAM コンソールにログインして、ロールに OSS 権限を付与します。 2. 関数のハンドラが index.handler であることを確認します。 */ <?php use OSS\OssClient; function handler($event, $context) { $event = json_decode($event, $assoc = true); /* Alibaba Cloud アカウントの AccessKey は、すべての API へのアクセス権限を持ちます。API 呼び出しや日常の運用保守には、RAM ユーザーを使用することを推奨します。 コードに AccessKey ID と AccessKey Secret をハードコーディングしないでください。AccessKey が漏洩すると、アカウント配下のすべてのリソースが危険にさらされる可能性があります。 この例では、コンテキストから AccessKey と AccessSecretKey を取得します。 */ $accessKeyId = $context["credentials"]["accessKeyId"]; $accessKeySecret = $context["credentials"]["accessKeySecret"]; $securityToken = $context["credentials"]["securityToken"]; $evt = $event['data']; $bucketName = $evt['oss']['bucket']['name']; $endpoint = 'oss-' . $evt['region'] . '-internal.aliyuncs.com'; $objectName = $evt['oss']['object']['key']; $newKey = str_replace("source/", "processed/", $objectName); try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken); $content = $ossClient->getObject($bucketName , $objectName); if ($content == null || $content == "") { return; } $imagick = new Imagick(); $imagick->readImageBlob($content); $imagick->resizeImage(128, 128, Imagick::FILTER_LANCZOS, 1); $ossClient->putObject($bucketName, $newKey, $imagick->getImageBlob()); } catch (OssException $e) { print($e->getMessage()); } }[コード] タブの [関数のテスト] ボタンをクリックします。
実行後、[コード] タブの上部に結果が表示されます。
よくある質問
参考情報
設定可能な OSS イベントタイプの詳細については、「OSS イベントの定義」をご参照ください。
トリガーの変更または削除については、「トリガー設定の更新」をご参照ください。
トリガー関連の質問
どのイベントが関数実行をトリガーしたかを特定するには、コード内でイベントタイプをログに記録します。詳細については、「ログレコード」をご参照ください。
関数内から別の関数を呼び出すには、API 呼び出しを使用するか、CloudFlow で関数をオーケストレーションします。時間のかかる非同期操作の場合は、非同期呼び出しの送信先を設定できます。詳細については、「関数は互いに呼び出し可能ですか?」および「非同期呼び出しの送信先の設定」をご参照ください。