簡體   English   中英

AWS lambda function 在連接 S3 時有時會超時,沒有任何錯誤消息

[英]AWS lambda function get timeout without any error message When it connect S3 SDK sometimes

AWS lambda function 有時在連接 S3 SDK 時超時,沒有任何錯誤消息。

  1. 當嘗試 S3.getObject(),Lambda function 停止直到超時,沒有任何錯誤消息。
  2. 只有有時,即使我使用相同的參數、相同的代碼,我也會發生這種情況。
  3. 我已經使用了 try catch 代碼。 如果有問題,代碼會產生錯誤消息但是,它不是。

關鍵是 lambda function “有時”會出現問題。 通常,它運作良好。 但是,它突然停止了。

請幫我解決這個問題

在此處輸入圖像描述

在此處輸入圖像描述

在此處輸入圖像描述

 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 function 連接到私有子網和公共子網的混合。

調用 AWS 服務時,需要訪問 Internet。 這可以通過以下方式獲得:

  • 將 Lambda function 連接到私有子網並在公共子網中有一個 NAT 網關,私有子網的路由表將發往0.0.0.0/0的流量發送到 NAT 網關,或者
  • 在 VPC 中使用 VPC 終端節點以允許直接連接到 AWS 服務

如果 Lambda function 連接到公共子網,它將無法使用 NAT 網關。 這將導致與 AWS 的連接超時。 隨機行為可能與 Lambda function 正在使用的子網有關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM