介绍
在本文中,我将介绍一个完整的(Java)示例,该示例集成了AWS Lambda,DynamoDb和Api Gateway以创建一个函数,并将该函数作为HTTP资源公开给其他方使用。
在深入研究细节之前,我将简要概述本示例中使用的AWS服务(摘自AWS文档):
- AWS Lambda。 AWS Lambda是一项计算服务,可响应事件运行开发人员的代码并自动管理事件的计算资源,从而使构建易于响应新信息的应用程序变得容易。
- DynamoDB:快速,灵活,托管的NoSql数据库。
- Api网关:Amazon API Gateway是一项完全托管的服务,使开发人员可以轻松地创建,发布,维护,监控和保护各种规模的API。
在此示例中,我们将创建一个lambda函数来跟踪特定移动设备的位置(纬度和经度)。 数据流如下所示:
移动设备-> HTTP POST-> Api网关-> recordLocation(Lambda函数)-> DynamoDb(存储位置)
创建应用程序
先决条件:
- IntelliJ Idea用于此示例,但是任何IDE都可以。 Gradle用于构建系统。
- 实际部署和运行示例的AWS帐户。
- 完成示例后,请删除您创建的所有AWS资源以防止不必要的计费。
对于Lambda函数的实现,我们使用AWS Java SDK。
1.在IntelliJ中,选择File-> New project,然后选择带有Java库的Gradle。 点击下一步
2. groupId = com.example,artifactId = locationpersister。 点击下一步。
3.选择一个Java 8 IDE,然后单击“下一步”,再单击“完成”。
4.创建src / main / java文件夹(如果尚不存在)。
5.打开de build.gradle文件并添加以下依赖项:
compile 'com.amazonaws:aws-lambda-java-core:1.1.0'
compile 'com.amazonaws:aws-lambda-java-events:1.1.0'
6.将以下代码添加到build.gradle文件中:
task buildZip(type: Zip) {
from compileJava
from processResources
into('lib') {
from configurations.runtime
}
}
build.dependsOn buildZip
触发构建任务时,以上代码将创建一个zip存档。 可以将zip文件直接上传到AWS Lambda。
7.创建一个类com.example.persister.DeviceLocation,其成员为:lat(double),lng(double)和deviceId(string)。 该类保存提交给Lambda函数的数据。
8.创建一个新类com.example.persister.LocationPersisterFunction。 此类将保存Lambda函数的实现。
9.使LocationPersisterFunction实现com.amazonaws.services.lambda.runtime.RequestHandler
接口。
此接口定义handleRequest函数,该函数在触发Lambda函数时执行。 handleRequest函数带有两个参数:输入(属于DeviceLocation类型,在调用该函数时,将其传递给Context对象)。
创建DynamoDb表
要将数据存储在DynamoDB中,我们需要创建一个表。
1.打开AWS控制台,然后导航到DynamoDB部分。
2.单击创建表,名称使用:“ DeviceLocation”。 键入id(字符串字段)以用作分区键,并且不指定排序键。 将所有内容保留为默认值,然后单击创建。
3.请注意,该表是在所选区域中创建的。 如果单击表格并查看详细信息,则可以看到表格的区域。
创建DeviceLocation类
DeviceLocation类保存输入,该输入将传递给Lambda函数。
1.使用以下字段创建一个名为DeviceLocation的新类:id(字符串),lat(双精度)和lng(双精度)
2.确保该类同时包含setter和getter。 调用Lambda函数时,AWS Lambda使用设置器根据传入的JSON填充此对象。
实施Lambda函数
1.打开LocationPersisterFunction
2.将以下代码添加到handleRequest方法的主体中:
final AmazonDynamoDBClient client = new AmazonDynamoDBClient(new EnvironmentVariableCredentialsProvider());
client.withRegion(Regions.EU_WEST_1); // specify the region you created the table in.
DynamoDB dynamoDB = new DynamoDB(client);
Table table = dynamoDB.getTable("DeviceLocation");
final Item item = new Item()
.withPrimaryKey("id", UUID.randomUUID().toString()) // Every item gets a unique id
.withString("deviceId", input.getDeviceId())
.withDouble("lat", input.getLat())
.withDouble("lng", input.getLng());
table.putItem(item);
return null;
3.确保更改区域以匹配在其中创建表的区域。
4.上面的代码获取了对DynamoDB DeviceLocation表的引用,创建了一个项目并将其持久化。
5.执行gradle构建任务以创建zip归档文件或我们的代码。
5.现在,实现已完成,我们准备创建我们的AWS Lambda函数。
创建Lambda函数
1.打开AWS控制台,然后导航至Lambda部分。
2.选择空白功能,然后单击下一步(在此阶段我们不创建触发器)。
3.作为名称,选择:persistDeviceLocation,然后选择Java 8作为运行时。
4.上传/build/distributions/locationpersister-1.0-SNAPSHOT.zip文件
5.在Handler字段中,指定实现我们的处理程序的标准类名:com.example.persister.LocationPersisterFunction
6.在角色字段中,选择创建自定义角色。 创建角色表单已打开。 使用lambda_location_persister作为角色名称,然后单击允许。 在“现有角色”字段中创建并选择了该角色。 参见屏幕截图“ lambda_role”
7.保留所有默认设置,然后单击下一步
8.单击创建功能
创建函数后,我们将使用AWS控制台进行测试。
1.单击测试
2.将打开一个对话框,您可以在其中指定发送到Lambda函数的数据。 使用以下测试数据:
{
"deviceId": "deviceId",
"lat": 52.5,
"lng": 5.5
}
3.您可以随时通过单击操作->配置测试事件来修改测试数据。
4.完成后,单击测试
5.如果一切按计划进行,您将收到一条错误消息,指出以下内容:状态代码:400; 错误代码:AccessDeniedException
6.到目前为止,这是正确的。 尽管我们创建了自定义角色,但没有授予该角色访问DynamoDB表的权限。
将DynamoDB权限添加到我们的角色
1.打开AWS控制台,然后导航到IAM部分。
2.单击角色
3.单击lambda_location_persister打开它。
4.单击附加策略
5.在过滤器字段中搜索DynamoDB
6.选择AmazonDynamoDBFullAccess策略,然后单击附加。
7.浏览回到AWS Lambda并再次测试该功能。 该功能应该成功。
8.导航到DynamoDB并选择DeviceLocation表,然后单击项目。 您应该看到一个项目添加到表中。
9如果收到状态码:400; 错误代码:ResourceNotFoundException错误,请检查您在Lambda实现中指定的区域与DynamoDB表的区域相对应。
创建API网关
API网关用于创建HTTP端点,该端点是Lambda函数的触发器。 应用程序可以通过HTTP与该端点进行通信。
1.打开AWS控制台,然后导航到API Gateway。
2.创建一个新的API。 作为名称使用:LocationPersisterApi
3.单击创建API
4.选择操作->并单击创建资源,请参见screenshot_create_resource。
5.作为资源名称使用:devicelocation,然后单击创建资源。
6.选择Actions->,然后单击Create Method并选择POST。
7.在方法详细信息中,选择“集成类型:Lambda函数”,“ Lambda区域”(在其中创建Lambda函数的区域)以及“ Lambda函数:persistDeviceLocation”(Lambda函数的名称))
8.单击保存,然后单击确定。
9.单击“测试”,然后在正文中粘贴测试消息。 该消息可以与Lambda函数的“测试”部分中使用的消息相同。 填充主体后,单击“测试”。 如果一切正常,您应该看到HTTP 200状态代码。
10.选择Actions-> Deploy API,然后选择[New Stage]。 指定prod作为阶段名称。
11.单击部署。 将部署您的API,以便可以从外部访问它。
12.导航到生产阶段,展开资源并选择POST方法。 将网址复制到“邮递员”等“调用网址”文本之后。 执行带有测试消息正文的HTTP帖子。 您应该看到HTTP 200状态代码(成功)。
13.如果现在打开DynamoDB表并列出项目,则应该看到添加到表中的几项。
结论
AWS Lambda,DynamoDB和API Gateway具有强大的功能,可以在云中预配置功能,而无需预配置整个服务器或更全面的托管服务(例如弹性beantalk)。 这篇文章向您展示了如何使用这些AWS服务来创建Lambda函数,该函数使用DynamoDB并通过API网关使其可用。
资源资源
–示例项目的完整源代码可以在Github上找到。
– AWS Lambda
– AWS DynamoDB – AWS Api网关
翻译自: https://www.javacodegeeks.com/2016/12/aws-lambdajava-dynamodb-api-gateway-integration.html