AWS lambda使用私有Hostzone DNS

时间:2017-11-30 18:11:49

标签: amazon-web-services aws-lambda amazon-route53 amazon-vpc elastic-load-balancer

我想设置在私有VPC上运行的EC2实例。它可以从专用VPC连接到Internet,但无法从外部访问。还有一个lambda函数可以触发EC2启动与外部资源(S3,Dynamo,Internet)的某些交互。

我已经设置了一个VPC如下:

  1. 在私有VPC子网中运行docker的EC2实例
  2. ALB(应用程序负载均衡器)配置为内部和私有子网(与EC2子网相同)
  3. 正在运行的NAT网关
  4. 一个lambda函数,它将执行HTTPs GET和POST到Internet和ALB
  5. Route53私有主机区有一个记录集,用于将“abcd.internal / api”路由到ALB。
  6. 这是问题所在。 lambda函数可以使用HTTP连接到Internet,但是当它无法通过私有Hostzone记录(“abcd.internal”)HTTP到GET到ALB时。

    我的理解是我的ALB,EC2,lambda,NAT网关和Route53配置在同一个VPC中,它们应该能够通过私有DNS名称相互通信。我不知道为什么会失败。

    注意:在设置内部ALB之前,我尝试在公有子网中设置面向Internet的ALB,然后为此ALB配置公共Hostzone记录集“abcd.public”。它可以与EC2实例通信,EC2实例可以通过NAT网关与Internet进行交互。因此,“EC2 to Internet”部分正在发挥作用。

    更新: 我终于在lambda日志中挖掘了一些错误消息,如下所示:

    错误:主机名/ IP与证书的altnames不匹配:“Host:abcd.internal。不在证书的altnames中:DNS: .public”] 理由:'主持人:abcd.internal。不在证书的altnames中:DNS: .public', 主持人:'abcd.internal。',

    这很有趣。我确实有一个公共主机区域与私有主机区域共存,但公共主机区域用于其他目的。我不知道为什么lambda函数使用公共DNS而不是私有DNS,因为它是在私有子网内配置的。

4 个答案:

答案 0 :(得分:2)

感谢所有发表评论并提出建议的人。

为了解决这个问题,我几乎在网上找到了所有可能的解决方案。我把一切都放在了正确的位置。 Lambda函数,ELB和EC2位于同一VPC私有子网中。正确设置Route53,NAT和IGW。我确实尝试过使用DHCP选项设置,但没有用。也许我不完全理解这个DHCP,我找不到一个例子。

事实证明,HTTPS协议无效。在我转移到私有VPC之前,我在公共VPC中设置相同的东西,资源使用HTTPS进行通信。例如,lambda函数将GET / POST到EC2实例或ELB。将内容移动到私有VPC后,HTTPS命令无法使用内部DNS名称。

但是,如果我使用HTTP协议,资源最终可以通过内部DNS名称找到对方。

我仍然不知道为什么HTTPS不能在私有VPC中使用,但我可以使用这个解决方案。

答案 1 :(得分:0)

我有同样的问题。

未添加ALB作为Lambda的触发器,这对我造成了类似的证书问题。 在我的情况下,安全组配置错误。 我注意到分配给Lambda的角色应包括具有创建/删除ENI权限的策略

有时ALB更新不快。所以我用相同的设置重新创建,它开始起作用。

答案 2 :(得分:0)

您确定要检查附加到Lambda的IAM角色是否有权访问ec2 Network相关的操作吗?这是一个示例IAM策略:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "ec2:CreateNetworkInterface",
            "ec2:DescribeNetworkInterfaces",
            "ec2:DeleteNetworkInterface",
            "ec2:DescribeSecurityGroups",
            "ec2:DescribeSubnets"
        ],
        "Resource": [
            "*"
        ],
        "Effect": "Allow"
    }
]
}

答案 3 :(得分:-1)

将负载均衡器放置在私有子网中时,只能从VPC内部访问Internet。如果这是你的意图,那好吧。如果您希望Lambda函数能够访问内部负载均衡器,那么您需要将Lambda函数放在同一个VPC中。

[评论后编辑]

如果您在VPC私有子网中同时拥有负载均衡器和Lambda,并且您想使用专用DNS名称,则需要配置DHCP选项集以在Route53中使用您自己的DNS服务器,以便Lambda函数可以解析私有DNS名称。

DHCP Options Sets