从前,不久前,一个词引起了我的注意。 拉姆达。这引起了人们的共鸣,想起了小时候玩《半条命》的美好时光。我几乎不知道 AWS Lambda 是什么,以及它有多棒。如果你有兴趣,就留下来。我只会从你已经很忙的一天中抽出几分钟,你肯定不会介意的。

功能即服务

让我们直接进入。AWS Lambda 所属的架构称为Serverless Computing或Function as a Service。由于缺乏服务器,这是开创性的。这听起来很奇怪。那么代码没有在土豆上运行,是吗!?好吧,这只是一个说法。实际情况是,作为开发人员,您无需担心代码运行的基础架构。您将代码部署到云中,它会自行处理所有所需资源的创建。但是怎么做?容器!

不,不是那些。这些!

Docker是全球领先的软件容器平台。开发人员在与同事协作编写代码时使用 Docker 来消除“在我的机器上工作”的问题。运营商使用 Docker 在隔离容器中并行运行和管理应用程序,以获得更好的计算密度。企业使用 Docker 构建灵活的软件交付管道,以更快、更安全、更有信心地为 Linux、Windows Server 和 Linux-on-mainframe 应用程序交付新功能。

每次创建AWS Lambda 函数时,都会启动一个容器来为其提供服务。它实际上不是 Docker 容器,而是 AWS 构建的专有容器。我只是使用了这个例子,所以你会更容易理解它。

代码被部署到容器中,然后执行。因此,如果容器已经存在,AWS 会跳过容器的初始创建,从而使每个后续请求更快。

创建你的第一个函数

在您看到代码之前,您需要在 AWS 控制台中创建一个新函数。这意味着您需要一个 AWS 账户。如果您没有帐户,请不要犹豫,创建一个帐户,他们提供令人难以置信的免费套餐,其中包括各种服务,最长可使用 12 个月。

继续,启动浏览器并导航到您的帐户。从那里你需要找到 Lambda。按服务下拉菜单并选择 Lambda。

[AWS 服务](https://res.cloudinary.com/practicaldev/image/fetch/s--5u3cVQSH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent。 com/adnanrahic/cdn/master/getting-started-with-aws-lambda-and-nodejs/Selection_056.png)

您将登陆 Lambda 主页,并带有一个橙色的大按钮,提示您创建一个新函数。好吧,不要再等待了,按下它。

[创建函数](https://res.cloudinary.com/practicaldev/image/fetch/s--LrNMhQ5L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com /adnanrahic/cdn/raw/1a312ff8d11c43b89606f9790fda3041995a6d02/getting-started-with-aws-lambda-and-nodejs/init-fun.png)

这将带您进入主函数创建向导。由于此示例将涵盖一个模拟掷骰子的基本函数,因此让我们忘记蓝图,只从头开始编写一个。

惊人的!现在您只需要为函数添加一个名称和角色,最后开始编写一些代码。关于角色,请随意选择一个现有角色,例如lambda_basic_execution。对于这个简单的示例来说已经足够了。确保不要忘记添加 Node.js 8.10 作为运行时。最后,继续创建函数。

[功能基本信息](https://res.cloudinary.com/practicaldev/image/fetch/s--1RP8LX6i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com /adnanrahic/cdn/raw/master/getting-started-with-aws-lambda-and-nodejs/create-function.png)

伟大的!现在你终于看到了一些代码。好多了。让我们深入研究。有几个选项需要考虑。代码输入类型选项设置您将如何向函数添加代码。它可以是_内联_、上传 .zip 文件_或_从 S3 上传。我们将使用第一个选项,即内联编辑。对于小函数,内联编写代码完全没问题。但是当你有更多的代码时,它会变得非常烦人。这就是为什么有一个 .zip 上传选项,我们稍后也会谈到。

将运行时设置为Node.js 8.10,这是撰写本文时适用于 Lambda 的最新支持的 Node.js 版本。处理程序也可以保持不变。这里,index代表文件名,而handler是函数名。

[函数内联编辑器](https://res.cloudinary.com/practicaldev/image/fetch/s--9-qdukDc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github .com/adnanrahic/cdn/raw/master/getting-started-with-aws-lambda-and-nodejs/created-function-with-default-code.png)

在 AWS Lambda (6.10) 上使用以前版本的 Node.js,有 3 个主要参数:

  • event参数包含当前事件信息。这意味着触发函数的事件将向函数发送信息以供使用。一个示例是 HTTP 请求发送到端点的数据,例如它是否具有请求参数或正文。

  • context包含有关函数本身的所有信息。它运行了多长时间,消耗了多少内存等等。这被视为运行时信息。

  • callback是不言自明的。当你想告诉函数结束它的执行时,你调用回调。它有两个参数,第一个是错误,第二个是您希望作为 Lambda 函数的响应发回的数据。

由于增加了async/await支持,Node.js 8.10的情况发生了变化。handler现在可以接受一个承诺值。这就是为什么我们现在可以将async function分配给handler,并直接返回一个 Promise。不再有愚蠢的callback参数。好棒!

写一些逻辑

现在的设置就足够了。让我们编写一些代码。

我们从这段代码开始。目标是编写一段模拟掷骰子的代码。

exports.handler = async (event) => {
  // TODO implement
  return 'Hello from Lambda';
};

进入全屏模式 退出全屏模式

这里什么都没有。

exports.handler = async (event) => {
  const min = 1;
  const max = 6;    
  const randomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
  const message = 'Your dice throw resulted in: ' + randomNumber;
  return message;
};

进入全屏模式 退出全屏模式

好的!这就是诀窍。现在该函数将返回一个介于 1 和 6 之间的随机数。让我们测试一下。按下橙色测试按钮并继续创建一个简单的测试事件。没有特别的理由给它一个时髦的名字。只是为了获得一个名为FunkyName的测试事件的乐趣。现在您可以继续测试该功能。按下测试按钮后,您会看到类似这样的内容。

[功能测试](https://res.cloudinary.com/practicaldev/image/fetch/s--zh67rLm---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com /adnanrahic/cdn/raw/master/getting-started-with-aws-lambda-and-nodejs/test-function.png)

虚线边框部分显示了函数输出,更准确地说是函数发回的返回值。

那很有趣!您现在有一个 roll a dice 功能,但还没有办法在 AWS 之外触发它。

连接API

关键的部分来了。您认为 lambda 函数如何知道如何开始执行?巫毒?魔法?不,很遗憾没有。每个函数调用都由一个事件触发。它可以是图像上传到 S3 的时间,也可以是 Amazon Alexa 技能,或者只是一个常规的 HTTP 请求。

让我们创建一个 HTTP 事件并告诉它调用我们的函数。为此,您首先需要在 AWS 控制台中跳转到API Gateway。在服务下拉列表中选择 API Gateway,您将登陆此处。

[API 网关入门](https://res.cloudinary.com/practicaldev/image/fetch/s--wtdxyv2Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw. githubusercontent.com/adnanrahic/cdn/master/getting-started-with-aws-lambda-and-nodejs/Selection_062.png)

系统会立即提示您创建 API。忽略所有建议,只需选择 New API 并为您的 API 输入名称。我会坚持使用 FunkyApi,听起来不错。继续并点击创建。

[创建 API](https://res.cloudinary.com/practicaldev/image/fetch/s--l1yZXmI0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent. com/adnanrahic/cdn/master/getting-started-with-aws-lambda-and-nodejs/Selection_063.png)

有趣的来了。最后将 API 连接到函数。首先按 Actions 下拉菜单并选择 Create method。您会看到另一个较小的下拉菜单出现。按下它,然后选择 GET。将集成类型设置为 Lambda 函数,选择您创建函数的区域并编写函数名称。

[创建方法和挂钩 Lambda](https://res.cloudinary.com/practicaldev/image/fetch/s--nb_yJbAV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw .githubusercontent.com/adnanrahic/cdn/master/getting-started-with-aws-lambda-and-nodejs/Selection_064.png)

点击保存并欢欣鼓舞!

API 已设置并准备就绪。您现在只需要部署它。再次按下 Actions 下拉菜单并点击 Deploy API。选择一个新的部署阶段,记下 dev 作为阶段名称,您就可以部署 API。

[部署 API](https://res.cloudinary.com/practicaldev/image/fetch/s--ys3sBotO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent. com/adnanrahic/cdn/master/getting-started-with-aws-lambda-and-nodejs/Selection_065.png)

最后! API 端点已准备就绪。您现在可以访问 dev Stage Editor 上的 Invoke URL

[API 已部署](https://res.cloudinary.com/practicaldev/image/fetch/s--Gr21GeqB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw. githubusercontent.com/adnanrahic/cdn/master/getting-started-with-aws-lambda-and-nodejs/Selection_066.png)

随意在浏览器窗口中打开 API 端点并检查输出。你看到了什么?不,真的,你看到了什么?应返回 1 到 6 之间的随机数。这有多厉害!?在不到 5 分钟的时间里,您创建了一个Lambda 函数,将其连接到API Gateway并创建了一个可以随时使用的端点。

使用 ZIP 上传代码

如果你需要使用 npm 中的一些模块怎么办?您不能内联添加它们。必须有一种方法来运行具有依赖关系的代码。嗯,有,但要正确处理有点棘手。尽管如此,让我们继续吧!

首先,创建一个目录并初始化npm。

$ mkdir roll-a-dice \
    && cd roll-a-dice \
    && npm init -y

进入全屏模式 退出全屏模式

完成此操作后,继续安装moment,一个简单的日期时间库。

$ npm install moment --save

进入全屏模式 退出全屏模式

这将创建一个包含所需依赖项的node_modules文件夹。要包含它们,您需要压缩所有文件并将 .ZIP 文件上传到 Lambda。

重要提示:仅压缩项目目录内的文件和文件夹。做 NOT 压缩整个文件夹。如果您这样做,它将破坏配置并且 Lambda 函数将失败!

在继续压缩文件之前,请使用您刚刚安装的新 npm 模块添加一些代码,以确保 Lambda 函数使用它。

在项目目录中创建一个新文件并将其命名为index.js。将 AWS 中的现有 lambda 函数粘贴到该文件中并稍作编辑。

const moment = require('moment');
exports.handler = async (event) => {
  const min = 1;
  const max = 6;

  const randomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
  const now = moment().format();

  const message = 'Your dice throw resulted in ' + 
  randomNumber + ' and was issued at ' + now;

  return message;
};

进入全屏模式 退出全屏模式

保存所有文件并继续压缩它们。请记住,只有 roll-a-dice 目录中的文件和文件夹。

您现在有一个 .ZIP 文件。继续并跳回 AWS 控制台。

[上传ZIP](https://res.cloudinary.com/practicaldev/image/fetch/s--ZxYPwk07--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/ adnanrahic/cdn/raw/1a312ff8d11c43b89606f9790fda3041995a6d02/getting-started-with-aws-lambda-and-nodejs/zip-upload.png)

Code entry type 更改为 Upload a .ZIP file 并上传您刚刚压缩的文件。伟大的!现在,滚动回到页面顶部并再次按下橙色大按钮以保存并测试该功能。

[测试功能](https://res.cloudinary.com/practicaldev/image/fetch/s--lFMqym7P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/ adnanrahic/cdn/raw/master/getting-started-with-aws-lambda-and-nodejs/test-zip-function.png)

好的!它工作,它显示当前的日期和时间。您正确压缩了函数和 npm 模块。以防万一,跳回浏览器窗口并再次尝试端点。它现在应该显示更新的消息。

监控

深入了解您的功能怎么样?很简单,有一个监控选项卡!您可以在此处查看有关函数行为的指标。

[监控](https://res.cloudinary.com/practicaldev/image/fetch/s--K5FQxrf1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/adnanrahic /cdn/raw/master/getting-started-with-aws-lambda-and-nodejs/monitoring.png)

但是,当您拥有多个功能时,可能会有点难以获得正确的洞察力。在这种情况下,您可能需要查看AWS Lambda 监控报告工具,例如Dashbird、IOPipe、Datadog 或类似工具。

这是 Dashbird 如何为您的 AWS Lambda 函数](https://dashbird.io/features/aws-lambda-serverless-monitoring/)提供适当的[仪表板的示例。

[监控](https://res.cloudinary.com/practicaldev/image/fetch/s--PgfOTG2E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/adnanrahic /cdn/raw/master/getting-started-with-aws-lambda-and-nodejs/dashbird-2.gif)

现在怎么办?开始编码!

Lambda 是一个令人难以置信的工具,它与 AWS 上的大量其他服务配合得很好。可以调用 Lambda 函数来响应文件上传等事件,它们也可以用于聊天机器人、REST API 等等。

我们在上面编写的这个简单的 API 示例只是一个开始。但你可以看到重点。只需担心代码而不关心底层基础架构,就可以避免如此多的开销。我敦促您继续使用这项技术,因为它只会在未来变得更加流行。刚开始编码。不管是什么,都无所谓。刚开始写代码,因为你自己会学到最多。

我们Dashbird希望通过在公园里散步跟踪错误来创建一个更受欢迎的环境来创建无服务器应用程序。如果您有任何问题,请随时在下面的评论中告诉我。

如果您错过了上述任何步骤,这里是存储库以及所有代码。

希望你们喜欢阅读这篇文章,就像我喜欢写它一样。直到下一次,保持好奇,玩得开心。_

如果您想在无服务器革命中发挥关键作用,请随时加入我的无服务器通讯!

本月赞助商是Zeet。

Disclaimer:Zeet将赞助下个月的这篇博文。前几天我试了一下。它就像无服务器,但用于运行整个后端。您可以自动托管和扩展应用程序。挺整洁的。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐