调用 AWS API Gateway Private 无法从 Front 访问,但 EC2 有效
Posted
技术标签:
【中文标题】调用 AWS API Gateway Private 无法从 Front 访问,但 EC2 有效【英文标题】:Invoke AWS API Gateway Private not accessible from Front but EC2 works 【发布时间】:2021-05-12 14:19:47 【问题描述】:我正在尝试从部署在 EC2 实例上的 React JS Front 调用 AWS API Gateway Private,我得到:POST https://abcdefghi0123456.execute-api.us-west-2.amazonaws.com/stage/ net::ERR_NAME_NOT_RESOLVED。
条件如下:
好的 - 私有 API 网关与 VPCE(VPC 端点)关联以访问和调用 Lambda(位于 VPC 中)
OK - 从 API 的方法调用 Lambda (VPC) 进行 POST 测试
OK - 从 EC2 实例命令行进行 POST 测试,这里是 curl 命令的示例:
curl --location --request POST 'https://abcdefghi0123456.execute-api.us-west-2.amazonaws.com/stage/' --header '内容类型:应用程序/json' --data-raw ' “我的钥匙”:“我的价值” '
错误 - 来自 React JS 构建的 POST 部署在同一 EC2 实例中
注意:
OK - 调用 AWS 公共 API 网关
附加到私有 API 网关的策略示例:
“版本”:“2012-10-17”, “陈述”: [ “效果”:“拒绝”, “校长”:“”, “动作”:“执行 API:调用”, "资源": "arn:aws:execute-api:us-west-2:123456789123:abcde1abc2///", “健康)状况”: "StringNotEquals": “aws:sourceVpce”:“vpce-0abc12d34567e8901” , “效果”:“允许”, “校长”:“”, “动作”:“执行 API:调用”, “资源”:“arn:aws:execute-api:us-west-2:123456789123:abcde1abc2///” ]
【问题讨论】:
net::ERR_NAME_NOT_RESOLVED
似乎是来自浏览器的错误。您实际在哪里调用您的 api?
目前我从部署在 VPC 内 EC2 实例上的 React JS 调用 API。
ReactJS 不是用于前端吗?所以你的代码实际上会在浏览器中执行,而不是在 ec2 实例上,就像你使用 php 或 python 一样?
当然,ReactJS 是用于前端的。代码是javascript。
【参考方案1】:
您的 ReactJS 不起作用,因为调用您的 API 的 JavaScript 代码在 客户端(例如 Web 浏览器)上执行。
这需要公共 API 网关,它可以在 Internet 上工作,而不是只在 VPC 内有效的私有网关。正如您使用 curl
验证的那样,私有 API 只能在实例上执行的后端代码中工作,并且不能通过 Internet 调用。随后,它将无法在客户端运行。
要使您的 API 网关可从客户端调用,必须将其更改为公共 API。
【讨论】:
谢谢,如何保护 API 网关?据我了解,我必须将其放入 VPC 中。 @ambigus9 如果 api 应该是公共的,您可以使用 Lambda 授权方或 Amazon Cognito。 VPC 中的 API,仅供 VPC 内部使用,而不是像您现在拥有的那样来自互联网。 谢谢,目前该应用程序已在 ReactJS 上开发,并具有 Amplify App 和 AWS Amazon Cognito 来验证用户联合。这是一个安全的解决方案吗? @ambigus9 在什么意义上安全?这是通常的做法。 谢谢!你解决了我的问题。非常感谢!以上是关于调用 AWS API Gateway Private 无法从 Front 访问,但 EC2 有效的主要内容,如果未能解决你的问题,请参考以下文章
我如何通过 API Gateway 调用 AWS Step Functions? [关闭]
AWS Api Gateway 仅在 OPTIONS 调用时不响应 CORS 标头
调用 AWS API Gateway Private 无法从 Front 访问,但 EC2 有效
Terraform:为调用 Lambda 的 AWS API Gateway 创建 url 路径参数?