AWS Lambda:如何为具有VPC访问权限的lambda函数设置NAT网关

时间:2016-02-17 11:22:29

标签: amazon-web-services aws-lambda

根据this document,如果我需要通过VPC访问从我的Lambda函数访问互联网资源,我需要设置NAT网关。

所以我跟着this guide设置了NAT网关。但是,在我需要编辑子网的路由表以添加目的地:0.0.0.0/0和目标作为我的NAT网关ID的条目时,我收到错误

     $scope.remove = function(_id,rindex) {     
        alert('Are you sure you want to delete?');
        $http({
            url: 'http://localhost:7200/api/manage-product',
            method: 'POST',
            data:{productId: _id}, 
        }).success(function(res) {
            console.log('another success');
        }, function(error) {
            console.log(error);
            alert('here');
        });
    }

我检查并注意到,对于现有条目,目标是我的VPC的互联网网关。如果我用NAT网关ID替换该条目,我无法通过SSH从外部访问该VPC中的任何EC2实例。如何实现此VPC中所有EC2实例的情况

  • 只能通过SSH访问,其余流量被阻止
  • 能够完全访问同一VPC中的其他EC2实例
  • 有权访问此VPC的Lambda函数可以访问SQS和Kinesis等外部资源。

6 个答案:

答案 0 :(得分:30)

我找到了一个很好的详细教程,介绍如何让lambda连接到VPC资源和互联网:https://gist.github.com/reggi/dc5f2620b7b4f515e68e46255ac042a7

快速浏览:

  • 为lambda设置新的子网(CIDR与现有子网不重叠)。你需要:
    • 一个子网,它将指向NAT使用的Internet网关(IGW)(我们称之为A)
    • 几个指向你的lambda(B,C和D)使用的NAT
  • 添加NAT网关:将子网设置为A
  • 将lambda VPC子网设置为B,C和D
  • 创建2个路由表:
    • 指向您的目的地为0.0.0.0/0
    • 的NAT
    • 指向IGW(应该已存在)且目标为0.0.0.0/0
    • 的文件
  • 更新子网A以使用指向IGW的路由表
  • 更新子网B,C和D以使用指向NAT的路由表

希望这有帮助。

答案 1 :(得分:26)

您需要IGW和NAT网关才能实现此目的。

在公共子网(您希望从外部访问的子网)中,将0.0.0.0/0流量指向IGW网关。 NAT网关本身需要位于其中一个公共子网中。

在要将NAT指向的私有子网中指向0.083.0/0的NAT网关弹性网络接口。

如果0.0.0.0/0已经绑定到网关,则需要将其删除并添加指向NAT网关。

请参阅: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html

答案 2 :(得分:9)

您需要两个不同的子网。听起来好像你只有一个。

Lambda只能在VPC中使用私有子网。

私有子网的定义:默认路由是NAT实例(大多数位于不同的公有子网上)或NAT网关,并且子网中的 no 计算机具有公共IP地址。在私有子网上允许使用具有公共IP地址的计算机,但在大多数情况下,它们将无法正常工作,因为这在技术上是错误配置。

公有子网的定义:默认路由是=IF(B2=B1,A1+1,1) Internet网关对象,并且计算机分配了公共IP地址。公共子网上允许没有公共IP地址的计算机,但它们将无法访问Internet,因为这是一个配置错误。

听起来您正试图通过更改默认路由将现有子网从公共更改为私有。正如所料,这打破了其他事情。

另见Why do we need private subnet in VPC?

答案 3 :(得分:0)

嗨,我开发了一个分步教程,其中包含有关它的明确屏幕截图:

第一部分

  1. 在AWS中创建lambda函数
  2. 创建一个API网关以将所有请求重定向到您的AWS Lambda函数 https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step-by-ec7ce38e18be

第二部分

  1. 为lambda函数配置VPC
  2. 以安全的方式允许互联网访问lambda功能
  3. 将Node.js Restful API部署到Lambda函数中 https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step-by-8ff6cc97780f

答案 4 :(得分:0)

要在VPC和互联网访问中使用Lambda:

我相信,您中的大多数人已经拥有了IGW,即您正在VPC内部并与Internet一起工作,因此无需创建新的IGW。

步骤对我有用:

  1. 在主VPC下创建一个新的子网(建议2个或更多)。给它加上一个带有掩码的新CIDR,您会认为这将是Lambda中使用的网络接口的数量。(我做了X.X.X.X / 28,因为对我们来说足够了)

  2. 创建NAT网关,将其添加到弹性IP或创建新的EIP并将其添加到VPC下的主子网中。 (请记住,如果您已经有Internet Gateway,它将可以正常工作)

  3. 创建路由表,并将0.0.0.0/0路由添加到我们已创建的目标-Nat网关ID(nat-xxxxxxxxxxxxxxxxxxxx)(第2步)

  4. 为您的lambda创建新的安全组(从ALL到ALL)以与Internet一起使用。我相信向互联网的lambda添加0.0.0.0/0是安全的。

  5. 打开lambda-选择您的VPC,添加您正在使用的SG,然后添加从步骤4创建的新版本以使用Internet。按保存并测试。

答案 5 :(得分:-1)