添加 VPC 配置后调用 lambda 超时

问题描述 投票:0回答:2

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

现在,为了增加安全性,我将VPC配置添加到Lambda中。这是我的 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
成功。现在,当我尝试通过调用 postman 中的 APIGateway URL 来访问该函数时,出现超时错误。这是Postman的截图:

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

amazon-web-services lambda aws-lambda amazon-vpc serverless-framework
2个回答
6
投票

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

您需要设置 NAT 网关才能访问 lambda 函数的互联网。转到下面的链接并在“Lambda 函数的 Internet 访问”主题下查看步骤。

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


5
投票

您正确的做法是将 Lambda 附加到 VPC,以便通过专用网络传输数据库流量。否则,这是不必要的安全妥协,而且在互联网上速度更慢。

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

一些相关信息:

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

设计考虑

我用于类似场景的模式组合:

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

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.