AWS Lambda连接到Internet

giò*_*giò 7 java amazon-web-services node.js aws-lambda

TL; TR

我正在尝试从AWS Lambda连接到Internet,我有一个带NAT网关的私有子网,但该功能仍无法连接到Internet ...

完整问题

因此,我尝试使用我的AWS Lambda函数访问互联网。我已经尝试过Java和NodeJS 4,但都没有碰运气。

我有一个带有子网的私有VPC:10.0.10.0/24

在此处输入图片说明

如您所见,我已经在NAT网关中添加了一条规则:

在此处输入图片说明

我将AWS Lambda配置如下:

在此处输入图片说明

选择该子网(10.0.10.0)并使用对所有内容(入站和出站)都开放的安全组

但是,当我尝试从Internet下载某些内容时,lambda超时了:

'use strict';
console.log('Loading function');

var http = require("http");

exports.handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('value1 =', event.key1);
    console.log('value2 =', event.key2);
    console.log('value3 =', event.key3);

    var options = {
      host: 'www.virgilio.it',
      port: 80,
      path: '/'
    };

    http.get(options, function(res) {
      console.log("Got response: " + res.statusCode);
    }).on('error', function(e) {
      console.log("Got error: " + e.message);
    });

    callback(null, event.key1);  // Echo back the first key value
    // callback('Something went wrong');
};
Run Code Online (Sandbox Code Playgroud)

{“ errorMessage”:“ 2016-05-10T10:11:46.936Z 79968883-1697-11e6-9e17-1f46a366f324任务在55.00秒后超时”}

这是错误吗?

注意:如果我不选择我的VPC,同样的功能也可以工作

Phi*_*ana 9

默认情况下,lambda函数未绑定到VPC,这使它能够访问Internet,但是阻止其访问VPC中的资源,例如RDS实例。

如果将lambda附加到VPC,则会失去Internet访问权限,这将阻止您访问S3和Dynamo之类的资源以及发出HTTP请求。

如果两者都需要,那么我将不得不设置VPC进行互联网访问(这很麻烦(AWS伙计们,如果您有一个定义明确的流程,请简化一下):将其变成复选框或按钮;)

创建一个新的VPC

我发现最好不要使用默认VPC,这样您就不会冒险破坏该VPC中已经在工作的某些东西(如果您那里已有资源),并且还因为可以使用默认VPC作为配置参考在将来。

使用向导创建VPC。

在此处输入图片说明

创建路由表

  1. 命名第一个public-subnet(如果尚未命名);
  2. 命名第二个private-lambda。AWS支持建议仅为lambda使用一个单独的子网,并且此路由表将附加到该子网。

在此处输入图片说明

创建子网

默认情况下,创建VPC时,它将为您创建一个公共子网。如果使用默认值,则其名称应为Public subnet。留在那。

现在,您将创建专用子网。如果您希望Lambda具有高可用性,建议为它拥有多个专用子网。

这些专用子网中的每一个都将链接到您刚创建的VPC。现在,假设您将VPC IP保留为10.0.0.0/16,并且您在Virginia(us-east-1)中运行资源,以下是用于创建六个私有子网的模板,每个私有子网都位于不同的可用性区域(用于高可用性):

  1. private-lambda-us-east-1a,可用区us-east-1a,IP块10.0.16.0/24
  2. private-lambda-us-east-1b,可用区us-east-1b,IP块10.0.32.0/24
  3. private-lambda-us-east-1c,可用区us-east-1c,IP块10.0.48.0/24
  4. private-lambda-us-east-1d,可用区us-east-1d,IP块10.0.64.0/24
  5. private-lambda-us-east-1e,可用区us-east-1e,IP块10.0.80.0/24
  6. private-lambda-us-east-1f,可用区us-east-1f,IP块10.0.92.0/24

但是您可以看到模式:-IP块的第3个位置增加了16;-名称表示您所在地区的所选可用区域。

在此处输入图片说明

确保路由表与子网关联

  • 转到“路由表”面板;
  • 选择public-subnet表,查看其关联并确保它与Public Subnet相关;
  • 选择private-lambda表,查看其关联,并确保它与private-lambda-*您刚创建的所有子网都关联。

在此处输入图片说明

创建一个互联网网关

只需创建一个并将其附加到VPC。

配置公共子网的路由

就我而言,它已经配置好了,但是只要确保您的公共子网的路由表中有一个0.0.0.0/0刚创建的Internet网关的条目即可。

在此处输入图片说明

创建一个NAT(网络地址转换器)

创建一个新的NAT并选择您的公共子网。分配新的EIP。

配置专用子网的路由

确保专用子网的路由表具有0.0.0.0/0新NAT 的条目。

在此处输入图片说明

通过这些步骤,您现在应该拥有一个启用Internet的VPC。


用例:为Internet和RDS访问配置Lambda

为lambda创建一个安全组

  • 新建一个SG,并配置Outbound-> All Trafic-> to 0.0.0.0/0::/0

修改您的RDS实例的安全组以允许

  • 入站->所有交通->来自lambda SG

配置lambda

  • 创建一个新的lambda或选择一个现有的lambda;
  • 选择新的VPC;
  • 选择所有专用子网(private-lambda-*)以实现高可用性;
  • 选择您的lambda安全组。

就是这样。现在,您应该具有可以访问VPC和Internet资源的lambda函数:)

  • 我花了几个小时才弄清楚,非常感谢 (2认同)

giò*_*giò 7

我发现了错误,应将NAT网关添加到公共子网(而不是私有子网)。
公共子网是与Internet网关路由相关联的子网0.0.0.0/0


Ani*_*kur 6

由于我遇到了同样的问题,因此上述答案更加清晰 -

  1. 将 NAT 网关或 NAT 实例添加到公共子网(0.0.0.0/0在相应的(公共)子网路由表中具有 Internet 网关条目的那个 )
  2. 编辑私有子网(您运行 lambda 的地方)的路由表,0.0.0.0/0以便在公共子网中有一个NAT 网关的条目。
  3. 确保分配给 lambda 的安全组允许出站连接。