我创建了一个 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 调用时:和
forbidden
在.
我的 cloudwatch 日志如下。如果我不使用自定义域调用它可以正常工作(绿色 block ),否则没有特定消息(红色 block )。
我已经在这个问题上度过了两个周末,非常感谢任何帮助。
最佳答案
根据我的经验,有两个可能的原因。
专有网络链接
如果您的源服务器位于私有(private) 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 的别名。这是一个 functionality of Route53但可能需要使用 A 记录而不是 CNAME。
关于amazon-web-services - AWS API Gateway 不适用于自定义域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944161/