根据this document,如果我需要通过VPC访问从我的Lambda函数访问Internet资源,我需要设置NAT网关 .
所以我按照this guide设置了NAT网关 . 但是,在我需要编辑子网的路由表以添加目的地:0.0.0.0/0和目标作为我的NAT网关的id的条目的阶段,我收到一个错误
An entry with this destination already exists
我检查并注意到,对于现有条目,目标是我的VPC的互联网网关 . 如果我用NAT网关ID替换该条目,我无法通过SSH从外部访问该VPC中的任何EC2实例 . 如何实现此VPC中所有EC2实例的情况
-
只能通过SSH访问,其余流量被阻止
-
能够完全访问同一VPC中的其他EC2实例
-
有权访问此VPC的Lambda函数可以访问SQS和Kinesis等外部资源 .
3 回答
您需要IGW和NAT网关才能工作 .
在公共子网(您希望从外部访问的子网)中,将0.0.0.0/0流量指向IGW网关 . NAT网关本身需要位于其中一个公共子网中 .
在您要NAT的私有子网中,将指向0.0.0.0/0的流量指向NAT网关弹性网络接口 .
如果0.0.0.0/0与网关绑定,则需要将其删除并添加指向NAT网关 .
见:http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html
我找到了一个很好的详细教程,介绍如何让你的lambda连接到VPC资源和互联网:https://gist.github.com/reggi/dc5f2620b7b4f515e68e46255ac042a7
快速浏览:
为lambda设置新的子网(CIDR与现有子网不重叠) . 你需要:
一个子网,它将指向NAT使用的Internet网关(IGW)(我们称之为A)
几个指向你的lambda(B,C和D)使用的NAT
添加NAT网关:将子网设置为A.
将lambda VPC子网设置为B,C和D.
创建2条路线表:
指向目标为0.0.0.0/0的NAT
指向目标为0.0.0.0/0的IGW(应该已存在)
更新子网A以使用指向IGW的路由表
更新子网B,C和D以使用指向NAT的路由表
希望这可以帮助 .
您需要两个不同的子网 . 听起来好像你只有一个 .
Lambda只能在VPC中使用私有子网 .
私有子网的定义:默认路由是NAT实例(大多数位于不同的公有子网上)或NAT网关,并且子网中没有机器具有公共IP地址 . 在私有子网上允许使用具有公共IP地址的计算机,但在大多数情况下,它们将无法正常工作,因为这在技术上是错误配置 .
公有子网的定义:默认路由是
igw-xxxxxxxx
Internet Gateway对象,并且计算机分配了公共IP地址 . 公共子网上允许没有公共IP地址的计算机,但它们将无法访问Internet,因为这是一个配置错误 .听起来您正试图通过更改默认路由将现有子网从公共更改为私有 . 正如所料,这打破了其他事情 .
另见Why do we need private subnet in VPC?