【问题标题】:AWS lambda function get timeout without any error message When it connect S3 SDK sometimesAWS lambda函数有时会在连接S3 SDK时超时而没有任何错误消息
【发布时间】:2020-11-19 21:10:29
【问题描述】:

AWS lambda 函数有时会在连接 S3 SDK 时超时,没有任何错误消息。

  1. 当尝试 S3.getObject() 时,Lambda 函数停止直到超时,没有任何错误消息。
  2. 只是有时,即使我使用相同的参数、相同的代码,也会发生这种情况。
  3. 我已经使用了 try catch 代码。如果有问题,代码会产生错误消息,但是,它不是。

关键是 lambda 函数“有时”会产生问题。 通常,它运作良好。但是,它突然停止了。

请帮我解决这个问题

enter image description here

enter image description here

enter image description here

2020-07-30T16:45:22.003+09:00
START RequestId: 2c1dcd43-41f6-5d95-a862-9adf3d267ecf Version: $LATEST

2020-07-30T16:45:22.009+09:00
2020-07-30T07:45:22.009Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO fileKeys : [ '701bcf80-ed63-46d4-9524-d38a14a74fe0.dwg' ]

2020-07-30T16:45:22.009+09:00
2020-07-30T07:45:22.009Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO getObject drawingFile 701bcf80-ed63-46d4-9524-d38a14a74fe0.dwg

2020-07-30T16:45:22.019+09:00
2020-07-30T07:45:22.018Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO before getObject

2020-07-30T16:45:22.020+09:00
2020-07-30T07:45:22.020Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO before createReadStream

2020-07-30T16:45:22.021+09:00
2020-07-30T07:45:22.021Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf INFO before pipe

2020-07-30T16:45:52.032+09:00
END RequestId: 2c1dcd43-41f6-5d95-a862-9adf3d267ecf

2020-07-30T16:45:52.032+09:00
REPORT RequestId: 2c1dcd43-41f6-5d95-a862-9adf3d267ecf Duration: 30027.38 ms Billed Duration: 30000 ms Memory Size: 3008 MB Max Memory Used: 31 MB

2020-07-30T16:45:52.032+09:00
2020-07-30T07:45:52.032Z 2c1dcd43-41f6-5d95-a862-9adf3d267ecf Task timed out after 30.03 seconds

这里是代码

exports.getObject = async (type, fileKey) => {
  try {
    const config = env[type]();
    const s3 = new AWS.S3();
    return new Promise((resolve, reject) => {
      const fileName = `/tmp/${fileKey}`;
      const fileStream = fs.createWriteStream(fileName, 'binary');
      const s3Stream = s3
        .getObject({
          Bucket: config.origin,
          Key: fileKey,
        })
        .createReadStream();

      s3Stream
        .on('error', function (err) {
          console.error('s3Stream  : ', err);
          fileStream.end();
          reject(err);
        })
        .on('data', (data) => {
          // console.log('data stream...');
        })
        .on('end', () => {
          console.log('s3Stream read end');
        });

      fileStream
        .on('error', function (err) {
          console.error('fileStream  : ', err);
          fileStream.end();
          reject(err);
        })
        .on('close', function () {
          console.log('fileStream Done.');
          resolve('success');
        });

      s3Stream.pipe(fileStream)
        .on('error', function (err) {
          console.error('File Stream:', err);
          reject(err);
        })
        .on('close', function () {
          console.log('Pipe Done.');
        });;
    });
  } catch (error) {
    throw (error);
  }
};

【问题讨论】:

  • 能否请您将错误和代码作为文本而不是屏幕截图?
  • Lambda 函数是否连接到 VPC?如果是这样,为什么会做出这个决定?此外,如果它连接到 VPC,Lambda 函数是连接到多个子网,还是只连接一个?这些子网是“私有子网”、“公共子网”还是两者的混合?
  • @Marcin 我刚刚添加了它们
  • @JohnRotenstein 是的 Lambda 连接到 VPC 和 4 个子网和混合。
  • 所以 lambda 函数只是有时不起作用? VPC 中的 lambda 没有互联网连接。你如何使它有时工作,或不工作?

标签: javascript node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

听起来您的 Lambda 函数连接到私有子网和公共子网的混合体。

调用 AWS 服务时,需要访问 Internet。这可以通过以下方式获得:

  • 将 Lambda 函数连接到 私有子网 并在公有子网中有一个 NAT 网关,私有子网的路由表将发往 0.0.0.0/0 的流量发送到 NAT 网关,
  • 在 VPC 中使用 VPC 终端节点以允许直接连接到 AWS 服务

如果 Lambda 函数连接到 公共子网,它将无法使用 NAT 网关。这将导致与 AWS 的连接超时。随机行为可能与 Lambda 函数使用的子网有关。

【讨论】:

  • 感谢您的回答!我会尝试然后我会告诉你结果:)
猜你喜欢
  • 2021-10-17
  • 2017-10-05
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多