哈Ha! 今天,我们继续讨论Amazon Web Services提供给我们的机会以及如何利用这些机会解决应用程序问题。
在一个简单的示例中,我们将考虑在短短几分钟内创建我们自己的无服务器可自动缩放的REST API,并进行案例分析-获取资源列表。
有意思吗 然后切下!
(来源)而不是加入
我们将不使用任何数据库来解析示例;相反,我们的信息源将是AWS S3上的纯文本文件。
- 因此,假设在AWS S3上我们有一个带有标题的文本文件,并且某些进程向其中写入信息。
- 我们将创建一个云API,该API将通过传递的参数返回JSON响应作为GET请求。
- 同时,根据任务的复杂性,以及随之而来的对资源处理能力的更高要求,您不必担心,因为 该服务是完全可自动缩放的。 这意味着您不需要任何管理,服务器分配和管理,只需上传代码并运行它即可。
正在开发的系统架构

使用的Amazon Web Services组件:
- Amazon S3-对象存储,可让您存储几乎无限量的信息;
- AWS Identity and Access Management(IAM) -一种服务,能够安全地控制对AWS服务和资源的访问。 使用IAM,您可以创建,管理,管理AWS用户和组,并使用权限来授予或拒绝对AWS资源的访问;
- AWS Lambda是一项服务,使您可以运行代码而无需备份和配置服务器。 每个呼叫的所有计算能力都会自动调整。 该费用是根据功能请求的数量及其持续时间(即 执行代码的时间。
免费访问级别(免费套餐)意味着每月免费和400K Gb-s的百万请求。 支持的语言:Node.js,Java,C#,Go,Python,Ruby,PowerShell
。 我们将使用Python:
- boto3库是一个适用于Python的AWS开发工具包,允许您与各种Amazon服务进行交互。
- Amazon API Gateway是一项完全托管的开发人员服务,旨在创建,发布,维护,监控和保护各种规模的API。 除了可以使用同一API(阶段)的多个版本进行调试,优化和测试外,该服务还允许您使用AWS Lambda创建无服务器的REST API。 Lambda在高度可访问的计算基础架构中执行代码,从而无需服务器分发,扩展和管理。
HTTP / REST API的免费层包括每月12个月的一百万次API调用
资料准备
带标签的文本文件将用作字段定界符,作为信息源,用于生成对GET REST请求的响应。 现在,此信息对本示例而言并没有多大关系,但是为了进一步使用API,我从Quik交易终端下载了以俄罗斯卢布计价的债券的当前交易表,将其保存在bond.txt中,并将此文件放置在专门创建的AWS S3存储桶中。
接收到的信息的示例如下图所示:

接下来,您需要编写一个函数,该函数将从bonds.txt文件中读取信息,进行解析并根据要求发布。 AWS Lambda可以做到这一点。 但是首先,您需要创建一个新角色,该角色将允许创建的Lambda函数从位于AWS S3中的存储桶中读取信息。
为AWS Lambda创建角色
- 在AWS管理控制台中,转到AWS IAM服务,然后转到“角色”选项卡,单击“创建角色”按钮;
- AWS Lambda将使用我们现在创建的角色来读取AWS S3中的信息。 因此,在下一步中,选择“选择受信任的类型”->“ Aws服务”,然后选择“选择将使用此角色的服务”->“ Lambda”,然后单击按钮“下一步:权限”
- 现在,您需要为将在新创建的角色中使用的AWS资源设置访问策略。 因为 策略列表非常令人印象深刻,使用策略过滤器时,我们会在其上注明“ S3”。 结果,我们获得了S3服务的过滤列表。 请注意“ AmazonS3ReadOnlyAccess”策略对面的复选框,然后单击“下一步:标签”按钮。
- 步骤(添加标签(可选))是可选的,但是您可以根据需要为“角色”指定标签。 我们将不执行此操作,而是继续进行下一步-预览。 在这里,您需要设置角色名称-“ ForLambdaS3-ReadOnly”,添加描述,然后单击“创建角色”按钮。
角色,所有内容均已创建,我们可以在以后的工作中使用它。
在AWS Lambda中创建新功能
- 转到AWS Lambda服务,然后单击“创建功能”按钮:
填写所有字段,如下面的屏幕快照所示:
- 名称-“ getAllBondsList”;
- 运行时-“ Python 3.6”
- 角色-“选择现有角色”
- 现有角色-在这里我们选择上面创建的角色-ForLambdaS3-ReadOnly
- 只需编写功能代码并在各种测试运行中检查其性能即可。 应该注意的是,任何Lambda函数(如果使用Python)的主要组件是boto3库:
import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket('your-s3-bucket') obj = bucket.Object(key = 'bonds.txt') response = obj.get()
我们的Python函数的基本思想如下:
- 打开bonds.txt文件;
- 阅读列标题;
- 按页打破记录(本例中为10个集合);
- 选择所需的页面;
- 映射列和记录的名称;
- 以集合的形式给出结果。
我们不会在功能代码本身和技术实现上花费很多时间,这里的一切都非常简单,完整的代码可在我的GitHub上找到 。
for i in range(0, len(lines_proc)): d = dict((u''.join(key), u''.join(value)) for (key, value) in zip(headers, lines_proc[i].split("\t"))) response_body.append(d) return { 'statusCode': 200, 'page' : num_page, 'body': response_body }
将代码(或编写您自己的代码)插入“功能代码”块,然后单击屏幕右上角的“保存”按钮。
- 创建测试事件。 插入代码后,该功能可用于启动和测试。 单击“测试”按钮并创建一些测试事件:使用不同的参数启动lambda_handler函数。 即:
- 用参数'page'启动功能:'100';
- 使用'page'参数启动功能:'1000000';
- 用'page'参数启动函数:'bla-bla-bla';
- 运行不带“ page”参数的函数。
通过发送测试事件页面== 100来启动创建的函数。从下面的屏幕截图可以看出,该函数成功运行,返回了状态200(OK),以及与使用分页的第100页分割数据相对应的集合的集合。
为了使实验更纯净,我们将启动另一个测试事件-“ PageBlaBlaBla”。 在这种情况下,该函数返回结果,并带有代码415和注释,该注释有必要检查所传递参数的正确性:
API创建
在测试完所有其他情况并且理解Lambda函数可以按我们预期的那样工作之后,我们继续创建API。 让我们为上面创建的Lambda函数创建一个访问点,并使用API密钥另外设置保护以防止意外启动。
结论与总结
在本文中,我们研究了使用Amazon云服务创建无服务器的可自动伸缩REST API。 这篇文章的数量不是最少,但是我试图尽可能地解释创建API的整个过程并组成整个动作序列。
我敢肯定,在重复了本文所述的步骤后,您可以在5分钟甚至更快的时间内提高云API。
由于其相对简单,便宜和强大的功能,AWS API Gateway服务为开发人员在工作和商业项目中使用提供了广泛的机会。 为了巩固本文中的理论材料,请尝试注册免费的Amazon Web Services年度订阅,然后亲自执行上述步骤以创建REST API。
如有任何疑问和建议,我准备很高兴进行交谈。 我期待您对本文的评论,并祝您成功!