尝试连接到 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的主要内容,如果未能解决你的问题,请参考以下文章