国内云计算不管是腾讯云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,要不虚拟机,要不付钱,还是比较麻烦.