Function Compute コンソールまたはコマンドラインツール fcli を使用して関数を作成できます。
手順
注意:関数と OSS バケットは同じリージョンでなければなりません。たとえば、OSS バケットが上海 (中国東部 2) の場合は、サービスのリージョンを上海 (中国東部 2) に設定します。
Function Compute コンソールにログインします。
「サービス操作」を参照してサービスを作成します。
この例では、 上海 (中国東部 2) リージョンを選択し、[サービス名] を demo に設定します。[ログプロジェクト] で test-project を選択し、[Logstore] で test-logstore を選択します。[ロール操作] で [ 新しいロールを作成] を選択し、[システムポリシー] で
AliyunOSSFullAccess
とAliyunLogFullAccess
を選択します。「関数の操作 」を参照して関数を作成します。
この例では、[空の関数] テンプレートを選択し、トリガーを作成せず、関数名を resize に設定します。[ランタイム] を Python に設定し、その他のパラメーターはデフォルト値のままにします。
関数コードを編集します。
次の手順
付録
この例では、次のように関数コードを設定します。次の関数を使用して編集できます。
'use strict';
console.log('Loading function ...');
var oss = require('ali-oss').Wrapper;
var fs = require('fs');
var jimp = require("jimp");
module.exports.resize = function (eventBuf, ctx, callback) {
console.log('Received event:', eventBuf.toString());
var event = JSON.parse(eventBuf);
var ossEvent = event.events[0];
// Required by OSS sdk: OSS region is prefixed with "oss-", e.g. "oss-cn-shanghai"
var ossRegion = "oss-" + ossEvent.region;
// Create oss client.
var client = new oss({
region: ossRegion,
// Credentials can be retrieved from context
accessKeyId: ctx.credentials.accessKeyId,
accessKeySecret: ctx.credentials.accessKeySecret,
stsToken: ctx.credentials.securityToken
});
// Bucket name is from OSS event
client.useBucket(ossEvent.oss.bucket.name);
// Processed images will be saved to processed/
var newKey = ossEvent.oss.object.key.replace("source/", "processed/");
var tmpFile = "/tmp/processed.png";
// Get object
console.log('Getting object: ', ossEvent.oss.object.key)
client.get(ossEvent.oss.object.key).then(function (val) {
// Read object from buffer
jimp.read(val.content, function (err, image) {
if (err) {
console.error("Failed to read image");
callback(err);
return;
}
// Resize the image and save it to a tmp file
image.resize(128, 128).write(tmpFile, function (err) {
if (err) {
console.error("Failed to write image locally");
callback(err);
return;
}
// Putting object back to OSS with the new key
console.log('Putting object: ', newKey);
client.put(newKey, tmpFile).then(function (val) {
console.log('Put object:', val);
callback(null, val);
return;
}).catch(function (err) {
console.error('Failed to put object: %j', err);
callback(err);
return
});
});
});
}).catch(function (err) {
console.error('Failed to get object: %j', err);
callback(err);
return
});
};
# -*- coding: utf-8 -*-
import oss2, json
from wand.image import Image
def resize(event, context):
evt = json.loads(event)
creds = context.credentials
# Required by OSS SDK
auth=oss2.StsAuth(
creds.access_key_id,
creds.access_key_secret,
creds.security_token)
evt = evt['events'][0]
bucket_name = evt['oss']['bucket']['name']
endpoint = 'oss-' + evt['region'] + '.aliyuncs.com'
bucket = oss2.Bucket(auth, endpoint, bucket_name)
objectName = evt['oss']['object']['key']
# Processed images will be saved to 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)