我想设置在私有VPC上运行的EC2实例。它可以从专用VPC连接到Internet,但无法从外部访问。还有一个lambda函数可以触发EC2启动与外部资源(S3,Dynamo,Internet)的某些交互。
我已经设置了一个VPC如下:
这是问题所在。 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,因为它是在私有子网内配置的。
答案 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名称。