更新时间:2024-11-11 GMT+08:00

开发事件函数

函数定义

建议使用Python 3.6版本。

对于Python,FunctionGraph运行时支持Python 2.7版本、Python 3.6、Python3.9、Python3.10版本。

函数有明确的接口定义,如下所示。

def handler (event, context)

  • 入口函数名(handler):入口函数名称,需和函数执行入口处用户自定义的入口函数名称一致。
  • 执行事件(event): 函数执行界面由用户输入的执行事件参数, 格式为JSON对象。
  • 上下文环境(Context):Runtime提供的函数执行上下文,其接口定义在SDK接口说明。

Python的initializer入口介绍

FunctionGraph目前支持以下Python运行环境。

  • Python 2.7 (runtime = python2.7)
  • Python 3.6 (runtime = python3)
  • Python 3.9(runtime = python3)
  • Python 3.10(runtime = python3)

Initializer入口格式为:

[文件名].[initializer名]

示例:实现initializer接口时指定的Initializer入口为main.my_initializer,那么FunctionGraph会去加载main.py中定义的my_initializer函数。

在FunctionGraph中使用Python编写initializer,需要定义一个Python函数作为initializer入口,一个最简单的initializer(以Python 2.7版本为例)示例如下。

def my_initializer(context):
    print 'hello world!'
  • 函数名

    my_initializer需要与实现initializer接口时的Initializer字段相对应,实现initializer接口时指定的Initializer入口为main.my_initializer ,那么函数服务会去加载main.py中定义的my_initializer函数。

  • context参数

    context参数中包含一些函数的运行时信息,例如:request id、临时AccessKey、function meta等。

SDK接口

Context类中提供了许多上下文方法供用户使用,其声明和功能如表1所示。

表1 Context类上下文方法说明

方法名

方法说明

getRequestID()

获取请求ID。

getRemainingTimeInMilliSeconds ()

获取函数剩余运行时间。

getAccessKey()

获取用户委托的AccessKey(有效期24小时),使用该方法需要给函数配置委托。

说明:

当前函数工作流已停止维护Runtime SDK 中getAccessKey接口,您将无法使用getAccessKey获取临时AK。

getSecretKey()

获取用户委托的SecretKey(有效期24小时),使用该方法需要给函数配置委托。

说明:

当前函数工作流已停止维护Runtime SDK 中getSecretKey接口,您将无法使用getSecretKey获取临时SK。

getSecurityAccessKey()

获取用户委托的SecurityAccessKey(有效期24小时),使用该方法需要给函数配置委托。

getSecuritySecretKey()

获取用户委托的SecuritySecretKey(有效期24小时),使用该方法需要给函数配置委托。

getSecurityToken()

获取用户委托的SecurityToken(有效期24小时),使用该方法需要给函数配置委托。

getUserData(string key)

通过key获取用户通过环境变量传入的值。

getFunctionName()

获取函数名称。

getRunningTimeInSeconds ()

获取函数超时时间。

getVersion()

获取函数的版本。

getMemorySize()

分配的内存。

getCPUNumber()

获取函数占用的CPU资源。

getPackage()

获取函数组。

getToken()

获取用户委托的token(有效期24小时),使用该方法需要给函数配置委托。

getLogger()

获取context提供的logger方法,返回一个日志输出类,通过使用其info方法按“时间-请求ID-输出内容”的格式输出日志。

如调用info方法输出日志:

log = context.getLogger()

log.info("test")

getAlias

获取函数的别名

getToken()、getAccessKey()和getSecretKey()方法返回的内容包含敏感信息,请谨慎使用,避免造成用户敏感信息的泄露。

开发Python函数

开发Python函数步骤如下。

以下示例使用的Python 2.7版本。

  1. 创建函数工程。

    1. 编写打印helloworld的代码。

      打开文本编辑器,编写helloworld函数,代码如下,文件命名为helloworld.py,保存文件。

      1
      2
      def printhello():
          print 'hello world!'
      
    2. 定义FunctionGraph函数。

      打开文本编辑,定义函数,代码如下,文件命名为index.py,保存文件(与helloworld.py保存在同一文件夹下)。

      1
      2
      3
      4
      5
      6
      7
      import json
      import helloworld
      
      def handler (event, context):
          output =json.dumps(event)
          helloworld.printhello()
          return output
      

    函数仅支持返回如下几种类型的值。

    • None:函数返回的HTTP响应Body为空。
    • String:函数返回的HTTP响应Body内容为该字符串内容。
    • 其他:当函数返回值的类型不为None和String时,函数会将返回值作为对象进行json编码,并将编码后的内容作为HTTP响应的Body,同时设置响应的“Content-Type”头为“application/json”。
    • 当函数的事件源是APIG时,相关约束条件请参考Base64解码和返回结构体的说明

  2. 工程打包。

    函数工程创建以后,可以得到以下目录,选中工程所有文件,打包命名为“fss_examples_python2.7.zip”,如图1所示。

    图1 打包
    • 本例函数工程文件保存在“~/code/”文件夹下,在打包的时候务必进入code文件夹下选中所有工程文件进行打包,这样做的目的:由于定义了FunctionGraph函数的index.py是程序执行入口,确保fss_examples_python2.7.zip解压后,index.py文件位于根目录。
    • 用Python语言写代码时,自己创建的包名不能与Python标准库同名,否则会提示module加载失败。例如“json”、“lib”、“os”等。

  3. 创建FunctionGraph函数,上传程序包。

    登录FunctionGraph控制台,创建Python函数,上传fss_examples_python2.7.zip文件。如图2所示。

    图2 上传程序包

    1. 函数执行入口中的index与步骤定义FunctionGraph函数的文件名保持一致,通过该名称找到FunctionGraph函数所在文件。
    2. 函数执行入口中的handler为函数名,与步骤定义FunctionGraph函数中创建的index.py文件中的handler名称保持一致。
    3. 函数执行过程为:用户上传fss_examples_python2.7.zip保存在OBS中,触发函数后,解压缩zip文件,通过index匹配到FunctionGraph函数所在文件,通过handler匹配到index.py文件中定义的FunctionGraph函数,找到程序执行入口,执行函数。

    在函数工作流控制台左侧导航栏选择“函数 > 函数列表”,单击需要设置的“函数名称”进入函数详情页,选择“设置 > 常规设置”,配置“函数执行入口”参数,如图3所示。其中参数值为“index.handler”格式,“index”和“handler”支持自定义命名。

    图3 函数执行入口参数

  4. 测试函数。

    1. 创建测试事件。

      在函数详情页,单击“配置测试事件”,弹出“配置测试事件”页,输入测试信息如图4所示,单击“创建”。

      图4 配置测试事件
    2. 在函数详情页,选择已配置测试事件,单击“测试”。

  5. 函数执行。

    函数执行结果分为三部分,分别为函数返回(由callback返回)、执行摘要、日志输出(由print()方法获取的日志方法输出), 如图10 测试结果所示。

    图5 测试结果

执行结果

执行结果由3部分组成:函数返回、执行摘要和日志。

表2 执行结果说明

参数项

执行成功

执行失败

函数返回

返回函数中定义的返回信息。

返回包含错误信息、错误类型和堆栈异常报错信息的JSON文件。格式如下:

{
    "errorMessage": "",
    "errorType": "",
    "stackTrace": []
}

errorMessage:Runtime返回的错误信息

errorType:错误类型

stackTrace:Runtime返回的堆栈异常报错信息

执行摘要

显示请求ID、配置内存、执行时长、实际使用内存和收费时长。

显示请求ID、配置内存、执行时长、实际使用内存和收费时长。

日志

打印函数日志,最多显示4KB的日志。

打印报错信息,最多显示4KB的日志。