全部产品

函数参数

更新时间:2018-08-10 12:03:11

函数计算提供的函数接口中有两个参数 eventcontext ,本文对这两个参数进行介绍。

event

event 为函数运行时的 输入参数 。event 是调用函数时传入的数据,数据结构由您自行定义,它可以是一个简单的 string ,也可以是一个 JSON,还可以是一个图片(二进制数据)。函数计算不对它的内容进行任何解释。函数中的 event 参数是个字节流,在 Python2.7 中是 str 类型,在 Python3 中是 bytes 类型。各个 runtime 的 event 类型请参考编程指南各语言的 runtime 文档。

您在函数中可以根据实际情况对 event 进行转换:

输入数据是一个 JSON string 的话,您可以把它转换成一个 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。

输入数据是一个文件的 bytes , 比如图片的文件作为 event 参数传入:

  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 runtime 不以 event 形式表示输入参数,在实现 StreamRequestHandler 接口时,inputStream 参数是调用函数时传入的数据,在实现 PojoRequestHandler<I, O> 接口时,通过泛型的方式,用户自定义输入和输出的类型,具体请参考 Java runtime

关于 event 的其他示例可参考文章 函数计算入口参数event详解 (Python Runtime)

context

context 中存储了用户执行函数时的 运行时信息。其中包括用户的请求 id,鉴权信息,以及对应的 service 和 function 信息。结构如下:

  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. }

使用场景

  • 可以在 context 中获得本次请求的 id,并记录到函数运行日志中。后续通过该 id 来追踪请求执行的详细信息。
  • 用户的 AK 信息可以通过 context 获取,可以通过 context 中的 AK 信息去访问阿里云的其他服务(使用示例中以访问 OSS 为例)避免了将 AK 信息写在代码里。
  • 可以获取服务及函数的基本信息。

各个 runtime 的 context 类型请参考编程指南各个 runtime 文档。

使用示例

以下示例展示了 Python 语言中,使用 context 中的个人信息访问 OSS 的过程。其他语言示例请参考各自 runtime。

  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'