edit-icon download-icon

OSS イベントトリガー

最終更新日: May 31, 2019

Alibaba Cloud の Object Storage Service (OSS) を利用することで、低コストで膨大なデータをクラウドに安全に保存できます。HTTP RESTful API を使用して、簡単にインターネットにデータを保存し、アクセスできます。

Function Compute と OSS はシームレスに統合されています。さまざまなイベントに対して関数を設定し、特定のイベントが検知されると OSS により関数が自動的に呼び出されるようにすることができます。たとえば、PutObject イベントを処理する関数を設定することができます。OSS に画像をアップロードする PutObject API 操作を呼び出すと、この画像を処理する該当関数が開始されます。下図では、画像や音声を処理する関数を使用して自由に画像や音声データを処理するサービスを呼び出し、OSS にその結果を書き込みます。この処理の中では、関数コードを記述するだけで済みます。このコードで、OSS はリアルタイムかつ高い信頼性で大量のデータを同時に処理します。

oss-triggers-fc

OSS イベント

イベントが検知されると、OSS はイベント情報を JSON 文字列にエンコードし、イベント処理関数に引き渡します。下表は、OSS で対応しているイベント一覧です。

イベント 説明 備考
oss:ObjectCreated:PutObject OSS PutObject API 処理により、オブジェクトが作成されると関数がトリガーされます。 ファイルのアップロードに PutObject を使用します。詳細は、「PutObject」を参照。
oss:ObjectCreated:PutSymlink OSS PutSymlink API 処理により、オブジェクトが作成されると関数がトリガーされます。 OSS の TargetObject を指すシンボリックリンクの作成に PutSymlink を使用します。シンボリックリンクを使用して TargetObject にアクセスします。詳細は、「PutSymlink」を参照。
oss:ObjectCreated:PostObject OSS PostObject API 処理により、オブジェクトが作成されると関数がトリガーされます。 HTML フォームを使用して特定のバケットにファイルをアップロードする時に PostObject を使用します。詳細は、「PostObject」を参照。
oss:ObjectCreated:CopyObject OSS CopyObject API 処理により、オブジェクトが作成されると関数がトリガーされます。 OSS にあるオブジェクトを別のオブジェクトにコピーする時に CopyObject を使用します。詳細は、「CopyObject」を参照。
oss:ObjectCreated:InitialMultipartUpload OSS InitialMultipartUpload API 処理が実行されると関数がトリガーされます。 Multipart Upload モードでデータを送信する前に、InitialMultipartUpload API 処理を呼び出して OSS に Multipart Upload イベントを初期化するよう通知します。詳細は、「InitiateMultipartUpload」を参照。
oss:ObjectCreated:UploadPart OSS UploadPart API 処理が実行されると関数がトリガーされます。 Multipart Upload イベントが初期化されると、オブジェクト名とアップロード ID を指定してデータを分割したアップロードが行えます。詳細は、「UploadPart」を参照。
oss:ObjectCreated:UploadPartCopy OSS UploadPartCopy API 処理が実行されると関数がトリガーされます。 既存オブジェクトよりデータをコピーして分割データをアップロードする際に UploadPartCopy を使用します。詳細は、「UploadPartCopy」を参照。
oss:ObjectCreated:CompleteMultipartUpload OSS CompleteMultipartUpload API 処理が実行されると関数がトリガーされます。 分割されたデータがすべてアップロードされたら、CompleteMultipartUpload API 処理を呼び出してファイル全体の Multipart Upload を完了します。詳細は、「CompleteMultipartUpload」を参照。
oss:ObjectCreated:AppendObject OSS AppendObject API 処理が実行されると関数がトリガーされます。 appending モードでのファイルのアップロードに AppendObject を使用します。詳細は、「AppendObject」を参照。
oss:ObjectCreated:* 上記 ObjectCreated API 処理のいずれかが実行されると関数がトリガーされます。 上記 ObjectCreated API 処理のいずれかが実行されると関数がトリガーされます。
oss:ObjectRemoved:DeleteObject OSS DeleteObject API 処理により、オブジェクトが削除されると関数がトリガーされます。 特定のオブジェクトの削除に DeleteObject を使用します。詳細は、「DeleteObject」を参照。
oss:ObjectRemoved:DeleteObjects OSS DeleteObjects API 処理により、複数のオブジェクトが削除されると関数がトリガーされます。 ファイルの一括削除に DeleteObjects を使用します。
oss:ObjectRemoved:AbortMultipartUpload OSS AbortMultipartUpload API 処理により、Multipart Upload イベントが停止されると関数がトリガーされます。 指定した アップロード ID の Multipart Upload イベントを停止する際に、AbortMultipartUpload を使用します。詳細は、「AbortMultipartUpload」を参照。

OSS イベント形式

OSS イベントにより関数の実行がトリガーされると、OSS イベント形式は、関数の入力パラメータコードとなります。イベント情報を取得します。イベントのパラメータに関する詳細は、「イベントパラメータ」をご参照ください。次の例は、Node.js でコーディングされた関数コードで、バケット名を取得します。

  1. module.exports.handler = function(event, context, callback) {
  2. var event = JSON.parse(event);
  3. var bucketName = event.events[0].oss.bucket.name;
  4. console.log('bucketName: '+ bucketName);
  5. callback(null, bucketName);
  6. };
  1. {
  2. "events": [
  3. {
  4. "eventName": "ObjectCreated:PutObject",
  5. "eventSource": "acs:oss",
  6. "eventTime": "2017-04-21T12:46:37.000Z",
  7. "eventVersion": "1.0",
  8. "oss": {
  9. "bucket": {
  10. "arn": "acs:oss:cn-shanghai:123456789:bucketname",
  11. "name": "testbucket",
  12. "ownerIdentity": "123456789",
  13. "virtualBucket": ""
  14. },
  15. "object": {
  16. "deltaSize": 122539,
  17. "eTag": "688A7BF4F233DC9C88A80BF985AB7329",
  18. "key": "image/a.jpg",
  19. "size": 122539
  20. },
  21. "ossSchemaVersion": "1.0",
  22. "ruleId": "9adac8e253828f4f7c0466d941fa3db81161e853"
  23. },
  24. "region": "cn-shanghai",
  25. "requestParameters": {
  26. "sourceIPAddress": "140.205.128.221"
  27. },
  28. "responseElements": {
  29. "requestId": "58F9FF2D3DF792092E12044C"
  30. },
  31. "userIdentity": {
  32. "principalId": "123456789"
  33. }
  34. }
  35. ]
  36. }

OSS トリガーの設定

oss_events_trigger.yml

  1. triggerConfig:
  2. events:
  3. - oss:ObjectCreated:PostObject
  4. - oss:ObjectCreated:PutObject
  5. filter:
  6. key:
  7. prefix: source/

パラメータ

  • events:OSS イベントのタイプを示します。
  • filter:OSS イベントを抽出します。抽出条件を満たす OSS オブジェクトのみ関数をトリガーできます。本パラメータにはkey属性があります。
    • key:フィルターの対応しているキーを示します。本属性には、次の属性があります。
      • prefix:接頭辞の一致
      • suffix:接尾辞の一致

OSS トリガーの作成

次の例では、Function Compute コンソールコマンドラインツール fcli、または SDK を使用して関数の OSS トリガーを作成する方法を説明します。

この例では、コンソールを使用して OSS トリガーを作成する方法を示します。関数の作成時、または関数の作成後にトリガーを作成することができます。トリガーについての詳細と作成方法は、「トリガー」および「トリガーの作成」をご参照ください。

Function Compute コンソール にログインして該当リージョンおよびサービスを選択します。使用するサービスがない場合は、サービスを作成します。詳細は、「サービスの作成」を参照。

例 1. コンソールで OSS トリガーを作成

関数の作成時にトリガーを作成

  1. [関数の作成] をクリックします。表示されるページで、「空の関数」 テンプレートを選択します。

  2. [トリガータイプ] に「Object Storage Service (OSS)」を指定します。下図のように設定して [次へ] をクリックします。

    Trigger

  3. 必須の関数情報を設定します。[インライン編集] を選択して、Python 実行環境のハンドラに次のサンプルコードを貼り付けます。[次へ] をクリックします。

    1. # -*- coding: utf-8 -*-
    2. import json
    3. import logging
    4. def handler(event, context):
    5. logger = logging.getLogger()
    6. eventObj = json.loads(event)["events"]
    7. logger.info("eventName: %s" % eventObj[0]["eventName"])
    8. logger.info("bucketName: %s" % eventObj[0]["oss"]["bucket"]["name"])
    9. return "success"
  4. (オプション)必要な許可を設定して [次へ] をクリックします。正しく設定していることを確認して、[作成] をクリックします。

関数の作成後にトリガーを作成

  1. 関数を選択します。[トリガー] タブ、[トリガーの作成] の順にクリックします。

  2. 表示されるページで、[トリガータイプ] に「Object Storage Service (OSS)」を設定します。必須パラメータを設定して [OK] をクリックします。

    Create a trigger

例 2. fcli を使用して OSS トリガーを作成

まず、.yaml ファイル(たとえば、「config.yaml」)を作成してトリガーを設定します。PUT メソッドまたは POST メソッドにより、オブジェクトがバケットの「source/」ディレクトリにアップロードされた時に、関数をトリガーする .yaml ファイルは、次のとおりです。

  1. triggerConfig:
  2. events:
  3. - oss:ObjectCreated:PostObject
  4. - oss:ObjectCreated:PutObject
  5. filter:
  6. key:
  7. prefix: source/

該当関数のディレクトリにトリガーを作成します。

  1. mkt test_oss_trigger -t oss -r acs:ram::account_id:role/AliyunOSSEventNotificationRole -s acs:oss:cn-region:account_id:bucketName -c config.yaml
  • -r —invocation-role string:関数をトリガーするためのロールを指定します。
  • -s —source-arn string:イベントソースを指定します。たとえば、「acs:oss:cn-shanghai:12345678:myBucketName」。
  • -c —trigger-config string:トリガーの設定ファイルを指定します。
  • -t —type string:トリガータイプを指定します。デフォルトは、OSS トリガーです。

fcli の使用方法については、「fcli」をご参照ください。

例 3. SDK を使用して OSS トリガーを作成

  1. client = fc2.Client(
  2. endpoint='<Your Endpoint>',
  3. accessKeyID='<Your AccessKeyID>',
  4. accessKeySecret='<Your AccessKeySecret>')
  5. service_name = 'serviceName'
  6. function_name = 'functionName'
  7. trigger_name = 'triggerName'
  8. trigger_type = 'oss'
  9. source_arn = 'acs:oss:{0}:{1}:{2}'.format('<region>', '<account_id>', '<self.code_bucket>')
  10. invocation_role = 'acs:ram::<Your Account ID>:role/<Your Invocation Role>'
  11. trigger_config = {
  12. 'events': ['oss:ObjectCreated:*'],
  13. 'filter': {
  14. 'key': {
  15. 'prefix': 'source',
  16. }
  17. }
  18. }
  19. client.create_trigger(service_name, function_name, trigger_name, trigger_type, trigger_config, source_arn, invocation_role)