AWS Lambda + API Gateway 实践

/ 0评 / 1

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