【问题标题】:How to call a IPv6 REST service over AWS Lambda如何通过 AWS Lambda 调用 IPv6 REST 服务
【发布时间】:2017-06-01 08:37:21
【问题描述】:

我在 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 服务?或者有没有更简单的解决方案?

【问题讨论】:

  • 您无法从仅 IPv4 的地方访问 IPv6 地址(除非您使用某些隧道软件,例如 Teredo)

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


【解决方案1】:

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

对于 AWS,您唯一能做的就是抱怨并希望他们最终将 IPv6 支持推广到尚不支持的服务。

【讨论】:

  • 仅供参考:我有一个可以同时处理两者的 VirtualServer,我将此服务器用作 REST 代理,让此 IPv6 兼容服务器处理请求并通过代理它们;)
【解决方案2】:

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

如果您的函数与包含 IPv6 CIDR 的子网相关联,那么再多的正确配置也不会让您的 Lambda 访问外部资源。

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

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

我们选择了后一个选项,并且在应用适当的 VPC 安全和路由策略的情况下一切正常。

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 2017-08-07
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多