无服务器REST API“只需5分钟即可完成”

哈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创建角色


  1. 在AWS管理控制台中,转到AWS IAM服务,然后转到“角色”选项卡,单击“创建角色”按钮;

    添加新角色

  2. AWS Lambda将使用我们现在创建的角色来读取AWS S3中的信息。 因此,在下一步中,选择“选择受信任的类型”->“ Aws服务”,然后选择“选择将使用此角色的服务”->“ Lambda”,然后单击按钮“下一步:权限”

    Lambda服务角色

  3. 现在,您需要为将在新创建的角色中使用的AWS资源设置访问策略。 因为 策略列表非常令人印象深刻,使用策略过滤器时,我们会在其上注明“ S3”。 结果,我们获得了S3服务的过滤列表。 请注意“ AmazonS3ReadOnlyAccess”策略对面的复选框,然后单击“下一步:标签”按钮。

    角色政策

  4. 步骤(添加标签(可选))是可选的,但是您可以根据需要为“角色”指定标签。 我们将不执行此操作,而是继续进行下一步-预览。 在这里,您需要设置角色名称-“ ForLambdaS3-ReadOnly”,添加描述,然后单击“创建角色”按钮。

    标题角色


角色,所有内容均已创建,我们可以在以后的工作中使用它。

在AWS Lambda中创建新功能


  1. 转到AWS Lambda服务,然后单击“创建功能”按钮:

    功能创造


    填写所有字段,如下面的屏幕快照所示:

    • 名称-“ getAllBondsList”;
    • 运行时-“ Python 3.6”
    • 角色-“选择现有角色”
    • 现有角色-在这里我们选择上面创建的角色-ForLambdaS3-ReadOnly

    名称和角色选择

  2. 只需编写功能代码并在各种测试运行中检查其性能即可。 应该注意的是,任何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 } 

    将代码(或编写您自己的代码)插入“功能代码”块,然后单击屏幕右上角的“保存”按钮。

    代码插入

  3. 创建测试事件。 插入代码后,该功能可用于启动和测试。 单击“测试”按钮并创建一些测试事件:使用不同的参数启动lambda_handler函数。 即:

    • 用参数'page'启动功能:'100';
    • 使用'page'参数启动功能:'1000000';
    • 用'page'参数启动函数:'bla-bla-bla';
    • 运行不带“ page”参数的函数。

    测试事件第100页


    通过发送测试事件页面== 100来启动创建的函数。从下面的屏幕截图可以看出,该函数成功运行,返回了状态200(OK),以及与使用分页的第100页分割数据相对应的集合的集合。

    触发测试事件Page100


    为了使实验更纯净,我们将启动另一个测试事件-“ PageBlaBlaBla”。 在这种情况下,该函数返回结果,并带有代码415和注释,该注释有必要检查所传递参数的正确性:

    测试事件PageBlaBlaBla


    PageBlaBlaBla事件触发



API创建


在测试完所有其他情况并且理解Lambda函数可以按我们预期的那样工作之后,我们继续创建API。 让我们为上面创建的Lambda函数创建一个访问点,并使用API​​密钥另外设置保护以防止意外启动。

  • 转到AWS API Gateway服务。 单击创建API按钮,设置API名称-getAllBondsList

    创建一个新的API

  • 将GET方法添加到新创建的API。 为此,选择操作->创建方法,在下拉列表中选择GET方法,然后单击复选标记

    新的GET方法


    接下来,我们指示GET方法将使用我们的Lambda函数getAllBondsList。 选择它,然后单击“保存”按钮。

    Lambda函数绑定

  • 让我们部署我们的API,从而获得用于调用API的URL。
    单击操作->部署API,然后单击部署阶段->新建阶段
    可以在不同阶段部署API,您可以根据需要调用这些阶段(例如DEV / QA / PROD)。 我们将立即部署到PROD。
    部署API


    部署后,将提供启动新创建的API的链接。 我们将在浏览器的地址栏中访问该URL(或在终端中执行curl命令)-我们将获得API调用,并因此启动Lambda函数:

    API网址


    我将使用Postman应用程序演示AWS API Gateway。 在其中,您可以轻松调试和测试API的运行。

    首次API测试
    将URL从PROD阶段复制到Postman并将GET请求发送到我们的API:



    似乎出了点问题... GET请求返回了一个带有代码400的JSON响应,并提示未在API调用请求中设置Page参数。 向API添加对请求参数的支持。
  • 支持请求中传递的参数。
    我们返回到GET请求的设置,然后转到“方法请求”步骤。

    方法要求


    在“方法请求”的详细设置中,您需要展开“ URL查询字符串参数”块,并添加一个新参数“ page”并将其设置为Required:

    添加参数


    我们返回到“方法执行”页面,然后转到“集成请求”。 我们转到页面底部,然后打开“映射模板”块。 选择“当没有定义模板时(推荐)”,在“内容类型”字段中,指定application / json ,然后单击复选标记。 我们向下滚动页面,然后在文本框中输入代码,如下图所示。 之后,单击“保存”按钮。

    方法要求


    先前已经进行了API部署,我们再次检查,但是传递了“ page”参数:



    成功了! 现在,请求已成功解决,并将第十页中包含的集合返回给我们! 万岁!
  • 仍然只是为了保护我们的API免受来自外部的有害攻击。

    为此,您需要以这样一种方式配置API,即在访问API时需要一个秘密密钥,该密钥将传递给标头。

    转到API密钥并创建一堆新的API密钥-KeyForBondsList。

    API密钥


    成功创建API密钥后,必须指定getAllBondsList API必须要求在请求标头中传递API密钥。 并将特定的KeyForBondsList绑定到getAllBondsList API。

    让我们返回到“方法请求”中GET请求的设置,并将“ API Key Required”参数从false更改为true。 现在,API将要求传输API密钥。

    需要API密钥


    转到使用计划并创建一个使用API​​的新计划。

    首先,我们给它一个名称和描述,其次,在这里您可以设置启动API的限制,例如,每秒不超过一次启动,等等。

    创建使用计划


    单击下一步,然后转到下一个页面,您需要在该页面上将API的各个阶段与使用计划联系起来:

    将阶段绑定到使用计划


    在下一页上,我们将API密钥绑定到使用该API的计划。 单击将API密钥添加到使用计划按钮,然后按名称在前面的步骤中找到创建的API密钥:

    将API密钥绑定到使用计划


    执行完部署并再次运行API的GET调用后,我们得到了答案:“禁止”,因为 请求标头缺少API密钥:



    让我们尝试通过从API密钥-> KeyForBondsList-> API密钥->显示并通过密钥“ x-api-key”将其粘贴到请求的相应部分中来添加它:



    一切顺利! 这次,请求返回的数据没有任何问题,API调用是安全的,并且通过秘密API密钥保护免受入侵者的侵害。

结论与总结


在本文中,我们研究了使用Amazon云服务创建无服务器的可自动伸缩REST API。 这篇文章的数量不是最少,但是我试图尽可能地解释创建API的整个过程并组成整个动作序列。

我敢肯定,在重复了本文所述的步骤后,您可以在5分钟甚至更快的时间内提高云API。

由于其相对简单,便宜和强大的功能,AWS API Gateway服务为开发人员在工作和商业项目中使用提供了广泛的机会。 为了巩固本文中的理论材料,请尝试注册免费的Amazon Web Services年度订阅,然后亲自执行上述步骤以创建REST API。

如有任何疑问和建议,我准备很高兴进行交谈。 我期待您对本文的评论,并祝您成功!

Source: https://habr.com/ru/post/zh-CN435180/


All Articles