如何使用NodeJS和AWS Lambda实现无服务器?

2021年11月28日07:42:41 发表评论 1,210 次浏览
特色图片
NodeJS实现无服务器示例

无服务器架构是高维护、浪费资源的服务器的替代方案。使用无服务器部署,你只需为所使用的内容付费。它使你不必处理多个服务器设置及其配置。

因此,今天的开发人员涌向无服务器应用程序也就不足为奇了。借助 AWS Lambda 和无服务器框架,你可以快速部署可扩展的应用程序。

NodeJS和AWS Lambda如何实现无服务器?在本教程中,我们将着眼于使用 Node.js、AWS Lambda 和无服务器框架部署一个简单的无服务器 API


关于这些技术的一些信息

AWS Lambda 是一种基于云的无服务器服务。Lambda 函数是由事件触发并在执行结束时过期的无状态函数。

鉴于 AWS Lambda 的复杂性,我们使用无服务器框架来简化部署过程。事实上,借助 Serverless,你只需几步即可部署 Node 应用程序。


先决条件

要继续本教程,你需要设置以下内容。

  • 一个AWS 账户 。如果你只是尝试使用 AWS,则无需支付一分钱即可加入免费套餐。
  • 在你的 AWS 控制台中创建一个 IAM 用户。按照以下步骤在这个岗位 创建IAM用户。在进入下一步之前,请记住保存访问密钥 ID 和秘密访问密钥。

安装和设置无服务器

NodeJS和AWS Lambda实现无服务器教程:你可以使用 npm 轻松安装 Serverless。运行以下命令全局安装。

npm install -g serverless

接下来,使用以下命令使用 IAM 密钥配置已安装的无服务器。分别使用创建 IAM 用户时保存的 ID 和密钥作为密钥和秘密。

sls config credentials --provider aws --key xxx --secret xxx

创建Node应用程序

NodeJS和AWS Lambda如何实现无服务器?我为本教程创建了一个简单的 Hello World 应用程序,但你可以按照相同的逻辑部署更复杂的应用程序。

const express = require("express");
const sls = require("serverless-http");
const app = express();

app.get("/", (req, res) => {
    res.send("Hello World");
});

app.get("/:userName", (req, res) => {
    res.send(`Welcome, ${req.params.userName}`);
})

module.exports.handler = sls(app);

NodeJS实现无服务器示例解析 - 正如你在上面看到的,我们使用serverless-httpnpm 包来设置无服务器应用程序,因此请确保你已安装该包。你可以使用以下命令安装库:

npm install --save express serverless-http

创建 serverless.yml 文件

我们使用名为 serverless.yml 的文件来传递 Serverless 配置。对于我们的简单应用程序,它包含以下属性。

service: node-serverless-app

provider: 
  name: aws 
  runtime: nodejs10.x
  stage: dev 
  region: eu-central-1 

functions: 
  app: 
    handler: app.handler 
    events: 
      - http: 
          path: / 
          method: ANY 
      - http: 
            path: /{proxy+} 
            method: ANY 

在这里,该functions属性列出了我们应用程序中的所有功能。我们传递一个名为的单个函数app,并将导出的对app.js文件中处理程序的引用用作函数处理程序。

然后,我们需要添加将触发给定函数的事件。我们将 HTTP 请求作为触发事件传递。我已经在上面的配置中设置了每次发送 HTTP 请求时调用 app 函数。

使用/{proxy+}转发每个请求允许 Express 应用程序自己处理每个请求,而不是在 API 网关级别处理请求。


部署应用程序

现在我们已经将我们的配置传递给serverless.yml部署应用程序只是一个命令问题。

sls deploy

它的输出看起来像这样。

SLS 部署输出示例
SLS 部署输出示例

恭喜!你已成功将第一个无服务器应用程序部署到 AWS。

你可以通过端点下提供的链接访问已部署的应用程序。如果你访问根,你将看到消息“Hello World”。


路径特定路由

NodeJS和AWS Lambda实现无服务器教程:还记得我们是如何将所有路由代理到 Express 应用程序的吗?虽然这种实现有很多好处,比如限制冷启动,但我们错过了一些无服务器架构特性的好处。

我们可以引入由不同 Lambda 函数处理的路径特定路由,而不是使用一个 Lambda 函数路由所有路径。它使我们能够使用特定于路径的指标更好地了解应用程序。

NodeJS实现无服务器示例 - 在这种情况下,serverless.yml像这样更新,以便不同的函数处理每个路径。

functions: 
  helloWorld:
    handler: app.handler
    events:
      -http:
        path: /
        method: get
  welcome:
    handler: app.handler
    events: 
      -http:
        path: /{userName}
        method: get

添加环境变量

NodeJS和AWS Lambda如何实现无服务器?如果要将环境变量传递给应用程序,可以使用该environment属性。

例如,如果你想传递一个 NODE_ENV 变量,你可以这样设置。

provider: 
  name: aws 
  runtime: nodejs10.x
  stage: dev 
  region: eu-central-1 
  environment:
   NODE_ENV: production

如果要从 .env 文件传递​​环境变量,则需要使用serverless-dotenv-plugin.

首先,将插件安装为开发依赖项。

npm install serverless-dotenv-plugin --save-dev

然后,你可以在根目录中创建一个 .env 文件并向其中添加环境变量。

STAGE=dev
SECRET=**********

在应用程序插件下列出 dotenv-plugin 后,你可以导入存储的环境变量并在 serverless.yml 文件中使用它们。

service: node-serverless-app

provider: 
  name: aws 
  runtime: nodejs10.x
  stage: ${env:STAGE}
  region: eu-central-1 
  environment:
   SECRET: ${env:SECRET}

functions: 
  helloWorld:
    handler: app.handler
    events:
      - http:
          path: /
          method: get
  welcome:
    handler: app.handler
    events: 
      - http:
          path: /{userName}
          method: get

plugins:
  - serverless-dotenv-plugin

离线使用无服务器

NodeJS和AWS Lambda实现无服务器教程:在此之前,我们甚至必须部署我们的应用程序来执行最简单的路由测试。你只需在你的应用程序中编写两到三个新路由即可意识到这是多么烦人。

如果有一种方法可以在将应用程序部署到 AWS 之前对其进行测试,该怎么办?

通过使用无服务器离线插件,你可以做到这一点。你只需要安装一个新的 npm 包并在 serverless.yml 文件中添加一行新代码即可完成这项工作。

NodeJS实现无服务器示例 - 首先,安装软件包。

npm install serverless-offline --save-dev

然后,更新 serverless.yml。

plugins:
  - serverless-offline
  - serverless-dotenv-plugin

现在,你只需运行以下命令即可在本地启动应用程序。

sls offline start

它将向你显示应用程序中所有路由的列表。此外,最重要的是,它会启动在端口 3000 上本地运行的应用程序。

你现在可以通过在浏览器上使用 URL http://localhost:3000 访问它们来测试应用程序路由。


概括

NodeJS和AWS Lambda如何实现无服务器?与服务器相比,无服务器架构仍处于早期阶段。你可以指望它在未来几年变得更加强大和突出。我希望你对无服务器和 AWS Lambda 的第一次体验能吸引你在下次寻找部署选项时给这项技术一个机会。

谢谢阅读!

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: