我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何通过AWS的Lambda和API Gateway走向Serverless

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何通过AWS的Lambda和API Gateway走向Serverless

本篇内容介绍了“如何通过AWS的Lambda和API Gateway走向Serverless”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

简短回忆下计算领域的发展

早期,出现了……好吧,这有点复杂。很早的时候,出现了机械计算机,后来又有了埃尼阿克 ENIAC(Electronic Numerical  Integrator And Computer,很早的电子计算机),但是都没有规模生产。直到大型机出现后,计算领域才快速发展。

  • 上世纪 50 年代 - 大型机

  • 上世纪 60 年代 - 微型机

  • 1994 - 机架服务器

  • 2001 - 刀片服务器

  • 本世纪初 - 虚拟服务器

  • 2006 - 服务器云化

  • 2013 - 容器化

  • 2014 - serverless(计算资源服务化)

这些日期是大概的发布或者流行日期,无需和我争论时间的准确性。计算领域的演进趋势是执行的功能单元越来越小。每一次演进通常都意味着运维负担的减小和运维灵活性的增加。

发展前景

喔,Serverless!但是,serverless 能给我们带来什么好处? 我们将面临什么挑战呢?

未执行代码时无需付费。我认为,这是个巨大的卖点。当无人访问你的站点或用你的 API  时,你无需付钱。没有持续支出的基础设施成本,仅仅支付你需要的部分。换句话说,这履行了云计算的承诺:“仅仅支付你真正用的资源”。

无需维护服务器,也无需考虑服务器安全。服务器的维护和安全将由你的服务提供商来处理(当然,你也可以架设自己的 serverless  主机,只是这似乎是在向错误的方向前进)。由于你的执行时间也是受限的,安全补丁也被简化了,因为完全不需要重启。这些都应该由你的服务提供商无缝地处理。

***的可扩展性。这是又一个大的好处。假设你又开发了一个 Pokemon Go, 与其频繁地把站点下线维护升级,不如用 serverless  来不断地扩展。当然,这也是个双刃剑,大量的账单也会随之而来。如果你的业务的利润强依赖于站点上线率的话,serverless 确实能帮上忙。

强制的微服务架构。这也有两面性,一方面,微服务似乎是一种好的构建灵活可扩展的、容错的架构的方式。另一方面,如果你的业务没有按照这种方式设计,你将很难在已有的架构中引入  serverless。

但是现在你被限制在他们的平台上

受限的环境。你只能用服务提供商提供的环境,你想在 Rust 中用 serverless?你可能不会太幸运。

受限的预装包。你只有提供商预装的包。但是你或许能够提供你自己的包。

受限的执行时间。你的 Function 只可以运行这么长时间。如果你必须处理 1TB 的文件,你可能需要有一个解决办法或者用其他方案。

强制的微服务架构。参考上面的描述。

受限的监视和诊断能力。例如,你的代码在干什么? 在 serverless  中,基本不可能在调试器中设置断点和跟踪流程。你仍然可以像往常一样记录日志并发出统计度量,但是这带来的帮助很有限,无法定位在 serverless  环境中发生的难点问题。

竞争领域

自从 2014 年出现 AWS Lambda 以后,serverless 的提供商已经增加了一些。下面是一些主流的服务提供商:

  • AWS Lambda - 起步最早的

  • OpenWhisk - 在 IBM 的 Bluemix 云上可用

  • Google Cloud Functions

  • Azure Functions

这些平台都有它们的相对优势和劣势(例如,Azure 支持 C#,或者紧密集成在其他提供商的平台上)。这里面***的玩家是 AWS。

通过 AWS 的 Lambda 和 API Gateway 构建你的***个 API

我们来试一试 serverless。我们将用 AWS Lambda 和 API Gateway 来构建一个能返回 Jimmy 所说的“Guru  Meditations”的 API。

所有代码在 GitHub 上可以找到。

API文档:

POST / {     "status": "success",     "meditation": "did u mention banana cognac shower" }

怎样组织工程文件

文件结构树:

. ├── LICENSE ├── README.md ├── server │   ├── __init__.py │   ├── meditate.py │   └── swagger.json ├── setup.py ├── tests │   └── test_server │       └── test_meditate.py └── tools     ├── deploy.py     ├── serve.py     ├── serve.sh     ├── setup.sh     └── zip.sh

AWS 中的信息

  • API。实际构建的对象。它在 AWS 中表示为一个单独的对象。

  • 执行角色。在 AWS 中,每个 Function 作为一个单独的角色执行。在这里就是 meditations。

  • 角色策略。每个 Function 作为一个角色执行,每个角色需要权限来干活。我们的 Lambda Function  不干太多活,故我们只添加一些日志记录权限。

  • Lambda Function。运行我们的代码的地方。

  • Swagger。 Swagger 是 API 的规范。API Gateway 支持解析 swagger 的定义来为 API 配置大部分资源。

  • 部署。API Gateway 提供部署的概念。我们只需要为我们的 API 用一个就行(例如,所有的都用生产或者  yolo等),但是得知道它们是存在的,并且对于真正的产品级服务,你可能想用开发和暂存环境。

  • 监控。在我们的业务崩溃的情况下(或者因为使用产生大量账单时),我们想以云告警查看方式为这些错误和费用添加一些监控。注意你应该修改  tools/deploy.py 来正确地设置你的 email。

代码

Lambda Function 将从一个硬编码列表中随机选择一个并返回 guru meditations,非常简单:

import logging import random  logger = logging.getLogger() logger.setLevel(logging.INFO)  def handler(event, context):      logger.info(u"received request with id '{}'".format(context.aws_request_id))      meditations = [     "off to a regex/",     "the count of machines abides",     "you wouldn't fax a bat",     "HAZARDOUS CHEMICALS + RKELLY",     "your solution requires a blood eagle",     "testing is broken because I'm lazy",     "did u mention banana cognac shower",     ]     meditation = random.choice(meditations)      return {         "status": "success",         "meditation": meditation,     }

deploy.py 脚本

这个脚本相当长,我没法贴在这里。它基本只是遍历上述“AWS 中的信息”下的项目,确保每项都存在。

我们来部署这个脚本

只需运行 ./tools/deploy.py。

基本完成了。不过似乎在权限申请上有些问题,由于 API Gateway 没有权限去执行你的 Function,所以你的 Lambda Function  将不能执行,报错应该是“Execution failed due to configuration error: Invalid permissions on  Lambda function”。我不知道怎么用 botocore 添加权限。你可以通过 AWS console 来解决这个问题,找到你的 API, 进到  /POST 端点,进到“integration request”,点击“Lambda  Function”旁边的编辑图标,修改它,然后保存。此时将弹出一个窗口提示“You are about to give API Gateway  permission to invoke your Lambda function”, 点击“OK”。

当你完成后,记录下 ./tools/deploy.py 打印出的 URL,像下面这样调用它,然后查看你的新 API 的行为:

$ curl -X POST https://a1b2c3d4.execute-api.us-east-1.amazonaws.com/prod/ {"status": "success", "meditation": "the count of machines abides"}

本地运行

不幸的是,AWS Lambda 没有好的方法能在本地运行你的代码。在这个例子里,我们将用一个简单的 flask 服务器来在本地托管合适的端点,并调用  handler 函数。

from __future__ import absolute_import  from flask import Flask, jsonify  from server.meditate import handler  app = Flask(__name__)  @app.route("/", methods=["POST"]) def index():     class FakeContext(object):         aws_request_id = "XXX"      return jsonify(**handler(None, FakeContext()))  app.run(host="0.0.0.0")

你可以在仓库中用 ./tools/serve.sh 运行它,像这样调用:

$ curl -X POST http://localhost:5000/ {     "meditation": "your solution requires a blood eagle",     "status": "success" }

测试

你总是应该测试你的代码。我们的测试方法是导入并运行我们的 handler 函数。这是最基本的 python 测试方法:

from __future__ import absolute_import  import unittest  from server.meditate import handler  class SubmitTestCase(unittest.TestCase):  def test_submit(self):  class FakeContext(object):  aws_request_id = "XXX"  response = handler(None, FakeContext())  self.assertEquals(response["status"], "success")  self.assertTrue("meditation" in response)

你可以在仓库里通过 nose2 运行这个测试代码。

“如何通过AWS的Lambda和API Gateway走向Serverless”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何通过AWS的Lambda和API Gateway走向Serverless

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何通过AWS的Lambda和API Gateway走向Serverless

本篇内容介绍了“如何通过AWS的Lambda和API Gateway走向Serverless”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录