【问题标题】:http.get from async lambda timeout trying to reach public EC2http.get 从异步 lambda 超时尝试访问公共 EC2
【发布时间】:2019-08-14 13:39:27
【问题描述】:

我试图弄清楚我在这种情况下缺少什么。

我有一个运行两个 docker 容器的 EC2。一个是python REST api,另一个包含重定向到python服务器的nginx。

从浏览器或邮递员向我的 /test 端点发送 GET 请求会返回预期值。

我尝试从 AWS Lambda 访问相同的公共 URL,但请求超时。

这是我目前的情况

  • EC2 url 是公开的,可以从我的浏览器访问。
  • Lambda 可以成功访问 www.google.com。
  • Lambda 无法访问 EC2 url。
  • Lambda 没有 VPC。
  • Lambda 位于 API 网关 (websocket) 后面。
  • 尝试了较高的超时值(30 秒以上)。

问题可能源于我对 AWS 环境缺乏了解。任何人都可以在下面的代码中看到问题吗?

const AWS = require('aws-sdk');
require('./patch.js');
var http = require('http');

function test(url){
  return new Promise((resolve, reject) => {
    const req = http.request(url,
      (res) => {
        let body = '';
        res.on('data', (chunk) => (body += chunk.toString()));
        res.on('error', reject);
        res.on('end', () => {
          if (res.statusCode >= 200 && res.statusCode <= 299) {

            resolve({statusCode: res.statusCode, headers: res.headers, body: body});
          } else {
            reject('Request failed. status: ' + res.statusCode + ', body: ' + body);
          }
        });
      });
    req.on('error', reject);
    req.write('', 'binary');
    req.end();
  });
}


exports.handler = async(event) => {  
  let googleUrl = "http://www.google.com";
  let ec2Url = "XXXXX"; // Public EC2 url

  await test(googleUrl).then(function(res){
        console.log("Response",res); // This is logged 
    });

  await test(ec2Url).then(function(res){
        console.log("Response",res); // This is never logged. Timeout kicked in.
    });
  return {};
};

【问题讨论】:

  • 增加您的 Lambda 函数超时,以便您得到一个真正的错误 - 而不是环境强加的超时。
  • 将 Lambda 超时时间增加到 >130 秒会导致“连接 ETIMEDOUT”错误。

标签: javascript amazon-web-services amazon-ec2 aws-lambda


【解决方案1】:

原来我在编辑后没有保存安全组。 如果遇到类似问题,请检查您的安全组入站规则。

【讨论】: