关键要点
lambda-local
之类的工具,这些工具可以在本地模拟 AWS Lambda 环境。本文最初发表于 mongoDB。感谢您支持使 SitePoint 成为可能的合作伙伴。
近年来,开发者环境发生了巨大变化。过去,我们开发者通常会在自己的机器上运行所有工具(数据库、Web 服务器、开发 IDE……),但 GitHub、MongoDB Atlas 和 AWS Lambda 等云服务正在彻底改变这一局面。它们使开发者越来越容易在任何地方、任何设备上编写和运行代码,而无需(或只需很少)依赖项。
几年前,如果您崩溃了机器、丢失了机器或只是断电了,您可能需要几天时间才能让新机器重新运行起来,并正确设置和配置所有内容,使其恢复到之前的状态。
借助云端的开发者工具,您现在可以从一台笔记本电脑切换到另一台笔记本电脑,而不会造成太大的中断。但是,这并不意味着一切都很顺利。在云端编写和调试代码仍然具有挑战性;作为开发者,我们知道拥有一个本地开发环境,尽管更轻量级,但仍然非常有价值。
这正是我在这篇博文中将尝试向您展示的内容:如何轻松地将 AWS Lambda Node.js 函数与托管在 MongoDB Atlas(MongoDB 的 DBaaS(数据库即服务))中的 MongoDB 数据库集成。更具体地说,我们将编写一个简单的 Lambda 函数,该函数在一个存储在 MongoDB Atlas 数据库中的集合中创建一个单个文档。我将逐步指导您完成本教程,您应该在一个小时内完成它。
让我们从必要的需求开始,让您开始运行:
既然您了解了需求,让我们讨论一下我们将采取的具体步骤来编写、测试和部署我们的 Lambda 函数:
我没有深入探讨在我们的 MongoDB Atlas 集群和 AWS Lambda 之间设置 VPC 对等互连的细节,原因有两个:1) 我们已经有关于设置 VPC 对等互连的详细文档页面和一篇关于 Atlas 中 VPC 对等互连的博文,我强烈推荐;2) M0 集群(我用来构建该演示的集群)不支持 VPC 对等互连。
如果您没有设置 VPC 对等互连,将会发生以下情况:
如果您只是尝试获取此演示代码以进行编写,这两个警告可能没问题,但如果您计划部署一个可用于生产环境的 Lambda-Atlas 集成,则设置 VPC 对等互连是我们强烈推荐的安全最佳实践。M0 是我们当前的免费产品;请查看我们的 MongoDB Atlas 定价页面以了解所有可用实例大小的完整范围。
提醒一下,对于开发环境和低流量网站,M0、M10 和 M20 实例大小应该没问题。但是,对于支持高流量应用程序或大型数据集的生产环境,建议使用 M30 或更大实例大小。
确保您的应用程序符合最小权限访问策略对于保护您的数据免受恶意威胁至关重要。这就是为什么我们将设置一个特定的数据库用户,该用户将只对我们的 travel 数据库具有读/写访问权限。让我们看看如何在 MongoDB Atlas 中实现这一点:
在“集群”页面上,选择“安全”选项卡,然后按“添加新用户”按钮
在“用户权限”部分,选择
然后,您可以选择分配更细粒度的访问控制权限:
在“选择角色”下拉列表中,选择 readWrite 并使用您将用于存储文档的数据库的名称填写“数据库”字段。我选择将其命名为 travel。
在“密码”部分,使用“自动生成安全密码”按钮(并记下生成的密码)或设置您喜欢的密码。然后按“添加用户”按钮以确认此用户创建。
让我们顺便获取集群连接字符串,因为我们将在 Lambda 代码中需要它来连接到我们的 MongoDB Atlas 数据库:
假设您已经创建了一个 MongoDB Atlas 集群,请按集群旁边的“连接”按钮:
复制“URI 连接字符串”值并将其安全地存储在文本文档中。我们稍后将在代码中需要它,以及您刚刚设置的密码。
此外,如果您没有使用 VPC 对等互连,请导航到“IP 白名单”选项卡并添加 0.0.0.0/0 CIDR 块或按“允许从任何地方访问”按钮。提醒一下,此设置强烈建议不要用于生产环境,并且可能会使您的 MongoDB Atlas 集群容易受到恶意攻击。
虽然 Lambda 函数支持多种语言,但我选择使用 Node.js,这要归功于 JavaScript 作为一种多功能编程语言的日益普及以及 MEAN 和 MERN 堆栈的巨大成功(MongoDB、Express.js、Angular/React、Node.js 的首字母缩写词 – 查看 Andrew Morgan 关于此主题的精彩开发者博客系列)。此外,说实话,我喜欢它是一种解释型轻量级语言,不需要繁重的开发工具和编译器。
现在该编写一些代码了,所以让我们继续使用 Node.js 作为我们 Lambda 函数的首选语言。
首先创建一个文件夹,例如 lambda-atlas-create-doc
<code>mkdir lambda-atlas-create-doc && cd lambda-atlas-create-doc</code>
接下来,从终端控制台运行以下命令,使用 package.json 文件初始化我们的项目
<code>npm init</code>
系统会提示您配置一些字段。我将它们留给您的创造力,但请注意,我选择将入口点设置为 app.js(而不是默认的 index.js),因此您可能也希望这样做。
我们需要使用 MongoDB Node.js 驱动程序,以便我们可以从 Lambda 函数(在 Atlas 上)连接到我们的 MongoDB 数据库,因此让我们继续运行以下命令从我们的项目根目录安装它:
<code>npm install mongodb --save</code>
我们还希望在本地编写和测试我们的 Lambda 函数以加快开发和简化调试,因为每次在 Amazon Web Services 中实例化 lambda 函数并不是特别快(并且调试实际上不存在,除非您是 console.log() 函数的粉丝)。我选择使用 lambda-local 包,因为它提供对环境变量的支持(我们稍后将使用):
<code>(sudo) npm install lambda-local -g</code>
创建一个 app.js 文件。这将是包含我们的 lambda 函数的文件:
<code>touch app.js</code>
现在您已经导入了所有必需的依赖项并创建了 Lambda 代码文件,请在您选择的代码编辑器(Atom、Sublime Text、Visual Studio Code……)中打开 app.js 文件,并使用以下代码段对其进行初始化:
<code>'use strict' var MongoClient = require('mongodb').MongoClient; let atlas_connection_uri; let cachedDb = null; exports.handler = (event, context, callback) => { var uri = process.env['MONGODB_ATLAS_CLUSTER_URI']; if (atlas_connection_uri != null) { processEvent(event, context, callback); } else { atlas_connection_uri = uri; console.log('the Atlas connection string is ' + atlas_connection_uri); processEvent(event, context, callback); } }; function processEvent(event, context, callback) { console.log('Calling MongoDB Atlas from AWS Lambda with event: ' + JSON.stringify(event)); }</code>
让我们稍作停顿并注释上面的代码,因为您可能已经注意到一些奇怪的结构:
现在我们完成了代码注释,让我们创建一个 event.json 文件(在项目根目录中)并使用以下数据填充它:
<code>mkdir lambda-atlas-create-doc && cd lambda-atlas-create-doc</code>
(如果您想知道,该 JSON 文件就是我们将发送到 MongoDB Atlas 以创建我们的 BSON 文档的内容)
接下来,确保您已正确设置,方法是在终端控制台中运行以下命令:
<code>npm init</code>
如果您想使用您自己的集群 URI 连接字符串进行测试(我相信您会的),请不要忘记转义 E 参数中的双引号、逗号和&字符,否则 lambda-local 将抛出错误(您还应该将 $PASSWORD 和 $DATABASE 关键字替换为您自己的值)。
在您在本地运行它之后,您应该会看到以下控制台输出:
如果您遇到错误,请检查您的连接字符串和双引号/逗号/&转义(如上所述)。
现在,让我们通过自定义 processEvent() 函数并添加 createDoc() 函数来处理函数代码的核心内容:
<code>mkdir lambda-atlas-create-doc && cd lambda-atlas-create-doc</code>
请注意,连接到 MongoDB Atlas 数据库和插入文档是多么容易,以及我添加的小段代码来将 JSON 日期(格式化为符合 ISO 标准的字符串)转换为 MongoDB 可以作为 BSON 日期存储的真实 JavaScript 日期。
您可能还注意到了我的性能优化注释和对 context.callbackWaitsForEmptyEventLoop = false 的调用。如果您有兴趣了解它们的意思(我认为您应该了解!),请参阅我后续的博文,了解如何使用 MongoDB Atlas 优化 Lambda 性能。
您现在已准备好完全在本地测试您的 Lambda 函数。使用与之前相同的 lambda-local 命令,希望您会收到一条不错的“Kudos”成功消息:
如果在您的本地机器上一切顺利,让我们将我们的本地 Node.js 项目发布为一个新的 Lambda 函数!
我们将要采取的第一步是压缩我们的 Node.js 项目,因为我们不会在 Lambda 代码编辑器中编写 Lambda 代码函数。相反,我们将选择 zip 上传方法来将我们的代码推送到 AWS Lambda。
我在终端控制台中使用了 zip 命令行工具,但任何方法都可以(只要您将文件压缩到顶级文件夹中,而不是顶级文件夹本身!):
<code>npm init</code>
接下来,登录 AWS 控制台,导航到 IAM 角色页面并创建一个角色(例如 LambdaBasicExecRole),该角色具有 AWSLambdaBasicExecutionRole 权限策略:
现在让我们导航到 AWS Lambda 页面。单击“立即开始”(如果您从未创建过 Lambda 函数)或“创建 Lambda 函数”按钮。我们不会使用任何蓝图,也不会配置任何触发器,因此请直接在左侧导航栏中选择“配置函数”:
在“配置函数”页面中,输入函数的名称(例如 MongoDB_Atlas_CreateDoc)。运行时自动设置为 Node.js 4.3,这对我们来说非常完美,因为这是我们将使用的语言。在“代码输入类型”列表中,选择“上传 .ZIP 文件”,如下面的屏幕截图所示:
单击“上传”按钮并选择您之前创建的压缩 Node.js 项目文件。
在“Lambda 函数处理程序和角色”部分,将“处理程序”字段值修改为 app.handler(为什么?这里有一个提示:我为我的 Lambda 函数代码使用了 app.js 文件,而不是 index.js 文件……)并选择我们刚刚创建的现有 LambdaBasicExecRole 角色:
在“高级设置”部分,您可能希望将“超时”值增加到 5 或 10 秒,但这始终是您以后可以调整的内容。将 VPC 和 KMS 密钥字段保留为其默认值(除非您要使用 VPC 和/或 KMS 密钥),然后按“下一步”。
最后,查看您的 Lambda 函数,然后按底部的“创建函数”。恭喜,您的 Lambda 函数已上线,您应该会看到类似于以下屏幕截图的页面:
但是您还记得我们使用环境变量吗?现在是配置它们并使用 AWS 密钥管理服务来保护它们的时候了!
向下滚动到 Lambda 函数的“代码”选项卡中,并创建一个具有以下属性的环境变量:
名称
值
MONGODB_ATLAS_CLUSTER_URI YOUR_ATLAS_CLUSTER_URI_VALUE 此时,您可以按页面顶部的“保存并测试”按钮,但为了提高安全性(建议),我们将加密该连接字符串。
选中“启用加密助手”复选框,如果您已经创建了加密密钥,请选择它(否则,您可能需要创建一个 – 这很容易):
接下来,为 MONGODB_ATLAS_CLUSTER_URI 变量选择“加密”按钮:
回到内联代码编辑器中,在顶部添加以下行:
<code>mkdir lambda-atlas-create-doc && cd lambda-atlas-create-doc</code>
并将“exports.handler”方法中“else”语句的内容替换为以下代码:
<code>npm init</code>
(希望我们最初编写的复杂代码现在有意义了!)
如果您想检查我使用的整个函数代码,请查看以下 Gist。对于 Git 粉丝,完整的 Node.js 项目源代码也可在 GitHub 上获得。
现在按“保存并测试”按钮,并在“输入测试事件”文本编辑器中粘贴我们的 event.json 文件的内容:
滚动并按下“保存并测试”按钮。
如果您正确配置了一切,您应该会在 Lambda 日志输出中收到以下成功消息:
太棒了!您可以在继续阅读之前享受几分钟的成功。
我希望本 AWS Lambda-MongoDB Atlas 集成教程能为您开始第一个 Lambda 项目提供正确的步骤。您现在应该能够在本地编写和测试 Lambda 函数,并将敏感数据(例如您的 MongoDB Atlas 连接字符串)安全地存储在 AWS KMS 中。
那么接下来您可以做什么呢?
当然,请随时在下面的评论中提出任何问题或留下您的反馈。编码愉快!
喜欢这篇文章吗?重播我们的网络研讨会,其中我们对使用 AWS Lambda 的无服务器架构进行了交互式教程。
AWS Lambda 是无服务器开发中非常有益的工具。它允许开发者运行代码而无需管理服务器。这意味着您可以专注于编写代码,而让 AWS Lambda 处理基础设施。它会根据传入流量自动扩展您的应用程序,并且您只需为消耗的计算时间付费。这使其成为各种规模企业具有成本效益的解决方案。此外,AWS Lambda 支持多种编程语言,包括 Node.js,使其成为开发者的多功能选择。
MongoDB Atlas 与 AWS Lambda 无缝集成。它提供了一种完全托管的数据库服务,可以自动化耗时的管理任务,例如硬件配置、数据库设置、修补和备份。使用 MongoDB Atlas,您可以轻松地根据数据库事件(例如插入、更新或删除)触发 AWS Lambda 函数。这使您可以创建功能强大、实时且无服务器的应用程序。
使用 Node.js、AWS Lambda 和 MongoDB Atlas 设置无服务器应用程序涉及多个步骤。首先,您需要设置您的 AWS Lambda 函数。这包括使用 Node.js 编写代码并将其上传到 AWS Lambda。接下来,您需要配置您的 MongoDB Atlas 集群。这包括创建一个新集群、配置您的 IP 白名单和创建一个数据库用户。最后,您需要将您的 AWS Lambda 函数连接到您的 MongoDB Atlas 集群。这包括配置您的 Lambda 函数以使用 MongoDB Atlas 连接字符串。
可以使用各种工具和技术对无服务器应用程序的问题进行故障排除。AWS Lambda 提供函数执行的详细日志,这可以帮助您识别任何错误或问题。MongoDB Atlas 还提供全面的监控和警报功能,使您可以跟踪数据库的性能并接收任何潜在问题的警报。此外,使用良好的编码实践并彻底测试您的应用程序可以帮助防止问题出现。
安全性是任何应用程序的关键方面,无服务器应用程序也不例外。AWS Lambda 提供多种安全功能,包括用于访问控制的 AWS Identity and Access Management (IAM)、传输中和静态加密以及用于网络隔离的 VPC 支持。MongoDB Atlas 还提供强大的安全功能,包括 IP 白名单、数据库审核以及静态和传输中加密。务必正确配置这些安全功能以保护您的应用程序和数据。
优化无服务器应用程序的性能涉及多种策略。这包括正确配置 AWS Lambda 函数以实现最佳性能、使用高效代码以及优化 MongoDB Atlas 数据库。AWS Lambda 允许您为函数分配内存,这也按比例分配 CPU 能力、网络带宽和磁盘 I/O。MongoDB Atlas 提供性能优化功能,例如自动索引和性能顾问建议。
是的,AWS Lambda 支持多种编程语言,包括 Node.js、Python、Java、Go 和 .NET。MongoDB Atlas 可以与任何具有 MongoDB 驱动程序的编程语言一起使用。这使其成为无服务器开发的多功能解决方案。
无服务器架构可以显着降低应用程序的成本。使用 AWS Lambda,您只需为消耗的计算时间付费,并且在代码未运行时不收费。MongoDB Atlas 提供各种定价选项,包括免费层,使您可以选择最适合您需求的选项。
将现有应用程序迁移到无服务器架构涉及多个步骤。首先,您需要重构应用程序以使其与 AWS Lambda 和 MongoDB Atlas 兼容。这可能包括使用受支持的编程语言重写代码并修改数据库模式。接下来,您需要设置 AWS Lambda 函数和 MongoDB Atlas 集群。最后,您需要彻底测试您的应用程序,以确保它在新架构中正常工作。
虽然 AWS Lambda 和 MongoDB Atlas 为无服务器开发提供了许多好处,但需要注意一些局限性。AWS Lambda 对可使用的计算和存储资源量有限制,并且函数具有最大执行时间。MongoDB Atlas 还限制了数据库的大小和连接数。但是,这些限制通常足够高,可以容纳大多数应用程序。
以上是使用Node.js,AWS Lambda和Mongodb Atlas的无服务器开发的详细内容。更多信息请关注PHP中文网其他相关文章!