在函数计算服务中使用 Python 编程,需要定义一个函数作为入口函数,本文介绍了 Python 事件函数。

背景信息

函数计算目前支持以下 Python 运行环境:

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

事件函数示例

一个最简单的事件入口函数定义如下所示。

def my_handler(event, context):
    return 'hello world'

事件函数名

my_handler 需要与创建函数时的 handler 字段相对应。例如创建函数时指定的 handlermain.my_handler,那么函数计算会去加载 main.py 中定义的 my_handler 函数,并从这里开始执行。

事件 event 参数

  • event 参数是用户调用函数时传入的数据,在 Python2.7 中是 str 类型,在 Python3 中是 bytes 类型,是函数的输入参数。
  • 函数不对 event 参数的内容进行任何解释,您在函数中可以根据实际情况对 event 进行转换。例如输入数据是一个 JSON 字符串,您可以把它转换成一个字典 。
    {  
      "key": "value"
    }

例如传入的是 event ,返回结果为 value

# -*- coding: utf-8 -*-
import json
def my_handler(event, context):    
    evt = json.loads(event)    
    return evt['key']

事件 context 参数

context 参数中包含一些函数运行时的信息(例如 request id 临时 AK ),您在代码中可以使用这些信息。信息类型是 FCContext

context 参数的定义如下所示。

class Credentials:    
    def __init__(self, access_key_id, access_key_secret, security_token):        
        self.access_key_id = access_key_id        
        self.access_key_secret = access_key_secret        
        self.security_token = security_token

class ServiceMeta:    
    def __init__(self, service_name, log_project, log_store, qualifier, version_id):        
        self.name = service_name        
        self.log_project = log_project        
        self.log_store = log_store        
        self.qualifier = qualifier        
        self.version_id = version_id

class FunctionMeta:    
    def __init__(self, name, handler, memory, timeout, initializer, initialization_timeout):        
        self.name = name        
        self.handler = handler        
        self.memory = memory        
        self.timeout = timeout        
        self.initializer = initializer        
        self.initialization_timeout = initialization_timeout

class FCContext:    
    def __init__(self, account_id, request_id, credentials, function_meta, service_meta, region):        
        self.request_id = request_id        
        self.credentials = credentials        
        self.function = function_meta        
        self.service = service_meta        
        self.region = region        
        self.account_id = account_id

context 中包含了以下信息:

信息类型 信息类型说明
requestId 本次调用请求的唯一 ID,您可以把它记录下来在出现问题的时候方便查询。
function 当前调用的函数的一些基本信息,例如函数名、函数入口、函数内存和超时时间。
credentials 函数计算服务通过扮演您提供的服务类型获得的一组临时密钥,其有效时间是 6 小时,具体内容请参见服务角色。您可以在代码中使用 credentials 去访问相应的服务( 例如 OSS ),这就避免了您把自己的 AK 信息作为硬编码写在函数代码里。
service 当前调用的函数所在的 service 的信息,包含 service 的名字、接入的 SLS 的 logProject 和 logStore 信息、service 的版本信息、 qualifier 和 version_id。其中 qualifier 表示调用函数时指定的 service 版本或别名,version_id 表示实际调用的 service 版本。
region 当前调用的函数所在区域,例如 cn-shanghai。
accountId 当前调用函数用户的阿里云 Account ID。

在下面的代码示例中,演示了如何使用临时密钥向 OSS 中上传一个文件。

import json
import oss2

def my_handler(event, context):    
    evt = json.loads(event)    
    creds = context.credentials   
    # do not forget security_token    
    auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)    
    bucket = oss2.Bucket(auth, evt['endpoint'], evt['bucket'])    
    bucket.put_object(evt['objectName'], evt['message'])   
    return 'success'
注意 使用临时密钥访问 OSS 时要带临时 Token。