Alibaba Cloud の Object Storage Service (OSS) を利用することで、低コストで膨大なデータをクラウドに安全に保存できます。HTTP RESTful API を使用して、簡単にインターネットにデータを保存し、アクセスできます。
Function Compute と OSS はシームレスに統合されています。さまざまなイベントに対して関数を設定し、特定のイベントが検知されると OSS により関数が自動的に呼び出されるようにすることができます。たとえば、PutObject イベントを処理する関数を設定することができます。OSS に画像をアップロードする PutObject API 操作を呼び出すと、この画像を処理する該当関数が開始されます。下図では、画像や音声を処理する関数を使用して自由に画像や音声データを処理するサービスを呼び出し、OSS にその結果を書き込みます。この処理の中では、関数コードを記述するだけで済みます。このコードで、OSS はリアルタイムかつ高い信頼性で大量のデータを同時に処理します。
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 でコーディングされた関数コードで、バケット名を取得します。
module.exports.handler = function(event, context, callback) {
var event = JSON.parse(event);
var bucketName = event.events[0].oss.bucket.name;
console.log('bucketName: '+ bucketName);
callback(null, bucketName);
};
{
"events": [
{
"eventName": "ObjectCreated:PutObject",
"eventSource": "acs:oss",
"eventTime": "2017-04-21T12:46:37.000Z",
"eventVersion": "1.0",
"oss": {
"bucket": {
"arn": "acs:oss:cn-shanghai:123456789:bucketname",
"name": "testbucket",
"ownerIdentity": "123456789",
"virtualBucket": ""
},
"object": {
"deltaSize": 122539,
"eTag": "688A7BF4F233DC9C88A80BF985AB7329",
"key": "image/a.jpg",
"size": 122539
},
"ossSchemaVersion": "1.0",
"ruleId": "9adac8e253828f4f7c0466d941fa3db81161e853"
},
"region": "cn-shanghai",
"requestParameters": {
"sourceIPAddress": "140.205.128.221"
},
"responseElements": {
"requestId": "58F9FF2D3DF792092E12044C"
},
"userIdentity": {
"principalId": "123456789"
}
}
]
}
OSS トリガーの設定
例
oss_events_trigger.yml
triggerConfig:
events:
- oss:ObjectCreated:PostObject
- oss:ObjectCreated:PutObject
filter:
key:
prefix: source/
パラメータ
events
:OSS イベントのタイプを示します。filter
:OSS イベントを抽出します。抽出条件を満たす OSS オブジェクトのみ関数をトリガーできます。本パラメータにはkey
属性があります。key
:フィルターの対応しているキーを示します。本属性には、次の属性があります。- prefix:接頭辞の一致
- suffix:接尾辞の一致
OSS トリガーの作成
次の例では、Function Compute コンソール、コマンドラインツール fcli、または SDK を使用して関数の OSS トリガーを作成する方法を説明します。
この例では、コンソールを使用して OSS トリガーを作成する方法を示します。関数の作成時、または関数の作成後にトリガーを作成することができます。トリガーについての詳細と作成方法は、「トリガー」および「トリガーの作成」をご参照ください。
Function Compute コンソール にログインして該当リージョンおよびサービスを選択します。使用するサービスがない場合は、サービスを作成します。詳細は、「サービスの作成」を参照。
例 1. コンソールで OSS トリガーを作成
関数の作成時にトリガーを作成
[関数の作成] をクリックします。表示されるページで、「空の関数」 テンプレートを選択します。
[トリガータイプ] に「Object Storage Service (OSS)」を指定します。下図のように設定して [次へ] をクリックします。
必須の関数情報を設定します。[インライン編集] を選択して、Python 実行環境のハンドラに次のサンプルコードを貼り付けます。[次へ] をクリックします。
# -*- coding: utf-8 -*-
import json
import logging
def handler(event, context):
logger = logging.getLogger()
eventObj = json.loads(event)["events"]
logger.info("eventName: %s" % eventObj[0]["eventName"])
logger.info("bucketName: %s" % eventObj[0]["oss"]["bucket"]["name"])
return "success"
(オプション)必要な許可を設定して [次へ] をクリックします。正しく設定していることを確認して、[作成] をクリックします。
関数の作成後にトリガーを作成
関数を選択します。[トリガー] タブ、[トリガーの作成] の順にクリックします。
表示されるページで、[トリガータイプ] に「Object Storage Service (OSS)」を設定します。必須パラメータを設定して [OK] をクリックします。
例 2. fcli を使用して OSS トリガーを作成
まず、.yaml ファイル(たとえば、「config.yaml」)を作成してトリガーを設定します。PUT メソッドまたは POST メソッドにより、オブジェクトがバケットの「source/」ディレクトリにアップロードされた時に、関数をトリガーする .yaml ファイルは、次のとおりです。
triggerConfig:
events:
- oss:ObjectCreated:PostObject
- oss:ObjectCreated:PutObject
filter:
key:
prefix: source/
該当関数のディレクトリにトリガーを作成します。
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 トリガーを作成
client = fc2.Client(
endpoint='<Your Endpoint>',
accessKeyID='<Your AccessKeyID>',
accessKeySecret='<Your AccessKeySecret>')
service_name = 'serviceName'
function_name = 'functionName'
trigger_name = 'triggerName'
trigger_type = 'oss'
source_arn = 'acs:oss:{0}:{1}:{2}'.format('<region>', '<account_id>', '<self.code_bucket>')
invocation_role = 'acs:ram::<Your Account ID>:role/<Your Invocation Role>'
trigger_config = {
'events': ['oss:ObjectCreated:*'],
'filter': {
'key': {
'prefix': 'source',
}
}
}
client.create_trigger(service_name, function_name, trigger_name, trigger_type, trigger_config, source_arn, invocation_role)