【问题标题】:AWS Lambda in public subnet cannot access the internet公共子网中的 AWS Lambda 无法访问互联网
【发布时间】:2020-05-24 02:54:22
【问题描述】:

我正在尝试让 Lambda 在公共子网中运行以与 Internet 通信。我可以让 Lambda 在没有 VPC 的情况下访问 www.google.com(文档说在后台运行一个),但如果我在 VPC 中运行 Lambda,则不能。

复制步骤:

  1. 使用以下代码创建 Lambda (Node.js 12x)。我将 Lambda 命名为“curlGoogle”。
  2. 运行它以验证它是否成功并且可以从 www.google.com 获取。不应指定 VPC。
  3. 转到 VPC 仪表板并使用 VPC 向导创建具有公共子网的 VPC。我尝试了 IPv4 CIDR 块(例如 10.1.0.0/16)、IPv6 CIDR 块、AZ 的视图​​值。我通常将“启用 DNS 主机名”保留为是。
  4. 更改 Lambda 以使用新创建的 VPC、子网和安全组。
  5. 验证这不会到达 Google 并超时。

我已尝试修改此方法,但没有任何成功(例如,实际上将子网与 vpc 关联,放松安全组和网络 ACL 上的所有设置)。

我最初尝试关注一份公开和一份私人文档,但未能成功。

有什么想法吗?谢谢! - 丹

const http = require('http');

exports.handler = async (event) => {
    return httprequest().then((data) => {
        const response = {
            statusCode: 200,
            body: JSON.stringify(data),
        };
    return response;
    });
};
function httprequest() {
     return new Promise((resolve, reject) => {
        const options = {
            host: 'www.google.com',
            path: '/',
            port: 80,
            method: 'GET'
        };
        const req = http.request(options, (res) => {
          if (res.statusCode < 200 || res.statusCode >= 300) {
                return reject(new Error('statusCode=' + res.statusCode));
            }
            var body = [];
            res.on('data', function(chunk) {
                body.push(chunk);
            });
            res.on('end', function() {
                try {
                    body = Buffer.concat(body).toString();
                } catch(e) {
                    reject(e);
                }
                resolve(body);
            });
        });
        req.on('error', (e) => {
          reject(e.message);
        });
        // send the request
       req.end();
    });
}

【问题讨论】:

  • 您的 VPC 是否有 NAT 网关?
  • 在其中一种配置中。我在对 Mark B 的回复中描述了这一点。

标签: amazon-web-services aws-lambda amazon-vpc


【解决方案1】:

AWS Lambda 函数在 VPC 中时永远不会分配公有 IP 地址,即使它们位于公有子网中也是如此。因此,在 VPC 中运行时,他们永远无法直接访问 Internet。您必须将 Lambda 函数放置在具有到 NAT 网关的路由的私有子网中,以便让它们从您的 VPC 内访问 Internet。

【讨论】:

  • 我之前尝试过(现在又尝试了一次)。当前设置:具有 2 个子网(一个公共子网和一个私有子网)的 VPC。公共子集中的 NAT 网关。我有一个互联网网关。公共子网路由器表点具有指向 Internet 网关的 0.0.0.0/0 条目。私有子网路由器表有一个指向 NAT 网关的 0.0.0.0/0 条目。根据我找到的文档,我尝试了一些变体。例如。一对夫妇说将 NAT 网关放在私有子网中。 NAT 网关永远不会从 Lambda 获得任何流量。
  • NAT 网关必须在公共子网中,否则它没有通往 Internet 网关的路由。如果 VPC 配置正确,如您在评论中所述,那么阻止 Lambda 的 Internet 请求通过 NAT 的唯一方法是安全组或 NACL 规则,但您说您打开了所有这些规则?
  • 很奇怪。所以我等了一天,我的 VPC 向导公有+私有子网配置开始工作。我不知道这有什么问题,但是延迟使调试变得困难。我会继续并将其标记为正确答案。
猜你喜欢
  • 2019-12-06
  • 2020-02-07
  • 1970-01-01
  • 2021-01-09
  • 2020-01-04
  • 2019-02-08
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
相关资源
最近更新 更多