Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过AWS Lambda调用IPv6 REST服务_Java_Aws Lambda_Ipv6_Alexa_Alexa Skills Kit - Fatal编程技术网

Java 如何通过AWS Lambda调用IPv6 REST服务

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

我在AWS Lambda中拥有一个Alexa Skill,它使用
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");