【问题标题】:AWS Lambda function can't invoke another Lambda function in the same VPCAWS Lambda 函数无法调用同一 VPC 中的另一个 Lambda 函数
【发布时间】:2021-01-03 00:30:46
【问题描述】:

我创建了一个具有 2 个子网(10.5.1.0/2410.5.4.0/24)的 VPC 10.5.0.0/16

我创建了一个安全安全组:

入站规则:

Type Protocol   Port   range   Source      Description - optional
All  traffic    All    All    0.0.0.0/0    allowing traffic from same security group
All  traffic    All    All    ::/0         allowing traffic from same security group

出站规则:

Type Protocol   Port   range   Source      Description - optional
All  traffic    All    All    0.0.0.0/0    allowing traffic from same security group
All  traffic    All    All    ::/0         allowing traffic from same security group

现在我创建了 2 个具有适当 IAM 角色的 Lambda 函数(其中包含调用策略)。这 2 个 Lambda 函数位于相同的 VPC、子网和安全组中。

案例一:

  • 当 Lambda 函数附加到 VPC 子网和安全组时,我能够从 Lambda 1 成功调用 Lambda 2

案例 2:

  • 当它们在同一个 VPC 中时,我无法从 Lambda 1 调用 Lambda 2

我想我错过了一些东西,但我无法弄清楚。有什么建议吗?

【问题讨论】:

  • 为什么 Lambda 函数要连接到 VPC?他们是否访问同一 VPC 中的其他资源?
  • 不只是想测试 vpc 的工作方式。但将来我将创建 lambda 函数,该函数将从另一个 vpc 的 redsift 获取数据(这里我将做 vpc 对等)

标签: amazon-web-services aws-lambda


【解决方案1】:

我想我错过了什么,但我想不通

不幸的是,调用 lambda 的唯一方法是通过 公共 lambda 服务端点。由于 VPC 中的 lambda 函数没有 Internet 访问权限,也没有公共 IP,因此您无法从 VPC 中的另一个 lambda 函数调用一个 lambda 函数,而无需访问 Internet。来自docs

将函数连接到公共子网不会为其提供互联网访问权限或公共 IP 地址

遗憾的是,它们在同一个 VPC 甚至同一个子网中的事实是无关紧要的。

为了纠正这个问题,调用函数必须能够访问互联网,因为 lambda 服务没有 VPC interface endpoint。这可以通过将其放置在私有子网中并使用NAT gateway/instance 和正确配置的路由表来提供访问权限来实现。

【讨论】:

  • 我认为此信息不再正确,AWS 现在也为其 Lambda 服务提供了VPC endpoint
【解决方案2】:

没有 NAT 网关的 VPC 内的 Lambda 无法访问互联网。调用 lambda 函数需要调用者能够连接到 AWS API。这通常意味着呼叫者需要访问互联网。虽然支持 VPC 端点的服务例外,但在这种情况下,VPC 内的调用者可以私下连接到服务 API。不幸的是,lambda 不是支持 VPC 端点的服务之一。

【讨论】:

    【解决方案3】:

    关于安全组...

    invoke AWS Lambda 函数的调用会发送到位于 Internet 上的 AWS Lambda 服务。

    如果 Lambda-1 调用 Lambda-2,则它们无需位于同一 VPC 中,也无需通过安全组相互访问。

    其实AWS Lambda函数上安全组的正常安全组配置是:

    • 入站:不需要入站规则,因为函数由 AWS 服务调用。没有任何东西可以“连接”到 AWS Lambda 函数。
    • 出站:允许所有出站流量是正常的,因为您可以“信任”自己的代码。

    示例

    假设您有一个调用 Amazon RDS 数据库的 AWS Lambda 函数。配置将是:

    • Lambda 函数 (Lambda-SG) 上的安全组,无入站规则,默认出站规则(所有流量)
    • RDS 数据库 (RDS-SG) 上的安全组允许来自Lambda-SG 的所有入站连接和默认出站规则(所有流量)

    这意味着 Lambda 函数可以与 RDS 数据库通信(因为 RDS-SG 专门引用了 Lambda-SG),但不允许其他任何东西访问 RDS 数据库。

    【讨论】:

      【解决方案4】:

      事实证明,在为 AWS Lambda 引入 AWS PrivateLink 之后,可以从另一个 lambda 调用一个 lambda,它们都在一个 VPC 上,不需要互联网访问。

      一些不错的教程可以在这里找到(必须阅读):

      以下是有效的方法(可能有多余的步骤,但有效):

      1. 创建了一个新的安全组 (sg-abc) 并将其分配给两个 lambdas
      2. 修改了默认 SG 并允许所有流量上来自 sg-abc 的入站流量,还修改了 sg-abc 以允许来自默认 SG 的所有流量
      3. 创建了一个新的端点 com.amazonaws.ap-south-1.lambda(使用您的首选位置)并分配了默认的 SG 和 sg-abc
      4. 修改了我的第一个 Lambda 资源以允许 lambda:Invoke(我正在使用 serverless.yml
      5. 就是这样!我现在能够从另一个调用一个 lambda 了!无需设置 NAT、IGW 等。这样就容易多了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-23
        • 2018-06-09
        • 2019-09-23
        • 2018-05-19
        • 2019-06-28
        • 2020-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多