使用无服务器框架使用VPC设置NAT网关

时间:2017-08-18 08:22:32

标签: node.js amazon-web-services amazon-vpc amazon-elasticache serverless-framework

我尝试使用serverless framework创建可以访问Elasticache群集的Lambda函数,以及调用互联网。

我已经配置serverless.yml来创建Lambda函数,创建Elasticache集群(memcached引擎),最后创建一个VPC并将Lambda函数和Elasticache集群放在其中(否则,他们无法沟通)。

据我所知,VPC中的内容无法访问互联网,并且围绕该主题进行研究我得出的结论是,处理此问题的最佳实践方法是为VPC创建NAT网关这将允许外部访问。

我可以在AWS控制台中看到如何执行此操作,但是我希望坚持在serverless.yml内定义此操作以避免任何手动基础结构设置。

  • 是否可以在serverless.yml
  • 中创建NAT网关
  • 正在创建NAT网关正确的方法吗? (有更好的选择吗?)

其他信息

在达到我目前所处的重点时,我大量复制了一个无服务器示例(它是基于Java的示例,但概念和服务定义是相同的)。它创建一个Lambda函数,一个Elasticache集群,并将它们放在一个VPC中,以便它们可以进行通信。我相信它有同样的问题,Lambda功能无法访问互联网。 https://github.com/mugglmenzel/serverless-examples-cached-rds-ws/blob/master/serverless.yml

2 个答案:

答案 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