edit-icon download-icon

関数パラメーター

最終更新日: Nov 30, 2018

このドキュメントでは、Function Compute の 2 つのパラメーター、 eventcontext を紹介します。

event

event パラメーターは、入力パラメーターです。

トリガーが関数を呼び出すと、関数は event パラメーターを使用します。データ構造はユーザーによって定義されます。文字列、JSON、画像 (バイナリデータ) 形式で、event 構造を定義できます。Function Compute では、event パラメーターの内容はを変更せずパススルーします。event パラメーターは、バイトストリームです。Python2.7 では、event パラメーターは str 型ですが、Python3 では bytes 型です。各ランタイムの event タイプについては、「プログラミングガイド」の各言語のランタイムドキュメントをご参照ください。

実際の状況に応じて、関数の event 型を変換できます。入力データが JSON 文字列の場合、この文字列を dict に変換できます。たとえば、関数に渡される event は次のとおりです。

  1. {
  2. "key": "value"
  3. }

関数コードは次のとおりです。

Python 版

  1. import json
  2. def handler(event, context):
  3. evt = json.loads(event)
  4. return evt["key"]

Nodejs 版

  1. exports.handler = function(event, context, callback) {
  2. var eventObj = JSON.parse(event.toString());
  3. callback(null, eventObj['key']);
  4. };

戻り値は value です。

入力データは、event パラメーターとして渡されたイメージなど、ファイルの bytes です。

  1. 'use strict';
  2. var fs = require('fs');
  3. var gm = require('gm').subClass({
  4. imageMagick: true
  5. });
  6. module.exports.resize = function (event, context, callback) {
  7. //渡された event パラメーターは、png 形式のイメージで、/tmp ディレクトリに書き込まれます。
  8. fs.writeFileSync("/tmp/serverless.png", event)
  9. fs.readFileSync("/tmp/serverless.png")
  10. new Promise(function (resolve, reject) {
  11. gm("/tmp/serverless.png").resize(128, 128, '!').write("/tmp/serverless_128.png", function (err) {
  12. if (err) {
  13. console.error('Failed to write image', err);
  14. reject('Failed to write image')
  15. callback(err)
  16. return
  17. }
  18. resolve('succ')
  19. })
  20. }).then(function () {
  21. // /tmp ディレクトリから結果イメージを読み込む。
  22. callback(null, fs.readFileSync("/tmp/serverless_128.png"))
  23. })
  24. }
  1. # -*- coding: utf-8 -*-
  2. from wand.image import Image
  3. def resize(event, context):
  4. with Image(blob=event) as img:
  5. with img.clone() as i:
  6. i.resize(128, 128)
  7. return i.make_blob()

注意:Java ランタイムは、event パラメーターをサポートしていません。StreamRequestHandler メソッドを使用している場合、inputStream パラメーターは、関数が使用するデータを指定します。PojoRequestHandler<I, O> メソッドを使用すると、入力と出力タイプをジェネリックモードでカスタマイズできます。詳細は、「Java 」をご参照ください。

context

ユーザーが関数を実行するときに生成されるランタイム情報は、ユーザーリクエスト ID、認証情報、および対応するサービスや関数情報などを含め、context に格納されます。構造は次のとおりです。

  1. {
  2. requestId: '886a2272-346f-c9ad-9db0-0dc0f35cb5b5',
  3. credentials: {
  4. accessKeyId: 'STS.abcdefghijklmn',
  5. accessKeySecret: 'abcdefghijklmnopqrstuvwxyz',
  6. securityToken: 'CAISh+********'
  7. },
  8. function: {
  9. name: 'tt',
  10. handler: 'index.handler',
  11. memory: 512,
  12. timeout: 60
  13. },
  14. service: {
  15. name: 'test',
  16. logProject: 'test-log-project',
  17. logStore: 'test-log-store'
  18. },
  19. region: 'cn-shanghai',
  20. accountId: '167*************'
  21. }

利用イメージ

  • リクエスト ID は context で取得され、関数実行ログに記録されます。ID は、実行状況の詳細を追跡するために使用されます。

  • ユーザーの AccessKey 情報は、context で取得できます。これを使用して Alibaba Cloud の他のサービス (たとえば、OSS へのアクセス) にアクセスし、 AK 情報をコードに書き込まないようにすることができます。

  • 該当する関数やサービスの基本情報を取得できます。

各ランタイムの context タイプについては、「プログラミングガイド」のランタイムドキュメントをご参照ください。

次の例では、context 内のユーザーの AccessKey 情報を使用して OSS にアクセスするプロセスを示しています。

  1. import json
  2. import oss2
  3. def handler(event, context):
  4. evt = json.loads(event)
  5. creds = context.credentials
  6. auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
  7. bucket = oss2.Bucket(auth, 'oss-cn-hangzhou.aliyuncs.com', 'bucketName')
  8. bucket.put_object('motto.txt', 'Never give up. - Jack Ma')
  9. return 'success'