国内云计算不管是腾讯云SCF还是阿里云FC,HTTP触发器都集中在FC功能内配置,算是个简单的API Gateway,但是AWS却是分开的.AWS是支持自定义运行时,但是最好还是使用推荐运行时.
首先,新建一个Lambda函数,我用Python 3语法来做,名字叫EchoParameter
代码如下,资源我就配128M都足以.
import json def respond(err, res=None): return { 'statusCode': '400' if err else '200', 'body': err.message if err else json.dumps(res), 'headers': { 'Content-Type': 'application/json', }, } def lambda_handler(event, context): return respond(None, str(event['queryStringParameters']))
然后添加一个API GateWay触发器,名字还是EchoParameter,部署阶段就是API版本号,我就写v1吧.然后添加即可.
在API Gateway控制面板看到基础URL.
访问测试发现是可以的,黄色部分是基础网址,红色是API名,蓝色是参数.默认创建是支持ANY方法的,当然这个是可以改的.
当然,后端也可以用自定义运行时实现,需要特别注意的是返回的数据,状态码等都是字符串,body整体是个字符串.
参考CMakeLists.txt
cmake_minimum_required(VERSION 3.5) set(CMAKE_CXX_STANDARD 11) project(demo LANGUAGES CXX) find_package(aws-lambda-runtime) find_package(AWSSDK COMPONENTS core) add_executable(${PROJECT_NAME} "main.cpp") target_link_libraries(${PROJECT_NAME} PUBLIC AWS::aws-lambda-runtime ${AWSSDK_LINK_LIBRARIES}) target_compile_options(${PROJECT_NAME} PRIVATE "-fno-exceptions" "-fno-rtti" "-Wall" "-Wextra" "-Wconversion" "-Wno-sign-conversion") target_compile_features(${PROJECT_NAME} PRIVATE "cxx_std_11") aws_lambda_package_target(${PROJECT_NAME})
参考基础源码:
#include <aws/core/utils/json/JsonSerializer.h> #include <aws/lambda-runtime/runtime.h> static aws::lambda_runtime::invocation_response my_handler(aws::lambda_runtime::invocation_request const& req) { /* 解释收到的数据,以JSON格式传进来的哦,如果不正常访问,自然直接让他返回了. */ Aws::Utils::Json::JsonValue request(req.payload); if (!request.WasParseSuccessful()) { return aws::lambda_runtime::invocation_response::failure("Failed to parse input JSON", "InvalidJSON"); } /* 下面都是构造JSON回应包 */ Aws::Utils::Json::JsonValue response; Aws::Utils::Json::JsonValue headers; Aws::Utils::Json::JsonValue parameters(request.View().GetObject("queryStringParameters").WriteCompact()); /* 这个是提取出来的参数. */ headers.WithString("Content-Type", "application/json"); response.WithString("statusCode", "200"); response.WithString("body", parameters.View().WriteCompact()); /* 特别注意主体内容是字符串的. */ response.WithObject("headers", headers); auto const invocation_payload = response.View().WriteCompact(); /* 返回一定是application/json,否则出错. */ return aws::lambda_runtime::invocation_response::success(invocation_payload,"application/json"); } int main() { aws::lambda_runtime::run_handler(my_handler); return 0; }
这个C代码执行效果跟上面的一样,C Runtime有个比较大的缺点,代码包特别大(因为他有关的无关的库全打包了),但是二进制执行很快,惊人的0.95秒就执行完了.
但是有一个坑,尽量在AMAZON LINUX中完成构建,否则不一定保证能跑,而这个实例要不Docker,要不虚拟机,要不付钱,还是比较麻烦.