【问题标题】:Lambda function times out trying to connect to RDS if in VPC, but doesn't if outside VPC如果在 VPC 中,Lambda 函数尝试连接到 RDS 会超时,但如果在 VPC 之外则不会
【发布时间】:2021-10-31 11:59:20
【问题描述】:

我有一个 AWS lambda 函数,它连接到一个 AWS RDS Postgres 数据库,并简单地返回数据库中所有记录的 json 列表。

如果我不将 VPC 分配给 lambda 函数,它可以访问 AWS RDS db。但是,如果我将 VPC 分配给 lambda 函数,它就无法再访问数据库。

对于 lambda 函数和 RDS db,VPC 相同。我还暂时打开了端口 0.0.0.0/0 上的所有入站和出站连接流量以查找问题,但我仍然无法连接。

我认为这可能是与 lambda 函数的 VPC 相关的角色权限,但我已经将策略 AmazonVPCFullAccess 分配给了 lambda 角色。

【问题讨论】:

  • lambda 的超时时间是多少?像 3 秒,或者更像 30 秒。我假设您使用“经典”方式(常规 postgresql)而不是 DB 的 http api(如果您使用 aurora)进行连接。

标签: aws-lambda amazon-vpc aws-security-group


【解决方案1】:

lambda 可以在不在 VPC 中时访问数据库这一事实有点令人不安,因为数据库可能是公共的。

一个经常发生的常见错误是将 lambda 部署到公共子网。 Lambda 仅在 VPC 中获得分配的私有 IP 地址。当部署到公共子网时,它到 Internet 的唯一路由是 Internet 网关。如果 lambda 本身有一个私有 IP 地址(互联网无法将流量路由回您:P),那么这并不能很好地工作。

解决方案的一部分是确保将您的 lambda 部署到私有子网,而不是在需要访问公共资源时使用到 NAT 网关的路由。

然而,解决方案中更好的部分实际上是将数据库放在没有公共 IP 地址的私有子网中。

因为我已经看到我的客户在这方面犯了很多错误,而且压力也不够大:我强烈建议您对 VPC 遵循三层网络模型。这基本上意味着:

  • 不要使用默认 VPC。创建您自己的。
  • 创建 9 个子网:
    • 3 公开
    • 3 私人。把你的私有 lambda 放在这里。
    • 3 分离。将您的数据库放在这里。

有很多文章/模板可以为您做到这一点。一个快速的谷歌搜索给了我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2018-10-20
    • 1970-01-01
    • 2018-07-10
    • 2017-10-12
    • 2019-02-12
    • 2021-11-13
    相关资源
    最近更新 更多