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

如何将特定 AWS API Gateway 阶段连接到特定 AWS lambda 别名

将托管在 AWS EC2 上的 Asp.net Web api 连接到 AWS API Gateway

将特定 AWS API Gateway 阶段连接到 CloudFormation 模板中的特定 Lambda 别名

连接 AWS Api Gateway 和私有 ALB

如何使用 mySQL 工作台连接到 AWS 私有子网 VPC 中的 RDS

从 .Net 应用程序到 AWS API Gateway 的 HTTP POST 请求未按预期工作