将 POST 个请求从 CloudFront 路由到 Lambda

Routing POST requests from CloudFront to Lambda

我有一个使用 CloudFront 分发的网站,以 S3 作为来源。我编写了一个 Lambda 函数,它接受联系表单提交并将电子邮件与 SES 一起发送。 Lambda 测试结果很好:)

但是,在将 POST 请求从 CloudFront 路由到后端 Lambda 函数时,我一无所知。我该怎么做?

更新: 好的,我的 API 网关测试触发了 Lambda 函数,但我似乎无法从 CloudFront 调用它(或者更确切地说,对我使用 CloudFront 设置的域使用 curl 命令。

我是否需要在 API 网关中将我的域列为自定义域?

如果我在我的 CloudFront 行为中列出路径 /api/*,我是否必须在我的 API 网关设置中反映该路径?那么,在添加特定资源之前,我的 API 网关是否需要以 /api 开头?

更新 2 我想我需要离开或删除 API 网关 URL 末尾的 /dev。开发是我的舞台。

更新3 好了,感觉差了一步。我已经把所有东西都连接起来了。测试请求到达云端,它转发到 api 网关,网关调用 lambda(此时我对我们把这一切做得多么复杂而摇头),然后 lambda 将成功或失败发送回 api 网关,我们很漂亮。除了,当我从 curl 或浏览器执行此操作时,我会得到 MethodNotAllowed。我是否需要向 CloudFront 添加 IAM 角色才能访问 API 网关?

更新 4 仍然无法正常工作。现在,我又回到了我的默认来源 (S3) 的常用 404 错误页面。似乎无服务器是一个正在破灭的梦想。

更新 5 尝试不同的方法,在此推荐:https://serverfault.com/a/839368 想法是使用 API 网关的自定义域名功能,子域如 api.example.com 然后使用 Route53 别名记录将子域流量定向到 API 网关。这可以工作。然后 CloudFront 将处理到 example.com 和 www.example.com 的流量,而 API 网关将接收到 api.example.com 的请求。现在具有挑战性的一点是,在 HTML 表单中,动作属性必须转到不同的子域。让我们看看我们得到了什么样的错误和疯狂的行为:(

取决于您使用什么作为后端(哪种语言、框架等),有不同的方法,但它们都是关于一件事的:Invoke

一种最通用的调用 - HTTP 就在那里,API 文档末尾引用了按语言分类的调用示例。

首先,您将在 Lambda 函数前面设置 API 网关,以便可以通过 POST 请求调用它。听起来你可能已经完成了那部分?

然后,如果您希望 POST 通过 CloudFront,您将在 CloudFront 中添加第二个指向您的 API 网关的来源。

这都是可能的,但配置起来很棘手。为了帮助我创建了一个正确设置的 open-source boilerplate app

  • 具有 CloudFront 和 S3 的静态站点
  • 具有 API 网关和 Lambda 的 API
  • 静态站点与 API
  • 之间的 CORS
  • 静态站点的可选 OAuth 2.0 和 JWT cookie

请参阅 this static JavaScript app 以获取静态站点发布到由 Lambda 支持的 API 的示例。