Java 如何通过AWS Lambda调用IPv6 REST服务
我在AWS Lambda中拥有一个Alexa Skill,它使用Java 如何通过AWS Lambda调用IPv6 REST服务,java,aws-lambda,ipv6,alexa,alexa-skills-kit,Java,Aws Lambda,Ipv6,Alexa,Alexa Skills Kit,我在AWS Lambda中拥有一个Alexa Skill,它使用AsyncHttpClient调用以下示例URL下的IPv6REST服务: http://[2a12:5375:4151:2300:1353:a632:5f4e:c232]:4711/rest/test 现在我的问题是,我总是遇到以下异常: ava.util.concurrent.ExecutionException: java.net.ConnectException: Protocol family unavailable
AsyncHttpClient
调用以下示例URL下的IPv6
REST服务:
http://[2a12:5375:4151:2300:1353:a632:5f4e:c232]:4711/rest/test
现在我的问题是,我总是遇到以下异常:
ava.util.concurrent.ExecutionException: java.net.ConnectException: Protocol family unavailable
如果我检查分配给基础服务器或应用程序的IP地址,我会得到以下地址(也是示例):
所以我想,因为我使用的是IPv6,而系统使用的是IPv4,所以我无法让它工作?
我可以从另一台服务器成功调用我的REST服务
我还使用以下系统属性:
System.setProperty("java.net.preferIPv6Addresses", "true");
System.setProperty("java.net.preferIPv4Stack", "false");
是否有任何解决方案可以通过IPv4基础系统提供“隧道”来隧道IPv6地址以调用REST服务?或者有更简单的解决方案吗?错误
协议系列不可用
表示协议(在本例中为IPv6)不可用或未在运行代码的系统上配置
在AWS的情况下,你唯一能做的就是抱怨,并希望他们最终向尚未提供IPv6支持的服务推出IPv6支持。经过相当广泛的研究和测试后,答案是:IPv6不适用于Lambda。如果您在VPC中运行Lambda函数,这会更进一步 如果您的函数与包含IPv6 CIDR的子网相关联,则任何正确的配置都不会使您的Lambda访问外部资源 您将能够对作为VPC端点可用的一些AWS资源执行API调用。这包括S3和Dynamo等服务,它们将在您的专有网络中获得内部IP。VPC端点不支持SQS等服务,因此将获得外部解决方案 任何超出VPC范围的服务或外部API调用都将因IPv6 CIDR而失败。解决此问题的唯一方法是从子网中删除IPv6 CIDR,或仅为Lambda功能创建专用子网
我们选择了后一种选择,并且在应用了适当的VPC安全和路由策略的情况下,一切都很好。您不能仅从IPv4位置访问IPv6地址(除非您使用某些隧道软件,如Teredo),只是为了获取信息:我有一台VirtualServer,它可以处理这两种情况,我使用此服务器作为REST代理,让此IPv6兼容服务器处理请求并通过代理进行代理;)
System.setProperty("java.net.preferIPv6Addresses", "true");
System.setProperty("java.net.preferIPv4Stack", "false");