腾讯云函数踩坑记录
Roy Lv7

之前使用腾讯云函数作为喝水提醒以及自动化打卡提醒/执行,微信刷步等操作,但是云函数最赞的其实是作为一个独立的api来使用。

因为一开始搞不明白,想要在云函数上部署一个fastapi 作为接口来接受请求参数,处理请求并返回json数据。因为文档看的不够仔细,导致走了很多的弯路。

其实单函数,使用api网关触发器即可实现一个web api的服务,并不需要使用http server来作为服务支撑。

函数入参

如果作为api来使用,定义的函数肯定是要接受外部参数的,函数入参就是函数在被触发调用时所传递给函数的内容。

event入参

参数类型为dict。将event入参传递给执行方法,实现代码与触发函数(event)交互。

  • 云函数被其他应用程序调用时,您可以在调用方和函数代码之间自定义一个 dict 类型的参数。调用方按照定义好的格式传入数据,函数代码按格式获取数据。
    例如,定义一个 dict 类型的数据结构 {"key":"XXX"},当调用方传入数据 {"key":"abctest"} 时,函数代码可以通过 event[key] 来获得值 abctest

context入参

将context入参传递给执行方法,代码将通过context入参对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
getRemainingTimeInMillis: [Function: getRemainingTimeInMillis],
memory_limit_in_mb: 128,
time_limit_in_ms: 3000,
request_id: '4ca7089c-3bb0-48cf-bcdb-26d130fed2ae',
environment: '{"SCF_NAMESPACE":"default"}',
environ: 'SCF_NAMESPACE=default;SCF_NAMESPACE=default',
function_version: '$LATEST',
function_name: 'test',
namespace: 'default',
tencentcloud_region: 'ap-chengdu',
tencentcloud_appid: '1253970226',
tencentcloud_uin: '3473058547'
}

Python 环境下的入参包括 event 和 context,两者均为 Python dict 类型。

  • event:使用此参数传递触发事件数据。
  • context:使用此参数向您的处理程序传递运行时信息。

安装依赖

在安装依赖这个地方碰见的坑比较多,当时只需要安装requests-html这个module,但是这个module本身在安装以及调用中也需要依赖多个modules。在lib site-package中单纯的将这个module上传到云函数,会抛出多个modules 异常。

解决方案,将当前环境下所有的依赖包的包文件夹上传到函数的同级目录下。

Api 网关触发器

api网关触发器,可以将单函数作为web的后端接口服务,对外网提供服务。

集成请求与透传请求

在配置api 网关触发器的时候,默认是开启集成请求的。

集成请求,是指 API 网关会将 HTTP 请求内容,转换为请求数据结构;请求数据结构作为函数的 event 输入参数,传递给函数并进行处理。

透传请求,是指 API 网关会将 HTTP 请求的 body 内容作为函数的 event 输入参数传递给函数,透传请求目前还处于规划过程中。对于透传请求,要求 HTTP 请求的 body 内容为 JSON 数据结构内容。

当您需要将图片或文件通过 API 网关传入云函数时,需要将图片或文件进行 Base64 编码。

API 网关触发器的集成请求事件消息结构

在 API 网关触发器接收到请求时,会将类似以下 JSON 格式的事件数据发送给绑定的云函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
"requestContext": {
"serviceId": "service-f94sy04v",
"path": "/test/{path}",
"httpMethod": "POST",
"requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef",
"identity": {
"secretId": "abdcdxxxxxxxsdfs"
},
"sourceIp": "10.0.2.14",
"stage": "release"
},
"headers": {
"Accept-Language": "en-US,en,cn",
"Accept": "text/html,application/xml,application/json",
"Host": "service-3ei3tii4-251000691.ap-guangzhou.apigateway.myqloud.com",
"User-Agent": "User Agent String"
},
"body": "{\"test\":\"body\"}",
"pathParameters": {
"path": "value"
},
"queryStringParameters": {
"foo": "bar"
},
"headerParameters":{
"Refer": "10.0.2.14"
},
"stageVariables": {
"stage": "release"
},
"path": "/test/value",
"queryString": {
"foo" : "bar",
"bob" : "alice"
},
"httpMethod": "POST"
}

数据结构内容详细说明如下:

结构名 内容
requestContext 请求来源的 API 网关的配置信息、请求标识、认证信息、来源信息。其中:serviceId,path,httpMethod 指向 API 网关的服务 ID、API 的路径和方法。stage 指向请求来源 API 所在的环境。requestId 标识当前这次请求的唯一 ID。identity 标识用户的认证方法和认证的信息。sourceIp 标识请求来源 IP。
path 记录实际请求的完整 Path 信息。
httpMethod 记录实际请求的 HTTP 方法。
queryString 记录实际请求的完整 Query 内容。
body 记录实际请求转换为 String 字符串后的内容。
headers 记录实际请求的完整 Header 内容。
pathParameters 记录在 API 网关中配置过的 Path 参数以及实际取值。
queryStringParameters 记录在 API 网关中配置过的 Query 参数以及实际取值。
headerParameters 记录在 API 网关中配置过的 Header 参数以及实际取值。

这个如果仅仅看json的话可能不太好了解,比如我构建了一个GET请求的api网关触发器,在url中传递参数给函数,url?param=2021 ,如果需要在函数中拿到2021这个参数。需要解析event。

云函数示例

当请求网关接口时候,这样就会将 ‘2021’ 返回。

跨域请求

如果发现请求时候,在network面板中看到 Missing allow cros header,说明网关的跨域请求是关闭的。

需要到触发器中找到api网关,开启跨域请求。

  • 本文标题:腾讯云函数踩坑记录
  • 本文作者:Roy
  • 创建时间:2021-03-10 13:45:30
  • 本文链接:https://www.yrzdm.com/2021/03/10/tencent-scf/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!