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

背景信息

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

  • Python 2.7(runtime=python 2.7)
  • Python 3.6(runtime=python 3)

事件函数示例

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

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

事件函数名

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

事件event参数

  • event参数是用户调用函数时传入的数据,在Python 2.7中是str类型,在Python 3中是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。