我正在使用无服务器框架来创建 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 是否会导致无法通过公开调用来访问它?
当您在 VPC 内创建 lambda 函数时,lambda 函数的弹性网络接口仅分配一个私有 IP 地址。但要连接到互联网上的资源,您需要一个公共 IP 地址。如果您的 mongo 实例是通过互联网访问的,您的 lambda 函数将无法连接到它。
您需要设置 NAT 网关才能访问 lambda 函数的互联网。转到下面的链接并在“Lambda 函数的 Internet 访问”主题下查看步骤。
您正确的做法是将 Lambda 附加到 VPC,以便通过专用网络传输数据库流量。否则,这是不必要的安全妥协,而且在互联网上速度更慢。
之前的答案是正确的,您现在有一个 ENI 附加到您的 Lambda 函数,这意味着它在您的 VPC 子网上有一个私有 IP 连接。我猜测您的 MongoDB 实例也在您的 VPC 中,如果它在互联网上的其他地方,您应该将其保持为公共连接。
一些相关信息:
设计考虑
我用于类似场景的模式组合:
希望这有帮助。