lambda 如何连接到 vpc 内的 s3
How lambda connects to s3 inside vpc
我无法区分专用子网和 public 子网。
我创建了一个vpc并连接了子网,igw也连接到了路由表。那么,网络不是 public 子网吗?
和我预想的一样,public网络好像要和外面通信,但是根本就没有通信。
可以从 aws lambda 连接到 RDS (vpc),但是上传文件到 s3 和发送消息到 slack 都会超时。
我看过很多关于使用 vpc 端点的帖子,但是当我尝试设置它时
Warning
When you use an endpoint, the source IP addresses from your instances in your affected subnets for accessing the AWS service in the same region will be private IP addresses, not public IP addresses. Existing connections from your affected subnets to the AWS service that use public IP addresses may be dropped. Ensure that you do n’t have critical tasks running when you create or modify an endpoint.
所以 ec2 目前不是与 s3 断开连接吗?然后,服务有问题,无法设置。
在lambda vpc配置中,即使安全组的所有inbound都打开了,也没有建立连接
难道只有设置NAT的方法吗?
NAT 想避免它因为它的成本。
我的目标是在 vpc 上用 lambda 与 rds、s3、slack 通信。
AWS 中的一个 public 子网是其路由 table 具有到 Internet 网关 (IGW) 的默认路由的子网。
IGW 不执行 NAT,因此如果您的计算(EC2 实例或 Lambda 函数或其他)将流量路由到 IGW,那么如果发送它的计算实例具有 public IP,则该流量将到达互联网如果发送它的计算实例没有 public IP,则该流量将被丢弃。
您部署到 VPC 中的 Lambda 函数如何访问互联网(例如,与 Slack 或 S3 通信)?他们必须通过 NAT 进行路由。通常,您将它们部署到私有子网中,并且该子网的路由 table 具有到 public 子网中的 NAT 设备或 NAT 网关的默认路由。
为什么部署到 public 子网中的 Lambda 函数无法访问互联网?因为 public 子网的默认路由是 IGW,Lambda 函数没有 public IP,IGW 会丢弃来自私有 IP 的所有流量。 IGW不是NAT。
Lambda 函数如何在不允许它访问 Internet 的情况下访问 S3?您将 Lambda 函数部署到 VPC 私有子网中,不提供从该子网到 NAT 的默认路由,并在 VPC 中配置 S3 VPC 终端节点。现在 Lambda 可以私下访问 S3。
Lambda 函数如何到达本身位于私有子网中的 RDS 数据库?您将 Lambda 函数部署到私有子网中,为 Lambda 配置安全组,并将 RDS 实例安全组配置为允许来自 Lambda 安全组的入站流量。
未部署到 VPC 的 Lambda 函数如何访问互联网? Lambda 函数没有,也不可能有 public IP,因此它们必须以某种方式通过 NAT 进行路由。但是您没有部署 VPC 更不用说 NAT 那么它是如何工作的呢? Lambda 函数有一个 是 实际部署到 VPC 中的网络接口(ENI),但它不是 您的 VPC。它是一个 AWS 管理的 VPC,它有一个 NAT 网关。
好的,回到你的情况。您希望您的 Lambda 函数到达 Slack(通过互联网)、S3(任何可能的方式)和 RDS(位于您的 VPC 的私有子网中)。这是一个具有挑战性的组合,因为虽然我们可以私下访问 RDS 和 S3(通过内部 VPC 路由到 RDS 并通过 VPC 端点到 S3),但我们无法通过这种方式访问 Slack。或者,如果我们在 VPC 之外部署(通过 AWS 管理的 VPC 中的 NAT),我们可以同时访问 S3 和 Slack,但是我们无法访问私有 RDS。
所以,我认为您需要将 Lambda 部署到私有子网中,该子网需要到 public 子网中 NAT 网关的默认路由,您需要一个 IGW,并且需要正确配置Lambda 函数和 RDS 实例上的安全组,以允许从 Lambda 到 RDS 的入站访问。 S3 流量将 public 路由。或者,如果您需要将 S3 流量保密,您可以添加一个 S3 VPC 端点。
这里有更多有用的信息:
- mixing VPC and non-VPC Lambda functions
- why do we need private subnets in VPC?
PS 如果您在修改路由 tables 或其他方式时有可能弄乱了您的 VPC,那么我建议删除该 VPC 并使用 AWS 控制台 VPC 向导来创建一个新的。
我无法区分专用子网和 public 子网。
我创建了一个vpc并连接了子网,igw也连接到了路由表。那么,网络不是 public 子网吗?
和我预想的一样,public网络好像要和外面通信,但是根本就没有通信。
可以从 aws lambda 连接到 RDS (vpc),但是上传文件到 s3 和发送消息到 slack 都会超时。
我看过很多关于使用 vpc 端点的帖子,但是当我尝试设置它时
Warning
When you use an endpoint, the source IP addresses from your instances in your affected subnets for accessing the AWS service in the same region will be private IP addresses, not public IP addresses. Existing connections from your affected subnets to the AWS service that use public IP addresses may be dropped. Ensure that you do n’t have critical tasks running when you create or modify an endpoint.
所以 ec2 目前不是与 s3 断开连接吗?然后,服务有问题,无法设置。
在lambda vpc配置中,即使安全组的所有inbound都打开了,也没有建立连接
难道只有设置NAT的方法吗?
NAT 想避免它因为它的成本。
我的目标是在 vpc 上用 lambda 与 rds、s3、slack 通信。
AWS 中的一个 public 子网是其路由 table 具有到 Internet 网关 (IGW) 的默认路由的子网。
IGW 不执行 NAT,因此如果您的计算(EC2 实例或 Lambda 函数或其他)将流量路由到 IGW,那么如果发送它的计算实例具有 public IP,则该流量将到达互联网如果发送它的计算实例没有 public IP,则该流量将被丢弃。
您部署到 VPC 中的 Lambda 函数如何访问互联网(例如,与 Slack 或 S3 通信)?他们必须通过 NAT 进行路由。通常,您将它们部署到私有子网中,并且该子网的路由 table 具有到 public 子网中的 NAT 设备或 NAT 网关的默认路由。
为什么部署到 public 子网中的 Lambda 函数无法访问互联网?因为 public 子网的默认路由是 IGW,Lambda 函数没有 public IP,IGW 会丢弃来自私有 IP 的所有流量。 IGW不是NAT。
Lambda 函数如何在不允许它访问 Internet 的情况下访问 S3?您将 Lambda 函数部署到 VPC 私有子网中,不提供从该子网到 NAT 的默认路由,并在 VPC 中配置 S3 VPC 终端节点。现在 Lambda 可以私下访问 S3。
Lambda 函数如何到达本身位于私有子网中的 RDS 数据库?您将 Lambda 函数部署到私有子网中,为 Lambda 配置安全组,并将 RDS 实例安全组配置为允许来自 Lambda 安全组的入站流量。
未部署到 VPC 的 Lambda 函数如何访问互联网? Lambda 函数没有,也不可能有 public IP,因此它们必须以某种方式通过 NAT 进行路由。但是您没有部署 VPC 更不用说 NAT 那么它是如何工作的呢? Lambda 函数有一个 是 实际部署到 VPC 中的网络接口(ENI),但它不是 您的 VPC。它是一个 AWS 管理的 VPC,它有一个 NAT 网关。
好的,回到你的情况。您希望您的 Lambda 函数到达 Slack(通过互联网)、S3(任何可能的方式)和 RDS(位于您的 VPC 的私有子网中)。这是一个具有挑战性的组合,因为虽然我们可以私下访问 RDS 和 S3(通过内部 VPC 路由到 RDS 并通过 VPC 端点到 S3),但我们无法通过这种方式访问 Slack。或者,如果我们在 VPC 之外部署(通过 AWS 管理的 VPC 中的 NAT),我们可以同时访问 S3 和 Slack,但是我们无法访问私有 RDS。
所以,我认为您需要将 Lambda 部署到私有子网中,该子网需要到 public 子网中 NAT 网关的默认路由,您需要一个 IGW,并且需要正确配置Lambda 函数和 RDS 实例上的安全组,以允许从 Lambda 到 RDS 的入站访问。 S3 流量将 public 路由。或者,如果您需要将 S3 流量保密,您可以添加一个 S3 VPC 端点。
这里有更多有用的信息:
- mixing VPC and non-VPC Lambda functions
- why do we need private subnets in VPC?
PS 如果您在修改路由 tables 或其他方式时有可能弄乱了您的 VPC,那么我建议删除该 VPC 并使用 AWS 控制台 VPC 向导来创建一个新的。