更新时间:2025-02-18 GMT+08:00
分享

开发事件函数

Python函数接口定义

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

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

def handler (event, context)
  • 入口函数名(handler):入口函数名称,需和函数执行入口处用户自定义的入口函数名称一致。
  • 执行事件(event): 函数执行界面由用户输入的执行事件参数, 格式为JSON对象。
  • 上下文环境(Context):Runtime提供的函数执行上下文,其接口定义在SDK接口说明。
Python函数的函数执行入口参数格式为:[文件名].[函数名],请参考函数执行入口通过FunctionGraph控制台进行配置。

建议使用Python 3.6版本。

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所示。

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

表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

获取函数的别名。

开发Python函数

开发Python函数步骤如下。

约束与限制:

  • 函数仅支持返回如下几种类型的值:
    • None:函数返回的HTTP响应Body为空。
    • String:函数返回的HTTP响应Body内容为该字符串内容。
    • 其他:当函数返回值的类型不为None和String时,函数会将返回值作为对象进行json编码,并将编码后的内容作为HTTP响应的Body,同时设置响应的“Content-Type”头为“application/json”。
  • 当函数的事件源是APIG时,相关约束条件请参考Base64解码和返回结构体的说明
  • 本例函数工程文件保存在“~/code/”文件夹下,在打包的时候务必进入code文件夹下选中所有工程文件进行打包,这样做的目的:由于定义了FunctionGraph函数的index.py是程序执行入口,确保fss_examples_python2.7.zip解压后,index.py文件位于根目录。
  • 用Python语言写代码时,自己创建的包名不能与Python标准库同名,否则会提示module加载失败。例如“json”、“lib”、“os”等。

以下示例使用的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
      

  2. 工程打包。

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

    图1 打包

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

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

    图2 上传程序包

    函数执行入口中的index与步骤定义FunctionGraph函数的文件名保持一致,通过该名称找到FunctionGraph函数所在文件。

    函数执行入口中的handler为函数名,与步骤定义FunctionGraph函数中创建的index.py文件中的handler名称保持一致。

    函数执行过程为:用户上传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的日志。

相关文档