OSS と Function Compute を統合すると、OSS イベントを使用して関数をトリガーし、カスタムデータ処理を実行できます。このトピックでは、Function Compute における OSS トリガーの制限事項、イベントタイプ、およびトリガールールについて説明します。
背景情報
OSS と Function Compute は、OSS トリガーを介してシームレスに統合されます。OSS イベントを処理する関数を作成できます。OSS で指定されたタイプのイベントが発生すると、対応する関数が自動的にトリガーされます。たとえば、PutObject イベントを処理する関数を設定できます。OSS の PutObject API オペレーションを呼び出して OSS バケットにイメージをアップロードすると、関数が自動的にトリガーされ、そのイメージが処理されます。
OSS と Function Compute を統合すると、さまざまな関数を呼び出してイメージや音声データを処理し、その結果をさまざまなストレージサービスに書き戻すことができます。このアーキテクチャにより、システムが大量のデータを高い信頼性と大規模な並列処理でリアルタイムに処理する間、お客様は関数ロジックに集中できます。
制限事項
複数のオブジェクトプレフィックスとオブジェクトサフィックスを設定できるのは、EventBridge ベースの OSS トリガーのみです。
ネイティブ OSS トリガーまたは EventBridge ベースの OSS トリガーのオブジェクトプレフィックスおよびオブジェクトサフィックスでは、正規表現はサポートされていません。
1 つのバケットに 10 個を超える OSS トリガーを関連付けることができるのは、EventBridge ベースの OSS トリガーのみです。
ベストプラクティスとして、1 つのバケットに 10 個を超えるトリガーを関連付けることは避けてください。さらに多くのトリガーが必要な場合は、新しいバケットを作成し、そのバケットに対してトリガーを設定してください。
イベントの定義
OSS が関連イベントをキャプチャすると、イベント情報を JSON 文字列にエンコードし、イベントハンドラー関数に渡します。OSS のイベント通知フォーマットの詳細については、リンク先のドキュメントをご参照ください。
次の表に、サポートされている OSS イベントの定義を示します。各イベントタイプは、ObjectCreated、ObjectRemoved、または ObjectModified の API オペレーションに対応します。これらの API オペレーションのいずれかが正常に呼び出されると、関数が 1 回トリガーされます。
イベントタイプ | イベント名 | 説明 |
ObjectCreated | oss:ObjectCreated:PutObject | PutObject API を呼び出してオブジェクトをアップロードすることによってトリガーされます。詳細については、「PutObject」をご参照ください。 |
oss:ObjectCreated:PutSymlink | PutSymlink API を呼び出して、OSS 内のターゲットオブジェクトへのシンボリックリンクを作成することによってトリガーされます。このシンボリックリンクを使用して、ターゲットオブジェクトにアクセスできます。詳細については、「PutSymlink」をご参照ください。 | |
oss:ObjectCreated:PostObject | PostObject API を呼び出して、HTML フォームを使用してバケットにオブジェクトをアップロードすることによってトリガーされます。詳細については、「PostObject」をご参照ください。 | |
oss:ObjectCreated:CopyObject | CopyObject API を呼び出して OSS 内のオブジェクトをコピーすることによってトリガーされます。詳細については、「CopyObject」をご参照ください。 | |
oss:ObjectCreated:InitiateMultipartUpload | MultipartUpload 機能を使用してデータを転送するには、まず InitiateMultipartUpload API を呼び出してマルチパートアップロードを初期化する必要があります。詳細については、「InitiateMultipartUpload」をご参照ください。 | |
oss:ObjectCreated:UploadPart | マルチパートアップロードイベントが開始された後、指定されたオブジェクト名とアップロード ID に基づいてデータをパート単位でアップロードできます。詳細については、「UploadPart」をご参照ください。 | |
oss:ObjectCreated:UploadPartCopy | UploadPartCopy API オペレーションは、既存のオブジェクトからデータをコピーしてパートをアップロードします。詳細については、「UploadPartCopy」をご参照ください。 | |
oss:ObjectCreated:CompleteMultipartUpload | すべてのデータパートがアップロードされた後、CompleteMultipartUpload API を呼び出してマルチパートアップロードを完了する必要があります。詳細については、「CompleteMultipartUpload」をご参照ください。 | |
oss:ObjectCreated:AppendObject | AppendObject API オペレーションは、データを追加してオブジェクトをアップロードするために呼び出されます。詳細については、「AppendObject」をご参照ください。 | |
oss:ObjectCreated:* | 前述の ObjectCreated API オペレーションのいずれかが正常に呼び出されることによってトリガーされます。 | |
ObjectRemoved | oss:ObjectRemoved:DeleteObject | DeleteObject API を呼び出してオブジェクトを削除することによってトリガーされます。詳細については、「DeleteObject」をご参照ください。 |
oss:ObjectRemoved:DeleteObjects | DeleteMultipleObjects API を呼び出して、1 つのリクエストで複数のオブジェクトを削除することによってトリガーされます。詳細については、「DeleteMultipleObjects」をご参照ください。 | |
oss:ObjectRemoved:AbortMultipartUpload | AbortMultipartUpload API を呼び出してマルチパートアップロードをキャンセルすることによってトリガーされます。詳細については、「AbortMultipartUpload」をご参照ください。 | |
ObjectModified | oss:ObjectModified:UpdateObjectMeta | UpdateObjectMeta API を呼び出してオブジェクトのメタデータを変更することによってトリガーされます。 説明 現在、このイベントは、中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (フフホト)、中国 (深セン)、および中国 (成都) のリージョンでサポートされています。 |
ObjectReplication | oss:ObjectReplication:ObjectCreated | データレプリケーション中に発生する書き込み操作。 |
oss:ObjectReplication:ObjectModified | データレプリケーション中に発生する上書き操作。 | |
oss:ObjectReplication:ObjectRemoved | データレプリケーション中に発生する削除操作。 |
トリガー ルール
トリガーループの回避
OSS トリガーを使用する際は、トリガーループを回避するように注意してください。一般的なシナリオは、OSS バケットへのオブジェクトのアップロードが関数をトリガーする場合です。その後、関数はオブジェクトを処理し、1 つ以上の新しいオブジェクトを同じバケットに書き戻します。これにより、再び関数がトリガーされ、実行ループが作成されます。
トリガーループによる不要なコストを防ぐために、オブジェクトプレフィックスまたはオブジェクトサフィックスを設定することを推奨します。たとえば、ソースオブジェクトのオブジェクトプレフィックスを src に設定し、処理済みオブジェクトのオブジェクトプレフィックスを dst に設定します。これにより、処理済みのオブジェクトが再び関数をトリガーしないようにできます。オブジェクトプレフィックスまたはサフィックスを設定しない場合、トリガーは任意のプレフィックスまたはサフィックスを持つオブジェクトに一致します。詳細については、「ステップ 1: OSS トリガーの作成」をご参照ください。
ネイティブ OSS トリガーのルール
単一のイベントが同じバケット内で複数のトリガーを発動するのを防ぐため、Function Compute はバケットに対して以下の設定ルールを適用します:
トリガーイベント、オブジェクトプレフィックス、およびオブジェクトサフィックスの組み合わせは一意である必要があります。
新しいトリガーを作成できるのは、その `トリガーイベント + オブジェクトプレフィックス + オブジェクトサフィックス` の組み合わせが既存のどのトリガーとも競合しない場合のみです。
以下の例は、ネイティブ OSS トリガーの設定ルールを説明しています。
既存のトリガー | 新しいトリガー | 作成ステータス | 説明 | ||||
トリガーイベント | オブジェクトプレフィックス | オブジェクトのサフィックス | トリガーイベント | オブジェクトプレフィックス | オブジェクトのサフィックス | ||
oss:ObjectCreated:PutObject | source | zip | oss:ObjectCreated:* | source | zip | 失敗 | 失敗。新しいトリガーのワイルドカードイベント ( |
source1 | zip1 | 成功 | 新しいトリガーと既存のトリガーのイベントタイプは競合していますが、オブジェクトプレフィックス と オブジェクトのサフィックス の値が一致しません。 | ||||
oss:ObjectCreated:PutObject | source | zip | 失敗 | 新しいトリガーと既存のトリガーのイベントタイプ、オブジェクトプレフィックス、および オブジェクトのサフィックス が同じです。 | |||
source | 1zip | 失敗 | |||||
source1 | zip | 失敗 | |||||
source | なし | 失敗 | 新しいトリガーのイベントタイプと オブジェクトプレフィックス が既存のトリガーと一致し、オブジェクトのサフィックス を指定しない場合、新しいトリガーは .zip オブジェクトなど、任意のサフィックスを持つオブジェクトに一致します。この場合、オブジェクトのサフィックス も一致すると見なされます。 | ||||
なし | zip | 失敗 | 新しいトリガーのイベントタイプと オブジェクトのサフィックス が既存のトリガーと一致します。オブジェクトプレフィックス が設定されていない場合、トリガーにはプレフィックス 'source' を持つオブジェクトが含まれるため、オブジェクトプレフィックス も一致します。 | ||||
source1 | zip1 | 成功 | 新しいトリガーのイベントタイプと オブジェクトプレフィックス が既存のトリガーと一致しますが、オブジェクトのサフィックス が一致しません。 | ||||
1source | 1zip | 成功 | 新しいトリガーのイベントタイプと オブジェクトのサフィックス が既存のトリガーと一致しますが、オブジェクトプレフィックス が一致しません。 | ||||
oss:ObjectCreated:PostObject | source | zip | 成功 | 成功。イベントタイプが競合しないため、パスフィルターに関係なくトリガーを作成できます。 | |||
オブジェクトプレフィックスはオブジェクト名の先頭から照合され、オブジェクトサフィックスはオブジェクト名の末尾から照合されます。
新しいトリガーの設定が既存のトリガーと競合する場合、新しいトリガーは作成できません。競合は、新しいトリガーのイベントタイプとそのパスフィルター (プレフィックスとサフィックス) の両方が既存のトリガーの設定と重複する場合にのみ発生します。
イベントタイプの競合
既存のイベントタイプ | 新しいイベントタイプ | 競合の説明 |
|
|
|
|
|
パス照合の競合
既存のパス | 新しいパス | 競合の説明 |
|
| プレフィックスは一致しませんが、サフィックスは一致します。パスは競合しません。 |
|
| プレフィックスは一致しますが、サフィックスは一致しません。パスは競合しません。 |
|
| プレフィックスとサフィックスが一致します。パスは競合します。 |
単一の OSS イベントタイプで、異なる処理タスクのために異なる関数をトリガーしたい場合は、EventBridge ベースの OSS トリガーを作成できます。
よくある質問
関連ドキュメント
トリガーの設定
ネイティブ OSS トリガーと EventBridge ベースの OSS トリガーの設定と使用方法の詳細については、「ネイティブ OSS トリガーの設定」および「EventBridge ベースの OSS トリガーの設定」をご参照ください。
トリガー関連のトピック
どのイベントが関数をトリガーしたかを確認したい場合は、関数ログにイベントタイプを出力できます。詳細については、「ログ管理」をご参照ください。
ある関数から別の関数を呼び出したい場合は、API を使用してターゲット関数を呼び出すことができます。詳細については、「関数は互いに呼び出し可能ですか?」をご参照ください。