添加VPC配置后,调用lambda会超时

Lak*_*kar 5 lambda amazon-web-services amazon-vpc aws-lambda serverless-framework

我正在使用无服务器框架来创建lambda.我创建了一个简单的Lambda函数,它从mongo实例查询并返回响应.最初,我使用publicIp创建了mongo实例,并使用publicIP使Lambda访问该实例.它运作良好.

现在,为了提高安全性,我将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: "'*'"
Run Code Online (Sandbox Code Playgroud)

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

向Lambda 添加VPC配置是否通过公开调用它使其无法访问?我很迷惑.对此的任何想法都会很棒.

小智 6

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

您需要设置NAT网关才能访问lambda函数.转到以下链接并在"Internet访问Lambda函数"主题下查看以查看步骤.

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


Mat*_*t D 5

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

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

一些相关信息:

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

设计考虑

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

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

希望这可以帮助。