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

时间:2017-01-17 10:19:00

标签: java aws-lambda ipv6 alexa alexa-skills-kit

我在AWS Lambda中托管了一个Alexa技能,它使用AsyncHttpClient在以下示例网址下调用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

所以我认为,因为我在系统使用IPv4时使用的是IPv6,所以我无法使用它? 我可以成功地从另一台服务器调用我的REST服务。

我也在使用以下系统属性:

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

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

2 个答案:

答案 0 :(得分:3)

错误Protocol family unavailable表示协议(在本例中为IPv6)在运行代码的系统上不可用或未配置。

就AWS而言,您唯一能做的就是抱怨并希望他们最终将IPv6支持推广到尚未拥有它的服务。

答案 1 :(得分:0)

经过相当广泛的研究和测试后,这个词是:Lambda无法使用IPv6。如果在VPC中运行Lambda函数,这会更进一步。

如果您的功能与包含IPv6 CIDR的子网相关联,那么正确的配置数量将使您的Lambda无法访问外部资源。

您将能够对可用作VPC端点的某些AWS资源进行API调用。这包括S3和Dynamo等服务,他们将在您的VPC中获得内部IP。 VPC端点不支持SQS等服务,因此可以获得外部解析。

VPC外部的任何服务或外部API调用都将失败并显示IPv6 CIDR。解决此问题的唯一方法是从子网中删除IPv6 CIDR,或仅为Lambda函数创建专用子网。

我们选择了后一个选项,所有这些选项都适用于适当的VPC安全和路由策略。