如何在 AWS 上构建无服务器联系表单
2023-06-08 08:00:00
·
飞浪
·
KyleG
联系表单对于所有网站(无论大小)都至关重要。有许多服务可用于将联系表单嵌入到您自己的网站中,但本教程不介绍如何利用这些服务。相反,它通过专注于创建我们自己的联系表单架构的问题来学习一些Amazon
联系表单对于所有网站(无论大小)都至关重要。有许多服务可用于将联系表单嵌入到您自己的网站中,但本教程不介绍如何利用这些服务。相反,它通过专注于创建我们自己的联系表单架构的问题来学习一些 Amazon Web Services。在本指南结束时,我们将创建一个无服务器联系表单,并了解有关以下服务的更多信息:
我们将创建一个API 网关(APIGW) POST 端点,它将接受以下 JSON 请求正文:{“email”: <contact-email>,“subject”: <contact-subject>,“message”: <contact-message>}
此端点后面将有一个Lambda函数,它将请求正文转换为电子邮件。该电子邮件请求将发送到简单电子邮件服务(SES) 进行传递。有了这些部分,我们就可以创建一个发送消息的联系表单。
配置简单电子邮件服务以向我们发送电子邮件
在深入研究任何代码之前,我们需要配置简单电子邮件服务 (SES)。我们的 Lambda 函数将处理来自我们网站的消息并通过 SES 发送电子邮件。SES 是一款出色的电子邮件发送和接收产品。它提供高传递率、成本效益和非常可靠的电子邮件处理。在这篇文章中,我们将利用它来接收消息并将其发送到我们自己的白名单电子邮件地址。为了实现我们正在创建的项目,我们可以在 SES 沙盒环境中完成所有操作。沙盒环境具有以下限制:
- 只能向SES邮箱模拟器或者您已经验证过的邮箱地址或域发送电子邮件。
- 每天限制发送 200 封电子邮件。
如果您打算每天发送超过 200 封电子邮件,则需要请求增加发送限制。一旦获得批准,该请求将使您脱离沙盒。但是,对于这个项目,您在沙盒环境中会没问题。要配置 SES 向您自己发送电子邮件,我们需要完成以下步骤:
- 导航到 AWS 控制台中的简单电子邮件服务。
- 点击电子邮件地址
- 点击验证新电子邮件地址
- 输入您想要用于联系请求的电子邮件地址。
- 点击“验证此电子邮件地址”
- 检查您的电子邮件,查找主题为“Amazon Web Services – 电子邮件地址验证请求”的验证电子邮件
- 单击电子邮件中的链接来确认您的电子邮件地址。
设置初始 Lambda 函数以响应 API 网关触发器
您已完成 SES 设置了吗?您的电子邮件地址是经过验证的电子邮件地址,SES 可以向其发送电子邮件?那么您已经取得了巨大的进步。自 2014 年 11 月 Lambda 函数首次亮相以来,Amazon Web Services 已简化了它们的创建过程。过去,为不同的 AWS 事件配置 Lambda 既繁琐又容易出错。如今,初始设置更加简化且用户友好。这对我们来说非常好,但请注意,我们稍后必须进行一些进一步的调整。但首先,让我们从 API 网关端点设置并触发初始 Lambda。无服务器堆栈的主干是事件。事件启动计算资源的分配以完成某些操作。AWS中的触发器是将分配容器来执行 Lambda 函数中的代码的事件。在 AWS 中,Lambda 目前可以响应 17 种不同的事件。今天,我们通过 HTTP 端点利用 API 网关事件。将 HTTP 端点视为触发 Lambda 函数的事件。请求启动容器并将输入事件包含到我们的 Lambda 函数中。使用此输入,我们可以在代码中处理消息。我们如何开始并配置初始端点和 Lambda 函数:
- 从 AWS 控制台导航到 Lambda。
- 单击创建函数
- 在蓝图输入中,输入“ api ”
- 单击NodeJs 6.10 中的蓝图“ microservice-http-endpoint ”。
- 对于“API 名称”,单击“输入值”,然后输入“联系人”
- 对于“部署阶段”,保留默认的“ prod ”选择。
- 对于“安全”,选择“打开”
- 单击下一步
- 输入“ ContactFormLambda ”作为您的函数名称。
- 输入有意义的描述,例如“ Process APIGW POST to /contact ”
- 选择“ Node.js 6.10 ”作为运行时。
- 现在,我们将在内联代码部分输入此样板代码:
- 在“Lambda 函数处理程序和角色”中,将处理程序保留为“ index.handler ”。角色应为“从模板创建新角色”。对于角色名称,输入“ ses-contact-form-lambda ”。对于策略模板,选择“简单微服务权限”注意:我们稍后将围绕这些领域进行更多配置。
- 单击下一步
- 单击创建函数
通过完成此向导,我们将获得以下 AWS 资源:
- 将代理 HTTP(S) 请求的 API 网关端点。
- 您的 API 网关端点触发的 Lambda 函数。
- 具有 Lambda 基本执行策略的IAM 角色“ ses-contact-form-lambda ”。
虽然还需要进一步完善,但我们现在拥有无服务器联系流所需的资源。
配置您的 IAM 角色以通过 SES 发送电子邮件
在开始编写 Lambda 函数之前,我们需要暂停一下并配置ses-contact-form-lambda IAM 角色。目前,该角色不允许使用SES 中的sendEmail API。为了使其非常轻量,我们将创建一个新的 IAM 策略,该策略仅包含我们需要授予访问权限的 SES 上的 API。
- 从 AWS 控制台导航到 IAM。
- 点击“策略”
- 单击“创建策略”
- 选择“创建您自己的政策”
- 输入“ contact-form-send-email-policy ”作为名称。
- 配置策略文档如下:
- 单击“创建策略”
现在有一个细粒度的策略允许访问ses:SendEmail API。将此策略附加到ses-contact-form-lambda角色:
- 从 AWS 控制台导航到 IAM。
- 单击角色
- 在搜索中输入“ ses-contact-form-lambda ”
- 单击“ ses-contact-form-lambda ”角色。
- 单击附加策略
- 选择“ contact-form-send-email-policy ”
- 单击附加策略
通过这些 IAM 更改,Lambda 函数现在可以访问 SES 的 SendEmail API。
通过 Lambda 函数通过 SES 发送电子邮件
现在,我们已经为无服务器联系流准备好了所有最终的基础设施。只需单击几下按钮,然后,我们就有了 API 网关、Lambda 函数和 IAM 角色。非常巧妙,对吧?此时,基础设施尚未准备好迎接黄金时段。我们稍后会做到这一点,但首先让我们添加通过 SES 从 Lambda 函数发送电子邮件的代码。我们的函数中没有外部依赖项。因此,我们可以内联编辑代码。如果我们要创建需要其他 NPM 模块的 Lambda 函数,则需要在 AWS 控制台之外进行开发。原因是当将 zip 文件上传到 Lambda 时,必须包含 NPM 包。但这不是本项目的重点。我们将内联编辑代码,因为我们没有外部依赖项。
- 从 AWS 控制台导航到 Lambda。
- 单击“ ContactFormLambda ”函数。
- 在内联编辑器中输入以下代码:
在 56 行中,我们拥有了接收 API 网关请求、解析电子邮件消息,然后利用 SES 将电子邮件发送给我们自己所需的代码。但等等——这段代码到底是干什么的?很高兴您问到这个问题。让我们分解有趣的部分并回顾一下发生了什么。从 Lambda 函数的顶部开始,声明了三个常量:这里有趣的部分是 aws -sdk不是外部依赖项。该包在 Lambda 函数容器内是全局的,始终可供使用。我们通过调用AWS.SES()来实例化 SES 客户端。我们还声明了sesConfirmedAddress。这必须是您在设置 SES 期间先前验证的电子邮件地址。函数getEmailMessage处理请求的正文。它解析来自 API 网关请求正文的请求并构建sendEmail请求。我们想将电子邮件发送给我们自己,因此ToAddresses是我们之前验证的 SES 电子邮件。源必须是我们验证过的电子邮件,因为这也是发送的电子邮件。其余部分我们从用户通过 API 网关发送的 JSON 请求中获得。电子邮件的正文在message属性中。电子邮件的主题在subject属性中。电子邮件的回复字段在用户传入的电子邮件属性中。这是我们函数的核心,即主要事件处理程序。要做的第一件事是提取请求正文,因为它包含电子邮件的电子邮件、消息和主题。接下来,通过将请求传递给getEmailMessage函数来获取sendEmailRequest。有了请求,我们调用sesClient.sendEmail(params) API。我们附加.promise()方法来告诉 SDK 我们想要一个承诺。提示:使用 JavaScript 中的 aws-sdk,您可以将 .promise() 附加到任何 SDK 调用以返回承诺。API网关端点设置为LAMBDA_PROXY。这意味着 Lambda 函数必须构建并返回 HTTP 响应。就我们的目的而言,成功时返回状态代码 200,错误时返回状态代码 500 就足够了。当sendEmailPromise解析成功时,返回 200。如果失败,则电子邮件发送失败,因此返回 500。无论哪种情况,我们只需更改响应的statusCode并调用回调 (null, response)。您可以利用 Lambda 中的回调函数来表示成功或失败:LAMBDA_PROXYAPI Gateway 中的 需要来自 Lambda 函数的 HTTP 响应。调用始终以回调 (null, response)结束。无法返回 HTTP 响应会导致 API Gateway 返回 502 Bad Gateway。
表演时间 - 测试您的端点的时间
您已将 Lambda 函数代码更新为上述内容。您已将sesConfirmedAddress设置为已验证的 SES 电子邮件。Lambda 的 IAM 角色可以访问Simple Email Service 的sendEmail API。我们剩下的就是测试它是否有效。正如古老的谚语所说,如果你没有测试过它,那么它就不会起作用。就这个项目而言,我指的是通过使用它并观察结果来验证它是否有效。如果我们要构建一个完整的生产应用程序,我们还应该在这里进行其他级别的测试。单元测试和集成测试将是很好的补充。但对于这个简单的联系流程,我们只需确保它在我们的 API 网关中有效即可。
- 从 AWS 控制台导航到 API 网关。
- 点击“联系人”API。
- 单击“ /ContactFormLambda ”资源下的ANY。
- 点击测试
- 选择“POST”作为方法。
- 在请求正文中输入以下内容:
- 单击“测试”
在右侧,我们将看到 API Gateway 调用 Lambda 函数的请求流。下面是我们在底部寻找的内容:
- 方法已完成,状态为:200 -- 太棒了,成功了!请查看您的电子邮件。
- 方法已完成,状态为:500 -- 糟糕,坏了。该检查日志了。
- 方法已完成,状态为:502 -- 配置错误。该检查日志了。
如果我们看到“一切正常”标志(即 200),那么我们可以检查电子邮件并确保它符合我们的预期。如果遇到其他问题,我们将需要进行一些调试。遇到错误时首先要检查什么?日志。但是日志存放在哪里?对于每个 Lambda 调用,都有一个关联的CloudWatch日志流。以下是查找它的方法:
- 从 AWS 控制台导航到 CloudWatch。
- 点击日志
- 在“日志组名称前缀”中输入“ /aws/lambda/ContactFormLambda ”
- 单击“ /aws/lambda/ContactFormLambda ”
单击日志组后,我们将看到 Lambda 函数的日志流。最上面的是最近的调用。任何 Lambda 函数调用中的错误都会记录在日志流中。在日志流中,我们可以查看错误。搜索日志语句,并查看给定调用使用了多少内存和时间。因此,如果我们收到的不是 200 响应代码,请通过检查日志开始调试。如果日志没有显示任何信息,那么我们应该检查其余设置。需要注意的事项:
- 出现意想不到的拼写错误
- 没有将正确的 IAM 策略分配给正确的 IAM 角色
- Lambda 函数配置错误——内存分配或时间分配不正确
启用 CORS 并发布你的 API
在您的 API 准备好投入使用之前,您还需要进行最后几个调整。我们需要做的第一件事是在我们的 API 端点上启用跨源资源共享 (CORS)。这将授予端点对我们指定的域的访问权限。最后一件事是将我们的 API 发布到公共阶段。首先,让我们继续为该端点启用 CORS:
- 从 AWS 控制台导航到 API 网关。
- 点击“联系人”API。
- 单击“ ContactFormLambda ”资源。
- 单击操作
- 选择“启用 CORS ”
- 在“ Access-Control-Allow-Origin ”中输入您要从中调用此端点的网站的 URL。如果您不确定,请将其保留为“*”,这将允许任何域。
- 单击<font style="vertical-
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~