我有一个AWS Lambda函数,该函数:
Redis实例位于私有子网中;因此,为了获取它,我添加了VPC和实例所在的子网。我还指定了允许所有出站流量的安全组。网络ACL是默认值,适用于所有入站和出站流量。
通过控制台将VPC添加到Lambda函数时,它会提示:
启用VPC后,您的Lambda功能将失去默认的Internet访问。 如果您需要外部互联网访问功能,请确保您的安全组允许出站连接,并且您的VPC具有NAT网关。
因此,在专用子网的Route Table
中,我也添加了一个NAT gateway
。但是,从Lambda函数调用Google Places API服务时,注定总是会导致超时。
NAT网关是否在CloudWatch等中记录了呼叫或尝试通过它进行的呼叫尝试?
答案 0 :(得分:3)
我想详细说明@vahdet的答案。我迷失了试图调和NAT网关应该同时存在于公共子网和私有子网中的想法。似乎官方的AWS文档here是错误的,但事实并非如此。我和其他人都错过了一个非常微妙的细节。
NAT网关必须同时跨两个不同的子网进行“热线连接”,以便将专用地址桥接到面向Internet的公共地址。
首先,我尝试将NAT网关与IGW放在相同的路由表中,但是这当然不起作用,因为您不能拥有两个具有不同目标的相同路由(0.0.0.0/0)。 / p>
该指南说要把NAT网关放在专用网络的路由表中,我这样做了,但这似乎不起作用。
我缺少的关键细节是必须在公共子网中创建 NAT网关。该文档实际上是这样说的,但是似乎令人困惑,因为后来我们被告知将NAT网关的路由放在私有表中。
这都是事实。在公共子网中创建NAT网关,然后仅在私有路由表中添加路由表条目。
文档告诉您在VPC中创建以下网络资源:
我已经有一个路由表和一些子网,所以我尝试仅添加一个新子网和一个新路由表,这就是我遇到麻烦的地方。最好按文档中的每个创建两个。
这是子网对我来说的样子:
subnet-public 10.8.9.0/24 us-east-1a
subnet-private 10.8.8.0/24 us-east-1a
然后在 subnet-public 中创建 NAT网关。 它将等待几分钟,这一点很重要,因为它必须先变为可用状态,然后才能在路由表条目中引用它。
以下是路由表:
route-table-public
10.8.0.0/16 local
0.0.0.0/0 igw-xyz
subnet-association: subnet-public
route-table-private
10.8.0.0/16 local
0.0.0.0/0 nat-abc
subnet-association: subnet-private
您看到那里发生了什么吗?真的很微妙。 NAT网关是交叉接线的。它“生活”在创建它的公共子网中,但是私有子网中的所有流量都路由到该子网中。
如果像我一开始那样在私有子网中创建NAT网关,则NAT网关与私有子网中的其他所有事物一样孤立,并且无法将流量路由到Internet。必须在公共子网中创建才能访问互联网,因为它必须在公共子网中具有IP地址。我的NAT网关的内部IP为 10.8.9.127 ,外部IP在54.X.X.X范围内。
通过在专用路由表中将NAT网关设置为0.0.0.0/0路由,我们告诉所有非10.8.0.0/16流量直接进入NAT网关,实际上在专用子网内部。
VPC本身知道如何跨自己的子网桥接流量,并且能够将10.8.8.X流量发送到NAT网关的10.8.9.X IP。然后,它充当桥接器,并将通过其内部IP的所有流量转换为其外部IP。由于外部IP位于具有Internet网关的路由表中的公共子网中,因此外部IP拥有通往Internet的清晰路径。
现在,我在 subnet-private 中的私有VPC lambda已通过NAT网关验证了互联网访问权限。
答案 1 :(得分:2)
需要以下步骤
答案 2 :(得分:0)
我所遇到的问题是,我在专用子网中创建了NAT网关。
确保将NAT网关放置在公共子网中。
顺便说一下,CloudWatch中没有用于NAT网关的指标,但没有直接的日志记录。