发布于 2026-01-06 4 阅读
0

How To Add A Contact Form To A Static Website With AWS Lambda A problem with adding server-side logic to static websites Building an email sending API based on Lambda Managing Lambda functions with Apex Sending emails from a Lambda function Making it possible to invoke via HTTP with API Gateway Integrating with your website You don’t always need servers to add dynamic contents

如何使用 AWS Lambda 向静态网站添加联系表单

向静态网站添加服务器端逻辑时出现的问题

基于 Lambda 构建电子邮件发送 API

使用 Apex 管理 Lambda 函数

从 Lambda 函数发送电子邮件

通过 API 网关实现通过 HTTP 调用。

与您的网站集成

添加动态内容并非总是需要服务器。

我在东京做自由开发者已经超过六年了。业余时间,我一直在开发一款名为Inkdrop的产品。它是一款多平台 Markdown 编辑器应用。我参与了用户界面设计以及后端和前端的开发。

最近,我需要为我的静态网站创建一个电子邮件表单。我决定使用 AWS Lambda。在本文中,我将介绍我的构建过程。如果您想直接尝试而无需阅读本文,请访问我在 GitHub 上的代码仓库

向静态网站添加服务器端逻辑时出现的问题

如果你了解 Git,就可以在GitHub PagesNetlify等托管服务上免费发布静态网站。这些服务非常实用。

所谓“静态”,我的意思是这个网站只使用了HTML、CSS和JavaScript。它没有像PHP这样的服务器端逻辑。

我的个人网站产品网站都托管在Netlify上,它速度快、稳定性好,我非常喜欢它。

我的 Inkdrop 产品网页已部署在 Netlify 上。

图. 我部署在 Netlify 上的 Inkdrop 产品网页。

静态网站无法生成动态内容,也无法执行需要权限的操作,例如发送电子邮件。但有时您可能确实需要这些功能,例如在首页添加联系表单。

问题在于为此部署服务器完全是杀鸡用牛刀。你不知道访客何时会联系你,所以让服务器一直运行毫无意义。

当您想为静态网站添加服务器端逻辑时,无服务器架构非常有用。它允许您仅在需要时运行服务器端脚本。

例如,AWS Lambda只根据函数的请求次数和代码执行时间收费。因此,在等待访客联系您期间,您无需支付任何费用。

图:我主页上的联系表格(请勿出于测试目的向我发送邮件)

我使用 AWS Lambda 在我的主页上构建了一个简单的联系表单(请勿出于测试目的向我发送电子邮件)。我已在 GitHub 上开源了一个示例项目。您可以使用它来构建相同的 API。这对于使用 AWS Lambda 来说是一个很好的教程。

基于 Lambda 构建电子邮件发送 API

API架构

图 API 架构

调用 API 时,实际上是调用一个运行在 Lambda 上的脚本函数。它默认支持 Node.js、C#、Java 和 Python。该函数使用Amazon SES(简单邮件服务)发送电子邮件。由于 Lambda 函数默认情况下无法通过互联网访问,因此您必须使用 API 网关设置每个 HTTP 端点。

如上图所示,您可以从您的网站调用您的 API。

使用 Apex 管理 Lambda 函数

在 AWS 中管理 Lambda函数比较复杂。Apex通过简化工作流程解决了这个问题。它可以帮助您轻松构建、部署和管理 AWS Lambda 函数。

安装 Apex:

curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh
Enter fullscreen mode Exit fullscreen mode

Apex 需要 AWS 凭证。您必须通过以下环境变量指定这些凭证:

  • AWS_ACCESS_KEY_IDAWS 账户访问密钥

  • AWS_SECRET_ACCESS_KEYAWS 账户密钥

  • AWS_REGIONAWS 区域

点击此处了解更多配置 Apex 的详细信息。

现在让我们通过克隆本教程的存储库来创建新的 Apex 项目:

git clone [git@github.com](mailto:git@github.com):craftzdog/send-email-lambda.git
cd send-email-lambda
apex init
> Project name: send-email
Enter fullscreen mode Exit fullscreen mode

给你的项目命名send-email。然后 Apex 会根据你的项目名称设置 IAM 角色。之后你将进入project.json项目的根目录。按如下方式编辑它:

{
  "name": "send-email",
  "description": "Simple email transmitter",
  "memory": 128,
  "timeout": 5,
  "environment": {},
  "runtime": "nodejs6.10",
  "role": "<YOUR_IAM_ROLE>"
}
Enter fullscreen mode Exit fullscreen mode

现在您可以使用 Lambda 了!

从 Lambda 函数发送电子邮件

要让 Lambda 函数发送电子邮件,您需要设置 AWS SES。您需要在 AWS SES 上注册您的电子邮件地址。

请点击下方“验证此电子邮件地址”按钮,通过 SES 进行验证:

将您的电子邮件地址注册到SES。

图:向 SES 注册您的电子邮件地址

AWS 会向您发送一封验证邮件。打开邮件中的链接后,您的邮箱地址即可用于通过 SES 和 Lambda 发送电子邮件。

配置 Lambda 函数以使用 SES

您有一个文件,其中functions/submit/function.json包含名为“submit”的函数的配置文件。请按如下方式编辑此文件:

{
  "environment": {
    "SES_REGION": "us-west-2",
    "FROM_NAME": "Your Contact Form",
    "FROM_EMAIL": "<YOUR_AUTOMATED_EMAIL_SENDER>",
    "TO_EMAIL": "<EMAIL_TO_RECEIVE>"
  }
}
Enter fullscreen mode Exit fullscreen mode
  • SES_REGION:SES 的 AWS 区域

  • FROM_NAME发件人名称类似“联系表格”

  • FROM_EMAIL您将收到邮件的邮箱地址。例如,contact@example.com

  • TO_EMAIL:您的电子邮件地址,用于接收邮件。

向 IAM 角色添加权限

Apex 项目的 IAM 角色权限设置非常有限,以防止滥用。默认情况下,它限制了对 SES 的访问。我们来添加一个权限,允许 Lambda 函数使用它。

前往 IAM 控制面板,找到 Apex 创建的 IAM 角色。下图所示的角色名称为 `<role_name>` contact-form_lambda_function。您的角色名称应为 `<role_name> send-email_lambda_function`。

按下“创建角色策略”按钮,创建以下名称的角色策略send-email_submit

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1504526549000",
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

此策略允许 Lambda 函数使用 SES。

部署并测试电子邮件发送

现在您的项目已准备好发送电子邮件。让我们测试一下是否有效。以下命令将部署 Lambda 函数。请在项目根目录下运行此命令。

apex deploy
Enter fullscreen mode Exit fullscreen mode

然后您可以使用以下命令手动运行 Lambda 函数:

echo -n '{ "subject": "hello", "body": "world" }' | apex invoke submit
Enter fullscreen mode Exit fullscreen mode

您将收到一封发送到您配置的邮箱地址的电子邮件,邮件标题为“hello”,正文为“world”。恭喜!

如果您没有收到邮件,请使用以下命令检查日志:

apex logs -f
Enter fullscreen mode Exit fullscreen mode

阅读错误信息,检查 IAM 角色和 AWS 区域是否正确。发件人地址应已在 SES 上正确注册。

通过 API 网关实现通过 HTTP 调用。

现在我们希望从网站调用 Lambda 函数。AWS API Gateway允许您为该函数创建一个 HTTP 端点。

让我们设置它来接受/submit通过POST调用 Lambda 函数的方法发出的请求。

1. 创建 API

前往 API 网关控制台,然后点击“创建 API”按钮。我们可以把它命名为“my-awesome-send-email-api”,或者你喜欢的任何名称。

2. 创建一个端点/submit

点击“操作”➜“创建资源”,即可/submit从资源部分创建资源。

之后,勾选“启用 API 网关 CORS”。

3. 创建 POST 方法

定义新方法,让端点/submit接受POST方法,方法是选择“操作”➜“创建方法”。

将其设置为按上述方式调用 Lambda 函数。

API 端点概述

图 API 端点概览

4. 部署 API

点击“操作”➜“部署 API”来部署 API。

它将把API公开在网络上。

现在可以从您的网站调用 API 了。

部署结果

图. 部署结果

如上所示,调用 URL是 API 的入口点。

curl您可以使用如下命令调用它:

curl --request POST \
  --url [https://******.execute-api.us-west-1.amazonaws.com/production/submit](https://qen9yylar9.execute-api.us-west-1.amazonaws.com/production/submit) \
  --header 'content-type: application/json' \
  --data '{
 "subject": "Hello",
 "body": "Hoge"
}'
Enter fullscreen mode Exit fullscreen mode

收到邮件了吗?现在可以正常使用了!

可选:速率限制

我建议您对 API 配置速率限制,以限制请求数量。

点击上图中的“启用节流”复选框,并将“速率”的值指定为 1 或 2。

与您的网站集成

现在您拥有了一个可以通过 AJAX 调用的 API。

以下是如何使用Fetch API调用它的示例

export default function sendEmail (subject, body) {
  return fetch('[https://******.execute-api.us-west-1.amazonaws.com/production/submit'](https://qen9yylar9.execute-api.us-west-1.amazonaws.com/production/submit'), {
    method: 'POST',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ subject, body })
  })
}
Enter fullscreen mode Exit fullscreen mode

现在你只需要创建一个表单,并在提交时使用一些 JavaScript 代码调用这个函数即可。

添加动态内容并非总是需要服务器。

Lambda 让您可以轻松添加动态联系表单。这对于构建公司和商店的简易主页非常有用。

无服务器架构让您可以构建能够生成动态内容的网站,而且无需花费太多资金。例如,您可以使用 S3 和 Lambda 构建评论表单,这非常强大。

感谢阅读。我在博客上分享我关于产品开发和自由职业的经验。如果您喜欢,请查看博客上的热门文章:

欢迎在Twitter上关注我,保持联系!


文章来源:https://dev.to/craftzdog/how-to-add-a-contact-form-to-a-static-website-with-aws-lambda-2299