【问题标题】:How lambda connects to s3 inside vpclambda 如何连接到 vpc 内的 s3
【发布时间】:2020-06-28 01:58:20
【问题描述】:

我无法区分私有子网和公共子网。

我创建了一个 vpc 并连接了子网,并且 igw 也连接到了路由表。那么,网络不是公共子网吗?

和我预想的一样,公网好像要和外界通讯,但根本没有通讯。

可以从 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 配置中,即使安全组的所有入站都打开了,也不会建立连接。

是否只有一种方法可以设置 NAT?

NAT 想避免它,因为它的成本。

我的目标是在 vpc 上与 rds、s3、slack in lambda 进行通信。

【问题讨论】:

  • 您的 lambda 是在私有子网还是公共子网中?
  • @Marcin 我的 lambda 设置为 vpc。在我的预期中,应该是公有子网,但很可能不是公有子网,所以无法与外界通信。

标签: amazon-web-services amazon-s3 aws-lambda amazon-rds amazon-vpc


【解决方案1】:

AWS 中的公有子网是其路由表具有到 Internet 网关 (IGW) 的默认路由的子网。

IGW 不执行 NAT,因此如果您的计算(EC2 实例或 Lambda 函数或其他)将流量路由到 IGW,那么如果发送它的计算实例具有公共 IP,那么该流量将到达 Internet,并且该流量将被丢弃如果发送它的计算实例没有公共 IP。

您部署到 VPC 中的 Lambda 函数如何访问互联网(例如,与 Slack 或 S3 通信)?他们必须通过 NAT 路由。通常,您将它们部署到私有子网中,并且该子网的路由表具有到公共子网中的 NAT 设备或 NAT 网关的默认路由。

为什么部署到公有子网的 Lambda 函数无法访问互联网?由于公有子网的默认路由是 IGW,因此 Lambda 函数没有公有 IP,IGW 会丢弃来自私有 IP 的所有流量。 IGW 不是 NAT。

Lambda 函数如何在不访问互联网的情况下访问 S3?您将 Lambda 函数部署到 VPC 私有子网中,不提供从该子网到 NAT 的默认路由,并在 VPC 中配置 S3 VPC 终端节点。现在 Lambda 可以私下访问 S3。

Lambda 函数如何访问本身位于私有子网中的 RDS 数据库?您将 Lambda 函数部署到私有子网中,为 Lambda 配置安全组,并将 RDS 实例安全组配置为允许来自 Lambda 安全组的入站流量。

部署到 VPC 中的 Lambda 函数如何访问互联网? Lambda 函数没有也不能拥有公共 IP,因此它们必须以某种方式通过 NAT 进行路由。但是您没有部署 VPC,更不用说 NAT,那么它是如何工作的呢? Lambda 函数有一个实际部署到 VPC 中的网络接口(ENI),但它不是您的 VPC。它是一个由 AWS 管理的 VPC,并且有一个 NAT 网关。

好的,回到你的情况。您希望您的 Lambda 函数能够访问 Slack(通过 Internet)、S3(任何可能的方式)和 RDS(位于您的 VPC 的私有子网中)。这是一个具有挑战性的组合,因为虽然我们可以私下访问 RDS 和 S3(通过内部 VPC 路由到 RDS 和通过 VPC 端点到 S3),但我们无法通过这种方式访问​​ Slack。或者,如果我们部署在 VPC 之外(通过 AWS 管理的 VPC 中的 NAT),我们可以同时访问 S3 和 Slack,但是我们无法访问私有 RDS。

所以,我认为您需要将 Lambda 部署到私有子网中,该子网需要到公共子网中的 NAT 网关的默认路由,您需要一个 IGW,并且您需要在您的 Lambda 函数上正确配置安全组和 RDS 实例以允许从 Lambda 到 RDS 的入站访问。 S3 流量将公开路由。或者,如果您需要将 S3 流量保密,您可以添加一个 S3 VPC 终端节点。

更多有用的信息在这里:

PS 如果您在修改路由表或其他方式时弄乱了您的 VPC,那么我建议您删除该 VPC 并使用 AWS 控制台 VPC 向导创建一个新的。

【讨论】:

  • 谢谢。我还将阅读您给我的帖子并重建 vpc。如果它不继续,我会再次发表评论。
  • 我可以再问你一个吗?设置 vpc 端点时有哪些警告?我不明白
  • 如果您有与 S3 的现有连接,它会警告您可能会断开连接。任何连接的实例都将从公共 IP 连接到 S3 切换到私有 IP 通过私有端点连接到 S3。如果您没有任何正在运行的实例或活动连接,则无关紧要。无论如何,这是我的理解。
  • 有什么办法可以查看连接到s3的所有连接吗?现在我在 ec2 和 lambda 中将日志记录为 s3,但我认为它不会继续连接。
  • 理想情况下,在您的应用程序投入使用之前,首先使用 CloudFormation 或同等工具构建所有这些基础架构。如果您将此更改应用于现有基础架构,那么您需要解决一个一般性问题,即停止现有连接,而这并非易事。您需要一些编程方式来告诉所有实例暂停任何 S3 交互。或者你为你的应用建立一些弹性,这样它们就可以处理断开连接并重新连接并重试。
猜你喜欢
  • 2019-06-29
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多