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

luaexgnf  于 2023-11-15  发布在  Java
关注(0)|答案(3)|浏览(129)

我在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地址,我会得到以下地址(也是示例):

ip-10-23-56-1.eu-west-1.compute.internal: 10.23.56.1


所以我想,因为我使用IPv6,而系统使用IPv4,我不能让它工作?我可以从另一个服务器成功调用我的REST服务。
我还使用了以下系统属性:

System.setProperty("java.net.preferIPv6Addresses", "true");
System.setProperty("java.net.preferIPv4Stack", "false");


是否有任何解决方案可以在IPv4底层系统上提供一个“隧道”来隧道IPv6地址以调用REST服务?或者有任何更简单的解决方案吗?

zbsbpyhn

zbsbpyhn1#

错误Protocol family unavailable意味着该协议(在本例中为IPv6)不可用或未在运行代码的系统上配置。
在AWS的情况下,你唯一能做的就是抱怨,并希望他们最终推出IPv6支持的服务还没有它。

o7jaxewo

o7jaxewo2#

经过广泛的研究和测试后,得出的结论是:IPv6不适用于Lambda。如果您在VPC中运行Lambda函数,则会更进一步。
如果您的函数与包含IPv6 CIDR的子网相关联,则无论多少正确的配置都无法让Lambda访问外部资源。
您将能够对一些可用作VPC端点的AWS资源执行API调用。这包括S3和Dynamo等服务,它们将在您的VPC内获得内部IP。VPC端点不支持SQS等服务,因此将获得外部解析。
任何服务或外部API调用在您的VPC之外都会因IPv6 CIDR而失败。解决此问题的唯一方法是从子网中删除IPv6 CIDR或仅为您的Lambda函数创建一个专用路由器。
我们选择了后一种选择,并且在应用适当的VPC安全和路由策略的情况下,一切都运行得很好。

bejyjqdl

bejyjqdl3#

最后,AWS已将IPv6支持添加到AWS Lambda服务,但您需要配置自定义VPC。

相关问题