AWS API Gateway无法与自定义域一起使用

时间:2019-09-15 12:36:18

标签: amazon-web-services express aws-lambda aws-api-gateway google-domains

我创建了一个expressjs api,并将其托管在AWS lambda中,并具有相同的api网关。可以正常使用url:

  

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

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

enter image description here

api网关自定义域配置如下,并带有相应的映射。

enter image description here

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

  

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

forbidden on

  

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

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

enter image description here

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

4 个答案:

答案 0 :(得分:2)

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

VPC链接

如果原始服务器位于专用VPC内部,则必须创建VPC链接和网络负载平衡器(NLB),而不是应用程序负载平衡器(ALB)。

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

指向API网关端点

CNAME应该指向API网关端点,而不是CloudFront。在这种情况下,CNAME的值应如下所示。

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

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

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

在我的情况下,一条记录用于指向NLB的别名。它是functionality of Route53,但可能需要使用A记录代替CNAME。

答案 1 :(得分:0)

您是否检查了official documentation,以在API Gateway中设置API的自定义域名?请注意,根据您选择的部署选项,建议是不同的-区域优化或边缘优化:

  

在为边缘优化的API创建自定义域名时,API Gateway会设置CloudFront分配。但是,您必须设置DNS记录,以将绑定到自定义域名的API请求的自定义域名映射到CloudFront分配域名,该请求将通过映射的CloudFront分配路由到API网关。您还必须提供自定义域名的证书。

     

当您为区域API创建自定义域名时,API Gateway会为该API创建区域域名。您必须设置DNS记录,以将自定义域名映射到区域域名,以绑定到要通过映射的区域API端点路由到API网关的自定义域名的API请求。您还必须提供自定义域名的证书。

另一个堆栈溢出线程可能也有帮助:Regional/Edge-optimized API Gateway VS Regional/Edge-optimized custom domain name

答案 2 :(得分:0)

答案 3 :(得分:0)

“无法获取”错误代码不是Lambda或API网关错误代码,而是特定于Express JS的。

您发布的日志看起来像lambda日志,如果这样,则lambda被其他人调用,或者您已通过API调用使用“ https://apis.mydomain.com/aprod/api/v1/todos”作为用户“ SándorBakos”建议。

这意味着您没有在处理自定义域或API网关错误,而是从Lambda函数代码中看到了此错误。一些快速谷歌搜索证明了这一点,我想知道这篇SO帖子对您有帮助吗? Node, Express - CANNOT GET route

有关更多详细信息,如果要在API网关中调用不存在的URI,除非您成功使用SIGV4(IAM Auth),否则将收到403,错误消息为“缺少身份验证令牌”,并且即使这样,它也不会返回“无法获取”错误消息,除非您专门为其映射了网关响应。