我想设置一个在私有VPC上运行的EC2实例。它可以从专用VPC连接到Internet,但无法从外部访问。还有一个lambda函数可以触发EC2启动与外部资源(S3,Dynamo,Internet)的某些交互。
我已经建立了一个VPC如下:
这是问题所在。 lambda函数可以使用HTTP连接到Internet,但是当它无法使用私有Hostzone记录(“abcd.internal”)向ALB进行HTTP连接时。
我的理解是我的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”]原因:'Host:abcd.internal。不在证书的altnames中:DNS:.public',host:'abcd.internal。',
这太有趣了。我确实有一个公共主机区域与私有主机区域共存,但公共主机区域用于其他目的。我不知道为什么lambda函数使用公共DNS而不是私有DNS,因为它是在私有子网内配置的。
感谢发表评论并提出建议的所有人。
为了解决这个问题,我几乎在网上找到了所有可能的解决方案。我把一切都放在了正确的位置。 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中使用,但我可以使用这个解决方案。
我有同样的问题。
ALB未被添加为Lambda的触发器,这导致了类似的证书问题。在我的情况下,安全组配置错误。我注意到我分配给Lambda的角色应该包含具有创建/删除ENI权限的策略
有时ALB更新不是很快。所以我用相同的设置重新创建,它开始工作。
您是否确定检查附加到Lambda的IAM角色是否可以访问ec2网络相关操作?以下是IAM策略的示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:CreateNetworkInterface",
"ec2:DescribeNetworkInterfaces",
"ec2:DeleteNetworkInterface",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}
将负载均衡器放置在私有子网中时,只能从VPC内部访问Internet。如果这是你的意图,那好吧。如果您希望Lambda函数能够访问内部负载均衡器,那么您需要将Lambda函数放在同一个VPC中。
[评论后编辑]
如果在VPC私有子网中同时具有负载均衡器和Lambda,并且您希望使用专用DNS名称,则需要配置DHCP选项集以在Route53中使用您自己的DNS服务器,以便Lambda函数可以解析私有DNS名称。