AWS Lambda 和 Node.js 入门
不久前,一个词引起了我的注意:Lambda。这个词触动了我的心弦,让我回想起小时候玩《半条命》的美好时光。当时我几乎不知道 AWS Lambda 是什么,也不知道它有多么棒。如果你感兴趣,那就继续往下读吧。我只会占用你几分钟的时间,你肯定不会介意的。
功能即服务
让我们直接进入正题。AWS Lambda 所属的架构被称为无服务器计算或函数即服务。由于无需服务器,它具有开创性的意义。这听起来很奇怪。代码不会是在土豆上运行的吧!?好吧,这只是一种说法。实际上,作为开发人员,您无需担心代码运行的基础设施。您只需将代码部署到云中,它就会自行创建所有所需资源。但具体怎么做呢?容器!
不,不是那些。是这些!
Docker 是全球领先的软件容器平台。开发人员使用 Docker 来消除与同事协作编写代码时“在我的机器上工作”的问题。运营商使用 Docker 在隔离的容器中并行运行和管理应用程序,以获得更高的计算密度。企业使用 Docker 构建敏捷的软件交付管道,以便更快、更安全、更自信地为 Linux、Windows Server 和 Linux-on-mainframe 应用程序交付新功能。
每次创建AWS Lambda 函数时,都会启动一个容器来为其提供服务。但它实际上并非 Docker 容器,而是由 AWS 构建的专有容器。我只是为了让您更容易理解而举了个例子。
代码被部署到容器中并执行。因此,如果容器已经存在,AWS 会跳过容器的初始创建过程,从而加快每个后续请求的速度。
创建您的第一个函数
在查看代码之前,您需要在 AWS 控制台中创建一个新函数。这意味着您需要一个 AWS 账户。如果您没有账户,请立即创建一个,他们提供超值的免费套餐,包含各种服务,最长可使用 12 个月。
接下来,打开浏览器并导航到你的账户。在那里你需要找到 Lambda。点击服务下拉菜单,然后选择 Lambda。
您将进入 Lambda 主页,其中有一个橙色的大按钮,提示您创建一个新函数。好了,别再等了,赶紧点击它吧。
这将带您进入主函数创建向导。由于本示例将介绍一个模拟掷骰子的基本函数,因此我们先不用管蓝图,直接从头开始编写一个。
太棒了!现在你只需要为函数添加名称和角色lambda_basic_execution
,然后就可以开始编写代码了。关于角色,你可以选择一个现有的角色,例如。对于这个简单的例子来说,这已经足够了。别忘了添加 Node.js 8.10 作为运行时。最后,继续创建函数。
太棒了!现在你终于看到了一些代码。好多了。让我们开始吧。有几个选项需要考虑。代码输入类型选项设置了如何向函数添加代码。它可以是内联的、上传 .zip 文件或从 S3 上传。我们将使用第一个选项,即内联编辑。对于小型函数,内联编写代码完全没问题。但是当你有更多代码时,这会变得非常繁琐。这就是为什么有一个 .zip 上传选项,我们稍后也会讨论它。
将运行时设置为Node.js 8.10
,这是本文撰写时 Lambda 支持的 Node.js 最新版本。处理程序也可以保持不变。其中,index
代表文件名称, 代表handler
函数名称。
在 AWS Lambda(6.10)上的早期版本的 Node.js 中,有 3 个主要参数:
- 该
event
参数包含当前事件信息。这意味着触发该函数的事件将向该函数发送信息以供使用。例如,HTTP 请求发送到端点的数据,例如它是否包含请求参数或主体。 - 其中
context
包含函数本身的所有信息,包括运行时间、内存占用等。这些信息被视为运行时信息。 - 这
callback
很容易理解。当你想告诉函数结束执行时,可以调用回调函数。它接受两个参数:第一个是错误信息,第二个是希望作为 Lambda 函数的响应返回的数据。
Node.js 8.10
由于添加了支持,情况发生了变化async/await
。handler
现在可以接受 Promise 值了。这就是为什么我们现在可以将一个值赋给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
现在你可以开始测试函数了。点击测试按钮后,你会看到类似这样的内容。
虚线边框部分显示函数输出,更准确地说是函数返回的返回值。
太有意思了!现在你有一个掷骰子的功能,但目前还无法在 AWS 之外触发它。
连接 API
关键部分来了。你认为 lambda 函数是如何知道该如何开始执行的?巫术?魔法?不,很遗憾,并非如此。每个函数调用都由一个事件触发。它可以是图片上传到 S3 时触发的事件,也可以是 Amazon Alexa 技能,或者只是一个普通的 HTTP 请求。
让我们创建一个 HTTP 事件并告诉它调用我们的函数。为此,您首先需要跳转到AWS 控制台中的API 网关。在服务下拉菜单中选择“API 网关”,即可进入此处。
系统会立即提示您创建 API。忽略所有建议,只需选择“新建 API”并输入 API 名称即可。我坚持使用FunkyApi,因为它听起来很合适。继续,然后点击“创建”。
现在到了最有趣的部分。终于可以将 API 连接到函数了。首先点击“操作”下拉菜单,然后选择“创建方法”。你会看到另一个较小的下拉菜单出现。点击它,然后选择“获取”。将集成类型设置为 Lambda 函数,选择创建函数的区域,并输入函数名称。
点击保存并欢喜吧!
API 已设置完毕并准备就绪。现在只需部署它。再次点击“操作”下拉菜单,然后点击“部署 API”。选择一个新的部署阶段,并将阶段名称填写为dev,即可部署 API。
终于!API 端点已准备就绪。现在,您可以在dev 阶段编辑器中访问调用 URL。
您可以在浏览器窗口中打开 API 端点并检查输出。您看到了什么?不,真的看到了什么?应该会返回一个 1 到 6 之间的随机数。这太棒了!?不到 5 分钟,您就创建了一个 Lambda 函数,将其连接到 API 网关,并创建了一个可供随时使用的端点。
使用 ZIP 上传代码
如果你需要使用 npm 中的一些模块怎么办?你无法以内联方式添加它们。必须有一种运行依赖项代码的方法。嗯,有办法,但操作起来有点棘手。不过,让我们开始吧!
首先,创建一个目录并初始化npm。
$ mkdir roll-a-dice \
&& cd roll-a-dice \
&& npm init -y
完成此操作后,继续安装moment,一个简单的日期时间库。
$ npm install moment --save
这将创建一个node_modules
包含所需依赖项的文件夹。要包含这些依赖项,您需要压缩所有文件,并将.ZIP文件上传到 Lambda。
重要提示:请仅压缩项目目录内的文件和文件夹。请勿压缩整个文件夹。否则,配置将会被破坏,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 文件”,然后上传您刚刚压缩的文件。太棒了!现在,滚动回到页面顶部,再次按下橙色大按钮,保存并测试该功能。
太棒了!它运行正常,并且显示了当前日期和时间。你正确地压缩了函数和 npm 模块。为了以防万一,请跳回到浏览器窗口,再次尝试访问端点。现在应该会显示更新后的消息。
现在怎么办?开始编码吧!
Lambda 是一款非常棒的工具,它与 AWS 上众多其他服务完美兼容。Lambda 函数可以响应文件上传等事件,也可用于聊天机器人、REST API 等等。
我们上面编写的这个简单的 API 示例只是一个开始。但你也能理解这一点。只需关注代码,无需关心底层基础设施,就能避免很多开销。我强烈建议你继续尝试这项技术,因为它在未来只会越来越流行。现在就开始写代码吧!无论它是什么,都没关系。现在就开始写代码吧,因为亲自动手才能学到最多的东西。
Tracetest希望创建一种更简便的方法来测试和排除无服务器应用的故障。如有任何疑问,请在下方评论区留言。
如果您错过了上述任何步骤,这里是包含所有代码的存储库。
希望各位读者喜欢这篇文章,就像我写这篇文章一样。下次再见,保持好奇心,享受乐趣。
免责声明:Tracetest赞助了这篇博文。使用可观察性可以将测试创建和故障排除的时间和精力减少 80%。
鏂囩珷鏉ユ簮锛�https://dev.to/adnanrahic/getting-started-with-aws-lambda-and-nodejs-1kcf