我尝试使用serverless framework创建可以访问Elasticache群集的Lambda函数,以及调用互联网。
我已经配置serverless.yml
来创建Lambda函数,创建Elasticache集群(memcached引擎),最后创建一个VPC并将Lambda函数和Elasticache集群放在其中(否则,他们无法沟通)。
据我所知,VPC中的内容无法访问互联网,并且围绕该主题进行研究我得出的结论是,处理此问题的最佳实践方法是为VPC创建NAT网关这将允许外部访问。
我可以在AWS控制台中看到如何执行此操作,但是我希望坚持在serverless.yml
内定义此操作以避免任何手动基础结构设置。
serverless.yml
?在达到我目前所处的重点时,我大量复制了一个无服务器示例(它是基于Java的示例,但概念和服务定义是相同的)。它创建一个Lambda函数,一个Elasticache集群,并将它们放在一个VPC中,以便它们可以进行通信。我相信它有同样的问题,Lambda功能无法访问互联网。 https://github.com/mugglmenzel/serverless-examples-cached-rds-ws/blob/master/serverless.yml
答案 0 :(得分:5)
您必须配置NAT实例或托管NAT网关,以便在VPC内为您的Lambdas提供Internet访问。您可能必须使用serverless.yml
文件的资源部分来创建NAT网关/ NAT实例资源。
查看无服务器框架文档的resources部分。这些资源将在serverless deploy
您可以覆盖/附加任何类型的资源到您的CloudFormation堆栈。您可以添加资源,输出甚至覆盖描述。您还可以在资源模板中使用无服务器变量来处理敏感数据或可重用配置。
因此,您可以在资源部分内为NAT网关添加Cloudformation模板。
例如,
Resources:
NatGateway:
Type: AWS::EC2::NatGateway
DependsOn: NatEIP
Properties:
AllocationId:
Fn::GetAtt:
- NatEIP
- AllocationId
SubnetId:
Ref: PublicSubnet
NatEIP:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
NatRoute:
Type: AWS::EC2::Route
DependsOn: NatGateway
Properties:
RouteTableId:
Ref: PrivateRouteTable
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId:
Ref: NatGateway
以下是VPC内完整的CloudFormation Lambda片段的link。
答案 1 :(得分:2)
我创建了一个带有vpc,eslaticache和NAT网关的lambda示例。你可以查看 https://github.com/ittus/aws-lambda-vpc-nat-examples