AWS Lambda 无服务器应用程序初探

最后更新时间 2020-01-13 15:26:05

购买服务器费钱,虽然预算紧张可以购买配置较低的,但是管理服务器这事,谁干谁知道,这里就不多说了。而 AWS Lambda,只需上传代码,无需购买和管理服务器。Lambda 会处理运行和扩展高可用性代码所需的一切工作,可以构建任何规模的应用程序。Web、移动、实时数据流处理、物联网 (IoT) 和第三方 API 请求等。

今天我完整的讲解下整个的搭建过程,在函数内接收 GET 请求的参数,向外部发送请求以及把数据写入到 Aws 自家的 No SQL 数据库 DynamoDB 当中。

AWS Lambda 轻松运行代码,无需考虑服务器

控制台地址 https://console.aws.amazon.com/lambda/,点击「创建函数」进入到创建页面。

AWS Lambda 函数创建

我们选择「从头开始创作」,输入你想定义的名称,我这里填写的是「myFirstfunction」。选择你想使用的代码语言解释器,我后续打算写 Python 代码,所以这里选择了 Python 的解释器。权限部分选择「创建具有基本 Lambda 权限的新角色」,这其实也是创建一个新的 「IAM」权限管理角色,可以通过在「IAM」管理控制台查看管理。最后点击创建函数。

AWS Lambda 创建函数 从头开始创作

此函数的管理界面。

adkeh.png

AWS Lambda 开发人员指南中文文档 https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/welcome.html

Amazon API Gateway 构建、部署和管理 API

Amazon API Gateway 是一项 AWS 服务,用于创建、发布、维护、监控和保护任意规模的 REST 和 WebSocket API。部署完成后,系统会分配一个域名,也可以自定义域名。

我们需要为函数部署一个 API 访问地址,这就需要用 Amazon API Gateway 了。可以直接通过控制台创建。但是我们这里通过 Lambda 函数管理界面中来创建,点击 Lambda 函数管理界面中「Designer」部分的「添加触发器」,在下拉框中选择「API Gateway」。

AWS Lambda 添加触发器 Amazon API Gateway

API 选择「创建新 API」,选择模版中选择「REST API」,安全性选择「打开」,「API 名称」和「部署阶段」因为这里只是演示,所以我使用了默认生成的命名,你也完全可以自定义。

AWS Lambda 添加触发器 Amazon API Gateway 创建新 API

点击「添加」后,页面自动回到了 Lambda 函数页面,展示 API Gateway 信息。API 终端节点信息就是程序的访问地址。

AWS Lambda 添加触发器 Amazon API Gateway 详细信息

这里是自动创建了一个 ANY 方法,但是我们现在需要的是 GET 方法,并且我们是需要在代码里面接收参数,所以需要去控制台进行设置。https://console.aws.amazon.com/apigateway/home,进入到控制台后,就看到了我们刚才在 Lambda 函数中创建的 API。

Amazon API Gateway

点击 API 名称,进入到管理页面。

Amazon API Gateway 资源

我们点击资源列中的「  /myFirstfunction」然后点击「操作」,选择「创建方法」。

Amazon API Gateway 创建方法

在下拉框中,选择「GET」。

Amazon API Gateway 创建方法 GET

再继续点击“对勾”

Amazon API Gateway 创建方法 GET


点击“对勾”后,会进入到这个请求方法的设置页面,集成类型为「Lambda 函数」,Lambda 区域是你在创建 Lambda 函数的所属区域,Lambda 函数填写你那会创建的 Lambda 函数名称。保存。

Amazon API Gateway GET 设置

保存后的界面。

Amazon API Gateway GET 方法执行


而我们需要设置的请求参数等,需在进入到「集成请求」里面进行设置,在「映射模版」区域当中的「请求正文传递」选择「当未定义模板时 (推荐)」,点击「添加映射模板」,在 Content-type 内填写  `application/json` 并点击“对勾”确定。

Amazon API Gateway 集成请求 映射模版

我这里需要接收的 GET 参数为 token,并且需要获得客户端的 IP 以及 UA 信息。

Amazon API Gateway 集成请求 映射模版 请求参数 IP UA

{
    "token": "$input.params('token')",
    "context" : {
        "source-ip" : "$context.identity.sourceIp",
        "user-agent" : "$context.identity.userAgent"
    }
}

点击「保存」,然后在「操作」中点击「部署 API」。

Amazon API Gateway 部署 API

在弹框中,部署阶段里面选择「default」即可,这个 default 就是在 Lambda 函数添加  API Gateway 触发器中的「部署阶段」。点击「部署」刚才的修改就生效了。

Amazon API Gateway 部署

Amazon API Gateway 开发人员指南中文文档 https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/welcome.html

Amazon DynamoDB

Amazon DynamoDB 是一种完全托管的 NoSQL 数据库服务,提供快速且可预测的性能,同时还能够实现无缝扩展。使用 DynamoDB,您可以免除操作和扩展分布式数据库的管理工作负担,因而无需担心硬件预置、设置和配置、复制、软件修补或集群扩展等问题。DynamoDB 还提供静态加密,这消除了在保护敏感数据时涉及的操作负担和复杂性。

访问 DynamoDB 控制台 https://console.aws.amazon.com/dynamodb/,点击「创建表」,填写「表名称」和「主键」,然后「创建」。实际的生产环境,命名要有意义。

创建 DynamoDB 表

我们下一步需要给予 Lambda 函数管理 DynamoDB 的权限,咱们在创建 Lambda 函数的时候,在权限部分选择的是「创建具有基本 Lambda 权限的角色」的,并且我说明了这个就是给你创建了一个 IAM 角色,在 IAM 控制台可进行管理,现在我们进入到 IAM 管理控制台 https://console.aws.amazon.com/iam,我这里显示的角色是 3,是因为之前有其它服务创建了 2 个角色的,加上函数所需的,也就是 3 个了。

IAM

点击上图中的「角色」进入管理页面。再点击我们需要管理的角色名称对这个角色管理,我这里很明显的就看出来是「myFirstfunction-role-g6i4osdk」。

IAM 角色

点击「附加策略」

IAM 摘要

在搜索框里面输入「DynamoDB」,会列出相关权限,我这里选择的是「AmazonDynamoDBFullAccess」,接着点击「附加策略」完成授权。

IAM 附加权限

完成授权后,接着需要把 Lambda 函数与 DynamoDB 连接起来,这个时候,我们回到那会创建的 Lambda 函数界面内,点击 Designer ,点击「添加触发器」,选择「DynamoDB」。

Lambda 添加 DynamoDB 触发器

因为我现在只有一个 DynamoDB 表,这里就会自动选择上,其他的设置可根据实际情况进行修改,我这里就保持了默认。最后点击「添加」。

Lambda 添加 DynamoDB 触发器

Amazon DynamoDB 开发人员指南中文文档 https://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/Introduction.html

代码

创建函数的时候,就自动给你生成了一个演示代码。编写代码可以在 Lambda 函数内,也可以本地打包后进行上传。

Lambda 函数代码

在本文开始的时候,我希望在代码中具备请求外部 API 的能力,所以,我需要在本地生成依赖后,然后再上传。

pip3 install --target ./package requests
cd package
zip -r9 ${OLDPWD}/lambda-function.zip .
cd $OLDPWD
touch lambda_function.py
zip -g lambda-function.zip lambda_function.py

压缩成功完成后,在「函数代码」中,选择「上传 zip 文件」

Lambda 函数代码 上传 ZIP 文件

点击「上传」,上传咱们刚才压缩包。点击右上角的「保存」按钮。

Lambda 函数代码 上传 ZIP 文件 保存

上传成功后。

Lambda 函数代码

编辑 lambda_function.py,这里就写一下接收参数和写数据表的代码示例,生产环境中一定要严谨。

import json, requests, boto3

def lambda_handler(event, context):
    
    # 接收 GET 请求的 token 参数
    token = event.get('token', '')
    # 获得客户端请求 IP
    ip    = event['context']['source-ip']

    # 一个外部请求
    url = 'XXXXXXXX'
    r = requests.post(url, data={
        'secret': 'KXtKCjTbC51jD-g',
        'response': token
    })

    # 写入到
    dynamodb = boto3.resource('dynamodb', region_name='填写部署区域')
    table    = dynamodb.Table('表名')
    response = table.put_item(
		  
        Item={ # 创建表时设定的主键 key 别忘了写
            'key1': 'value1',
            'key2': 'value2',
            'key3': 'value3'
        }
    )

点击右上角保存,等到完成,完活!

Lambda 函数代码 保存

清除

测试搞完后,如果要清除的话,除了 Lambda 控制台、API Gateway 控制台、DynamoDB 控制台,别忘了还有 IAM 控制台。

总结

AWS Lambda 创建函数,创建 API Gateway,到 API 网关管理请求方法和配置请求参数。Amazon DynamoDB 控制台中创建表后,到 IAM 中对 Lambda 相关角色增加数据表操作权限,返回到 Lambda 中进行添加触发器 DynamoDB。代码如果需要外部依赖,需要在本地处理完成后再上传到 Lambda 中。