添加 VPC 配置后调用 lambda 超时

Invoking the lambda gets timed out after adding VPC configurations

我正在使用无服务器框架来创建 lambda。我创建了一个简单的 Lambda 函数,它从 Mongo 实例和 returns 响应中查询。最初,我使用 publicIp 创建了 Mongo 实例,并让 Lambda 使用 publicIP 访问该实例。效果很好。

现在,为了增加安全性,我在Lambda中添加了VPC配置。这是我的 serverless.yml:

functions:
  graphql:
    handler: handler.graphql
    iamRoleStatements:
      - Effect: Allow
        Resource: "*"
        Action:
          - ec2:CreateNetworkInterface
          - ec2:DescribeNetworkInterfaces
          - ec2:DetachNetworkInterface
          - ec2:DeleteNetworkInterface
          - logs:CreateLogGroup
          - logs:CreateLogStream
          - logs:PutLogEvents
    vpc:
      securityGroupIds:
        - sg-16f9e371
      subnetIds:
        - subnet-883a12fe
        - subnet-3f7b1067
    events:
      - http:
          path: graphql
          method: post
          integration: lambda
          memorySize: 256
          timeout: 10
          cors: true
          response:
            headers:
              Access-Control-Allow-Origin: "'*'"

添加以上配置,serverless deployment成功。现在,当我尝试通过在邮递员中调用 APIGateway URL 来访问该函数时,出现超时错误。这是 Postman 的截图:

VPC 配置 添加到 Lambda 是否会导致无法通过公开调用访问它?

当您在 VPC 中创建 lambda 函数时,lambda 函数的弹性网络接口仅分配一个私有 IP 地址。但是要连接到 Internet 上的资源,您需要一个 public IP 地址。如果您的 mongo 实例通过互联网访问,您的 lambda 函数将无法连接到它。

您需要设置 NAT 网关才能通过互联网访问 lambda 函数。转到下面 link 并在主题 "Internet Access for Lambda Functions" 下查看步骤。

http://docs.aws.amazon.com/lambda/latest/dg/vpc.html

通过将 Lambda 附加到 VPC 以通过专用网络传输数据库流量,您做对了。否则这是一种不必要的安全妥协,并且在 Internet 上速度较慢。

之前的答案是正确的,您现在有一个 ENI 附加到您的 Lambda 函数,这意味着它在您的 VPC 子网上有一个私有 IP 连接。我猜您的 MongoDB 实例也在您的 VPC 中,如果它在互联网上的其他地方,您应该将其保持为公开连接。

一些相关信息:

  • 要与 MongoDB 实例通信,您现在需要连接到 MongoDB EC2 的私有 IP 地址。
  • 确保安全组配置为从 Lambda 传出并传到 EC2。
  • 如有必要,请确保网络可路由。
  • API 网关仍然可以调用 VPC 附加的 Lambda 函数并接收响应。

设计考虑

我在类似场景中使用的模式组合:

  1. 当您使用 API 网关和 Lambda 设计无服务器解决方案时,您应该遵循 单一职责原则,即每个函数只做一件事并且把它做好.
  2. 所以你有一个函数(“The Controller”)接收来自消费者的请求并负责协调流程(你也可以为此使用 Step Functions ).控制器未附加 VPC 并协调许多子函数。
  3. 交叉模式(我编的)从 VPC 附加资源(或通过 DirectConnect)获取信息,您有一个连接 VPC 的 Lambda 函数。此函数有一项工作,即与 VCP 资源通信(读取、写入、api 调用等)。控制器使用针对 VPC 资源的请求详细信息调用此 Lambda 函数,并接收响应以进一步处理信息。通过这种方式,您可以将大部分无服务器应用程序保留在亚马逊生态系统中,因此它可以与无服务器资源(S3、DynamoDB、Kinesis、SQS 等)进行本地对话,同时能够向全服务器世界发送请求,一个有点像非军事区。

希望对您有所帮助。