在函数计算服务中使用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
字段相对应。例如创建函数时指定的handler
为main.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'