首页 文章

AWS Lambda连接到Internet

提问于
浏览
4

TL; TR

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

完整问题

所以我试图通过我的AWS Lambda函数访问互联网 . 我已经尝试过Java和NodeJS 4而没有运气 .

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

enter image description here

如您所见,我已将规则添加到NAT网关:

enter image description here

我将AWS Lambda配置为:

enter image description here

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

但是当我尝试从互联网上下载内容时,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');
};

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

这是一个错误吗?

Note: the same function works If I don't select my VPC

3 回答

  • 4

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

  • 4

    由于我遇到同样的问题,为上述答案增加了一点清晰度 -

    • 将NAT网关或NAT实例添加到公有子网(在相应的(公共)子网路由表中具有到Internet网关的 0.0.0.0/0 条目的子网)

    • 编辑私有子网(运行lambda的路径)的路由表,以便为公共子网中的NAT网关提供 0.0.0.0/0 的条目 .

    • 确保分配给lambda的安全组允许出站连接 .

  • 2

    默认情况下,lambda函数不限于VPC,这使其能够访问Internet,但阻止它访问VPC中的资源,例如RDS实例 .

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

    如果你需要两者,那么我将不得不设置VPC进行互联网访问,这是一个烂摊子(嘿,如果你有一个明确定义的流程的AWS人员,请把它变得简单:把它变成一个复选框或按钮;)

    Create a new VPC

    我发现最好不要单独使用默认的VPC,这样你就不会冒险破坏已经在VPC中运行的东西(如果你已经有资源),还因为你可以使用默认的VPC作为配置参考在将来 .

    使用向导创建VPC .

    enter image description here

    Create the Route Tables

    • 将第一个 public-subnet 命名(如果它尚未存在);

    • 将第二个 private-lambda 命名为 . AWS支持建议仅为lambda使用单独的子网,并将此路由表附加到该子网 .

    enter image description here

    Create the subnets

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

    现在您要创建私有子网 . 如果您希望Lambda具有高可用性,建议您为Lambda使用多个私有子网 .

    每个私有子网都将链接到您刚刚创建的VPC . 现在,假设您将VPC IP保留为 10.0.0.0/16 ,并且您在弗吉尼亚州运行资源( us-east-1 ),这里有一个模板,用于创建六个私有子网,每个子网位于不同的可用区(为了高可用性):

    • private-lambda-us-east-1a ,可用区 us-east-1a ,IP块 10.0.16.0/24

    • private-lambda-us-east-1b ,可用区 us-east-1b ,IP块 10.0.32.0/24

    • private-lambda-us-east-1c ,可用区 us-east-1c ,IP块 10.0.48.0/24

    • private-lambda-us-east-1d ,可用区 us-east-1d ,IP块 10.0.64.0/24

    • private-lambda-us-east-1e ,可用区 us-east-1e ,IP块 10.0.80.0/24

    • private-lambda-us-east-1f ,可用区 us-east-1f ,IP块 10.0.92.0/24

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

    enter image description here

    Ensure Route Table vs Subnet associations

    • 转到路线表面板;

    • 选择公共子网表,查看其关联并确保它与公共子网关联;

    • 选择private-lambda表,查看其关联并确保它与您刚刚创建的所有 private-lambda-* 子网相关联 .

    enter image description here

    Create an Internet Gateway

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

    Configure the routes for the Public Subnet

    在我的情况下,它已配置,但只需确保您的公共子网的路由表有一个从 0.0.0.0/0 到您刚刚创建的Internet网关的条目 .

    enter image description here

    Create a NAT (network address translator)

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

    Configure the routes for the Private Subnets

    确保私有子网的路由表具有从 0.0.0.0/0 到新NAT的条目 .

    enter image description here

    通过这些步骤,您现在应该拥有支持Internet的VPC .


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

    Create a Security Group for the lambda

    • 新建SG并配置出站 - >所有交通 - >到 0.0.0.0/0::/0

    Modify the Security Group of your RDS instance to allow

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

    Configure the lambda

    • 创建一个新的lambda或选择一个现有的lambda;

    • 选择新的VPC;

    • 选择所有私有子网( private-lambda-* )以获得高可用性;

    • 选择您的lambda安全组 .

    就是这样 . 你现在应该有一个lambda函数,可以访问VPC和Internet资源:)

相关问题