尝试连接到 AWS Gateway 私有 API 时出现 UnknownHostException
Posted
技术标签:
【中文标题】尝试连接到 AWS Gateway 私有 API 时出现 UnknownHostException【英文标题】:UnknownHostException when trying to connect to a AWS Gateway Private API 【发布时间】:2021-04-13 18:12:57 【问题描述】:我跟着这个:
https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html https://aws.amazon.com/blogs/compute/introducing-amazon-api-gateway-private-endpoints/教程到 tee 以在我的 REST API 端点之间创建私有链接。
基本上,我已经完成的步骤:
将(以前工作的)Edge API 转换为私有 API(通过 AWS API Gateway 控制台)
使用此模板创建了一个具有 2 个公有子网和 2 个私有子网的 VPC:https://s3.amazonaws.com/computeblog-us-east-1/apigateway-private-endpoints/BaseVPC.template
确认在 VPC 上启用了 DNS 命名和 DNS 解析。
创建了一个附加到上面创建的 VPC 的 VPC 终端节点。私有 DNS 已启用。
将此资源策略添加到 API,然后重新部署:
"Version": "2012-10-17",
"Statement": [
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:us-west-2:aws-account-id:rest-api-id/*/*/*",
"Condition":
"StringNotEquals":
"aws:sourceVpce": "vpce-endpoint"
,
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:us-west-2:aws-account-id:rest-api-id/*/*/*"
]
然后我使用 AWS SDK 创建的 Java 客户端:https://aws.amazon.com/sdk-for-java/ 调用 API,并遇到此错误:
com.amazonaws.SdkClientException: Unable to execute HTTP request: rest-api-id.execute-api.us-west-2.amazonaws.com
...
Caused by: java.net.UnknownHostException: rest-api-id.execute-api.us-west-2.amazonaws.com
当我使用 Postman 时也发生了同样的问题。
如https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-api-test-invoke-url.html 和 API Gateway 控制台所示,如果我启用了私有 DNS,我应该能够使用 url 调用 API。
我是不是误会了什么?能够成功调用 API 的正确方法是什么?
【问题讨论】:
你能展示一下你是如何调用 api 的吗? 您在哪里运行您的 Java 客户端/邮递员,如果您从本地计算机运行,您是否启用了私有连接?您只是在日志中显示 rest-api-id 作为示例正确的实际日志有 abcsomething.execute-api.us-west-2.. ,对吗? 如果这是私有 API,则必须从 VPC 内部调用,例如在 ec2 实例上。您能否确认并说明您是如何尝试调用 API 的? @Marcin 你是对的,我相信这可能是问题所在,因为我现在没有连接到任何 EC2 实例。使用教程中的当前设置,我如何确定要连接到哪个 E2 实例?更多详细信息我去EC2页面上的VPC和VPCE在同一个AWS账户上,当前运行的实例数为0。只有一个安全组:EndpointSG sg-number
,连接正确吗?跨度>
从基本的 t2.micro 开始,如果您确实可以正确调用您的 api,只需使用 curl
进行测试。然后你可以从那里了解如何使用邮递员(例如 ssh 隧道)。
【参考方案1】:
资源策略应该具有基于 VPC 端点而不是 VPC 的条件,如图所示。尝试将 "aws:sourceVpc": "vpce-endpoint" 替换为 "aws:sourceVpce": "vpce-endpoint",然后再次部署。
【讨论】:
对不起,我有一个错字。资源策略确实在:"aws:sourceVpce": "vpce-endpoint"
下,问题依然存在。以上是关于尝试连接到 AWS Gateway 私有 API 时出现 UnknownHostException的主要内容,如果未能解决你的问题,请参考以下文章