edit-icon download-icon

2. 関数の作成

最終更新日: Mar 05, 2019

Function Compute コンソールまたはコマンドラインツール fcli を使用して関数を作成できます。

手順

注意:関数と OSS バケットは同じリージョンでなければなりません。たとえば、OSS バケットが上海 (中国東部 2) の場合は、サービスのリージョンを上海 (中国東部 2) に設定します。

  1. Function Compute コンソールにログインします。

  2. サービス操作」を参照してサービスを作成します。

    この例では、 上海 (中国東部 2) リージョンを選択し、[サービス名] を demo に設定します。[ログプロジェクト] で test-project を選択し、[Logstore] で test-logstore を選択します。[ロール操作] で [ 新しいロールを作成] を選択し、[システムポリシー] でAliyunOSSFullAccessAliyunLogFullAccess を選択します。

  3. 関数の操作 」を参照して関数を作成します。

    この例では、[空の関数] テンプレートを選択し、トリガーを作成せず、関数名を resize に設定します。[ランタイム] を Python に設定し、その他のパラメーターはデフォルト値のままにします。

  4. 関数コードを編集します。

次の手順

関数のテスト

付録

この例では、次のように関数コードを設定します。次の関数を使用して編集できます。

  1. 'use strict';
  2. console.log('Loading function ...');
  3. var oss = require('ali-oss').Wrapper;
  4. var fs = require('fs');
  5. var jimp = require("jimp");
  6. module.exports.resize = function (eventBuf, ctx, callback) {
  7. console.log('Received event:', eventBuf.toString());
  8. var event = JSON.parse(eventBuf);
  9. var ossEvent = event.events[0];
  10. // Required by OSS sdk: OSS region is prefixed with "oss-", e.g. "oss-cn-shanghai"
  11. var ossRegion = "oss-" + ossEvent.region;
  12. // Create oss client.
  13. var client = new oss({
  14. region: ossRegion,
  15. // Credentials can be retrieved from context
  16. accessKeyId: ctx.credentials.accessKeyId,
  17. accessKeySecret: ctx.credentials.accessKeySecret,
  18. stsToken: ctx.credentials.securityToken
  19. });
  20. // Bucket name is from OSS event
  21. client.useBucket(ossEvent.oss.bucket.name);
  22. // Processed images will be saved to processed/
  23. var newKey = ossEvent.oss.object.key.replace("source/", "processed/");
  24. var tmpFile = "/tmp/processed.png";
  25. // Get object
  26. console.log('Getting object: ', ossEvent.oss.object.key)
  27. client.get(ossEvent.oss.object.key).then(function (val) {
  28. // Read object from buffer
  29. jimp.read(val.content, function (err, image) {
  30. if (err) {
  31. console.error("Failed to read image");
  32. callback(err);
  33. return;
  34. }
  35. // Resize the image and save it to a tmp file
  36. image.resize(128, 128).write(tmpFile, function (err) {
  37. if (err) {
  38. console.error("Failed to write image locally");
  39. callback(err);
  40. return;
  41. }
  42. // Putting object back to OSS with the new key
  43. console.log('Putting object: ', newKey);
  44. client.put(newKey, tmpFile).then(function (val) {
  45. console.log('Put object:', val);
  46. callback(null, val);
  47. return;
  48. }).catch(function (err) {
  49. console.error('Failed to put object: %j', err);
  50. callback(err);
  51. return
  52. });
  53. });
  54. });
  55. }).catch(function (err) {
  56. console.error('Failed to get object: %j', err);
  57. callback(err);
  58. return
  59. });
  60. };
  1. # -*- coding: utf-8 -*-
  2. import oss2, json
  3. from wand.image import Image
  4. def resize(event, context):
  5. evt = json.loads(event)
  6. creds = context.credentials
  7. # Required by OSS SDK
  8. auth=oss2.StsAuth(
  9. creds.access_key_id,
  10. creds.access_key_secret,
  11. creds.security_token)
  12. evt = evt['events'][0]
  13. bucket_name = evt['oss']['bucket']['name']
  14. endpoint = 'oss-' + evt['region'] + '.aliyuncs.com'
  15. bucket = oss2.Bucket(auth, endpoint, bucket_name)
  16. objectName = evt['oss']['object']['key']
  17. # Processed images will be saved to processed/
  18. newKey = objectName.replace("source/", "processed/")
  19. remote_stream = bucket.get_object(objectName)
  20. if not remote_stream:
  21. return
  22. remote_stream = remote_stream.read()
  23. with Image(blob=remote_stream) as img:
  24. with img.clone() as i:
  25. i.resize(128, 128)
  26. new_blob = i.make_blob()
  27. bucket.put_object(newKey, new_blob)