AWS Lambda函数无法在同一VPC中调用另一个Lambda函数

8

我创建了一个VPC 10.5.0.0/16,并带有两个子网 (10.5.1.0/24, 10.5.4.0/24)。

我创建了一个安全组:

入站规则:

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
现在我创建了两个使用适当IAM角色(包含调用策略)的Lambda函数。这两个Lambda函数都位于同一VPC、子网和安全组中。 情况1:
  • 当Lambda函数未关联VPC子网和安全组时,我可以成功从Lambda 1调用Lambda 2。
情况2:
  • 当这两个Lambda函数位于相同的VPC中时,我无法从Lambda 1调用Lambda 2。
我认为我可能遗漏了某些东西,但是我想不出来。有什么建议吗?

为什么Lambda函数连接到VPC?它们是否访问同一VPC中的其他资源? - John Rotenstein
我正在尝试测试VPC的工作原理。但是在未来,我将创建一个Lambda函数,该函数将从另一个VPC(这里我将进行VPC对等连接)中获取来自Redsift的数据。 - Maldanna Gk
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
11
很遗憾,调用lambda的唯一方式是通过公共lambda服务端点。由于VPC中的lambda函数没有互联网访问权限或公共IP,您无法在VPC中从一个lambda函数调用另一个lambda函数,除非能够访问互联网。引用文档

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

遗憾的是,它们位于同一VPC甚至同一子网中是无关紧要的。

要纠正这个问题,调用函数必须具有互联网访问权限,因为lambda服务没有 VPC接口端点。这可以通过将其放置在私有子网中,并使用正确配置路由表的NAT网关/实例来提供访问。


6
我相信这个信息已经不正确了,AWS现在也为他们的Lambda服务提供了VPC端点 - Nino van der Mark

2
在AWS Lambda引入AWS PrivateLink后,可以在VPC上调用一个Lambda函数来调用另一个Lambda函数,而不需要互联网访问。这里可以找到一些非常好的教程(必读):

以下是我所做的有效方法(可能存在冗余步骤,但它确实有效):

  1. 创建了一个新的安全组(sg-abc),并将其分配给两个Lambda函数。
  2. 修改默认安全组,允许来自sg-abc的所有流量进入,并修改sg-abc以允许来自默认安全组的所有流量。
  3. 创建了一个新的com.amazonaws.ap-south-1.lambda终端节点(使用您首选的位置),并将默认安全组和sg-abc都分配给它。
  4. 修改了我的第一个Lambda函数的资源,以允许lambda:Invoke(我正在使用serverless.yml)。
  5. 就这样!我现在能够从另一个Lambda函数中调用一个Lambda函数了!而不需要设置NAT、IGW等。这种方式要简单得多。

2

如果没有NAT网关,VPC内的Lambda函数将无法访问互联网。调用Lambda函数需要调用者能够连接到AWS API。通常情况下,这意味着调用者需要具备互联网访问权限。虽然有些服务支持VPC端点,这种情况下,VPC内部的调用者可以通过私有方式连接到服务API。不幸的是,Lambda并不是支持VPC端点的服务之一。


1

关于安全组...

调用 AWS Lambda 函数的 invoke 是通过互联网连接到 AWS Lambda 服务进行的。

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

事实上,AWS Lambda 函数的安全组的正常安全组配置为:

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

示例

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

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

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


0
我遇到了同样的问题。我们在同一个VPC中运行了2个Lambda函数,使用相同的子网和路由表。但是Lambda1无法调用Lambda2。在阅读这篇帖子时,我意识到调用权限是问题所在。因此,我在Lambda2(被调用的服务)中创建了调用函数权限,具体操作如下: Lambda - 权限 - 基于资源的策略语句 -> 添加权限 - 为AWS服务 -> 在“service”中选择API Gateway,并在“Source ARN”中输入Lambda2(被调用的服务)的ARN。 然后问题解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,