如何配置NAT以用于已具有用于S3访问的Internet网关的Lambda?

时间:2017-11-04 06:37:49

标签: amazon-web-services amazon-s3 aws-lambda amazon-rds nat

我的设置是:

S3 (website) -> API Gateway -> Lambda -> RDS 
                                      -> S3 (configuration)
                                      -> Shopify
                                      -> Transactional Mail

我设置了Internet网关以允许访问我的S3配置,我需要连接NAT以允许我向第三方发出呼叫。我试图通过更改我的路由表条目0.0.0.0/0 - >来仅使用NAT(per this question)。 {我的NAT},但这只会导致无法访问我的S3配置存储桶。

非常感谢任何帮助!

编辑:要清楚我已阅读文档,我遇到的问题是我的Lambdas和RDS共享的安全组与它们关联的子网之间的关系。

当我将lambda配置为我的RDS实例所在的安全组的一部分时,我需要将它与至少2个子网相关联......那些应该是新的子网,而不是与我的RDS实例关联的子网吗? AKA是否需要与RDS共享一个子网才能访问它?

2 个答案:

答案 0 :(得分:1)

如果Lambda函数只需要访问VPC资源和S3,那么配置它的最简单方法是向您的VPC添加S3 Endpoint。如果您的Lambda函数需要访问VPC资源以及除S3和DynamoDB之外的其他资源(目前仅支持VPC端点的2个服务),那么您的Lambda函数必须位于具有NAT网关的私有子网中。

公有子网中的实例可以选择使用公共IP地址,但这不是必需的。 VPC中的Lambda函数永远不会获得公共IP地址,这就是为什么在VPC内部的Lambda函数必须位于具有NAT网关的私有子网中才能访问Internet。

Lambda函数获得公共IP的唯一时间是它们根本不在VPC中。在那种情况下,他们可以访问除VPC中的资源之外的任何内容。

关于“相同安全组”注释的说明:位于同一安全组中不允许资源相互访问。 Lambda函数需要位于RDS安全组授予访问权限的安全组中。关于子网,Lambda只需要位于同一VPC中的任何子网中,它不需要与RDS实例位于同一子网中。

答案 1 :(得分:-1)

您需要将Lambda函数分配给具有NAT网关或NAT实例的私有子网。

如果子网具有Internet网关,则子网称为“公共”,子网内的实例可以具有公共IP地址。如果子网具有NAT网关或NAT实例,则称为“私有”子网,子网内的实例只能拥有专用IP地址。

如果您没有可用的子网,请在VPC中添加一个子网,然后添加NAT网关,调整子网的路由表等。

本文档将帮助您了解VPC访问如何为Lambda函数工作。

Configuring a Lambda Function to Access Resources in an Amazon VPC