8

我创建了一个 expressjs api 并托管在 AWS lambda 中,并带有一个 api 网关。使用 url 可以正常工作:

https://[api-id].execute-api.[region].amazonaws.com/prod/api/v1/todos

但我想使用自定义域调用它,并使用 api 网关的自定义域选项对其进行了配置。我已经使用 google 域注册了我的域,并在 DNS 配置中添加了 CNAME 条目以将其映射到云端目标域名。到目前为止,一切都很好。

在此处输入图像描述

api网关自定义域配置如下,对应映射。

在此处输入图像描述

我的问题是我在Cannot GET /aprod/api/v1/todos使用 url 调用时收到消息:

https://apis.mydomain.com/aprod/api/v1/todos

forbidden

https://apis.mydomain.com/api/v1/todos

.

我的 cloudwatch 日志如下。如果我没有使用自定义域调用它可以正常工作(绿色块),否则没有特定消息(红色块)。

在此处输入图像描述

我已经在这个问题上度过了两个周末,非常感谢任何帮助。

4

2 回答 2

9

根据我的经验,有两个可能的原因。

专有网络链接

如果您的源服务器位于私有 VPC 内,则需要创建 VPC 链接和网络负载均衡器 (NLB),而不是应用程序负载均衡器 (ALB)。

查看更多详细信息:https ://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-private-integration.html

指向 API 网关端点

CNAME 应指向 API Gateway 端点,而不是 CloudFront。在这种情况下,CNAME 的值应该是这样的。

https://[api-id].execute-api.[region].amazonaws.com

否则,通过自定义域的访问将直接传递到 CloudFront。

(另一个可能的原因)使用记录

在我的例子中,A 记录用于指向 NLB 的别名。这是Route53 的一项功能,但可能需要使用 A 记录而不是 CNAME。

于 2019-09-16T02:08:25.857 回答
2

“Cannot GET”错误代码不是 Lambda 或 API Gateway 错误代码,看起来特定于 Express JS。

您发布的日志看起来像 lambda 日志,如果是这样,则 lambda 被其他东西调用,或者您已使用“ https://apis.mydomain.com/aprod/通过 API 调用成功调用了您的 lambda 函数。 api/v1/todos ”正如用户“Sándor Bakos”所建议的那样。

这意味着您不是在处理自定义域或 API Gateway 错误,而是从您的 Lambda 函数代码中看到此错误。一些快速的谷歌搜索证明了这一点,我想知道这篇 SO 帖子是否有帮助? 节点,快递 - 无法获取路线

更详细一点,如果您要在 API Gateway 中调用一个不存在的 URI,除非您成功使用 SIGV4(IAM Auth),否则您将收到 403 错误消息“缺少身份验证令牌”,即使如此除非您专门为其映射了网关响应,否则不会返回“Cannot GET”错误消息。

于 2019-09-25T01:07:42.460 回答