使用无服务器框架通过 VPC 设置 NAT 网关
Posted
技术标签:
【中文标题】使用无服务器框架通过 VPC 设置 NAT 网关【英文标题】:Setting up a NAT gateway with VPC using Serverless framework 【发布时间】:2018-01-26 20:42:12 【问题描述】:我正在尝试使用 serverless framework 创建一个 Lambda 函数,该函数可以访问 Elasticache 集群,以及调用互联网。
我已经配置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
【问题讨论】:
【参考方案1】:您必须配置一个 NAT 实例或一个托管 NAT 网关,以便为您在 VPC 内的 Lambda 提供 Internet 访问。您可能必须使用 serverless.yml
文件的 resource 部分来创建 NAT 网关/NAT 实例资源。
查看无服务器框架文档的resources 部分。这些资源将在 serverless deploy
时添加到 cloudformation 堆栈中
您可以将任何类型的资源覆盖/附加到您的 CloudFormation 堆栈。您可以添加资源、输出甚至覆盖描述。您还可以在资源模板中将无服务器变量用于敏感数据或可重用配置。
因此,您可以在 resource 部分中为 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
这是一个link,指向 VPC 内 Lambda 的完整 CloudFormation sn-p。
【讨论】:
【参考方案2】:我创建了一个带有 vpc、eslaticache 和 NAT 网关的 lambda 示例。您可以查看 https://github.com/ittus/aws-lambda-vpc-nat-examples
【讨论】:
以上是关于使用无服务器框架通过 VPC 设置 NAT 网关的主要内容,如果未能解决你的问题,请参考以下文章
AWS Lambda:如何为具有 VPC 访问权限的 lambda 函数设置 NAT 网关