【问题标题】:Uploading files to AWS S3 using Lambda is not working使用 Lambda 将文件上传到 AWS S3 不起作用
【发布时间】:2021-02-20 04:00:41
【问题描述】:

我正在尝试使用 lambda 将文件上传到 S3。 该代码是关于从网络上抓取数据并制作 CSV 文件。

原始代码(没有 AWS,只需抓取并创建 CSV)经过测试并且工作正常。 所以我稍微修改了它以使用 lambda 和 s3。

我创建了 S3 存储桶。 我制作了 lambda 层。 我做了 IAM 角色。(AmazonS3FullAccess) 我将它附加到 lambda。

我想我做了我需要的一切。当我单击测试按钮时,会打印“成功”。 但是,当我检查我的 S3 存储桶时,什么都没有。

有什么我错过的吗?谢谢。

这是我的 lambda 代码。

const request = require('request');
const Iconv = require('iconv').Iconv;
const cheerio = require('cheerio');
const ObjectsToCsv = require('objects-to-csv');

const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const today = new Date;
const date_string = `${today.getMonth()}/${today.getDate()}`;
const BUCKET_NAME = 'naverfinance';

exports.handler = async (event) => {
  
    class Stock {
      constructor(
        name, rank, price, change_inValue, change_inPercent, updown) {
        this.name = name;
        this.rank = rank;
        this.price = price;
        this.change_inValue = change_inValue;
        this.change_inPercent = change_inPercent;
        this.updown = updown;
      }
    }
    
    
    request({ url: 'https://finance.naver.com/sise/sise_quant.nhn', encoding: null }, function(response, body) {

        const euckr_to_utf8 = new Iconv('euc-kr', 'utf8');
        const koreanHTML = euckr_to_utf8.convert(body).toString();
        const $ = cheerio.load(koreanHTML);
        
        let name, rank, price, change_inValue, change_inPercent, updown;
    
        const table = $('.type_2').children('tbody').children('tr'); 
        //3번쨰부터 5개, 빈라인 3개, 이렇게 해서 종목 100개
        
        for(let i = 1; i < table.length; ++i) {
            const tr = table[i];
            if(tr.children.length === 1) {
                continue;
            }
            
            const tds =  tr.children;
            for(let j = 0; j < tds.length; ++j) {
                const td = tds[j];
                if(td.type == 'text') {
                    continue;
                }
                
                const td_data = td.children;            
        
                if(j == 1) {
                    rank = td_data[0].data;
                }
                
                else if(j == 3) {
                    name = td_data[0].children[0].data;
                }
                
                else if(j == 5) {
                    price = parseInt(td_data[0].data.replace(/[,]/g,''));
                }
                
                else if(j == 7) {       
                    let data = 0;
                    
                    if(td_data[2].children != undefined) {
                        data = parseInt(td_data[2].children[0].data.replace(/[\n\t,]/g,''));
                    }
    
                    change_inValue = data;
    
                }
                
                else if(j == 9) {
                    change_inPercent = td_data[1].children[0].data.replace(/[\n\t%]/g,'');
                    
                    if (change_inPercent.indexOf('.') !== -1) { //소수
                        change_inPercent = parseFloat(change_inPercent.replace(/,/g,''));
                    }
                
                    else { //정수
                        change_inPercent = parseInt(change_inPercent.replace(/,/g,''));
                    }
                    
                    if(change_inPercent < 0) {
                        updown = '하락';
                        change_inValue = -change_inValue;
                    }
                    else if(change_inPercent > 0) {
                        updown = '상승';
                        change_inValue = change_inValue;
                    }
                    else {
                        updown = '그대로';
                        change_inValue = 0;
                    }               
                    const stock = new Stock(
                        name, rank, price, change_inValue, change_inPercent, updown);
                    
                    s3.putObject({
                      Bucket: BUCKET_NAME,
                      Key: date_string,
                      ContentType: 'text/plain',
                      Body : 'test' //new ObjectsToCsv(stock).toString()
                    })
                }
            }
        }
    });
};

移除异步之后。

Response:
{
  "errorType": "Error",
  "errorMessage": "Bad argument.",
  "trace": [
    "Error: Bad argument.",
    "    at convert (/opt/nodejs/node_modules/iconv/index.js:103:11)",
    "    at Iconv.convert (/opt/nodejs/node_modules/iconv/index.js:63:12)",
    "    at Request._callback (/var/task/index.js:28:42)",
    "    at Request.self.callback (/opt/nodejs/node_modules/request/request.js:185:22)",
    "    at Request.emit (events.js:315:20)",
    "    at Request.EventEmitter.emit (domain.js:482:12)",
    "    at Request.<anonymous> (/opt/nodejs/node_modules/request/request.js:1154:10)",
    "    at Request.emit (events.js:315:20)",
    "    at Request.EventEmitter.emit (domain.js:482:12)",
    "    at IncomingMessage.<anonymous> (/opt/nodejs/node_modules/request/request.js:1076:12)"
  ]
}

【问题讨论】:

  • 您能否添加任何调试 (console.log) 行来检查它是否正在运行,这也是一个异步 Lambda 函数,因此它可能不会等待请求完成
  • @ChrisWilliams 你是对的。我在请求之前、之后和请求中都放置了 console.log("ok")。当 console.log 在请求中时,不会打印 ok。我能做些什么?我尝试删除异步(错误说错误的参数)并将等待放在请求前面(成功但在 s3 没有。)
  • 这可能是函数的异步部分,将exports.handler = async (event)改为exports.handler = (event)
  • @ChrisWilliams 感谢您的帮助。但是改成exports.handler = (event)后,我得到了错误信息。我把它放在原始问题帖子上,因为它太长了。

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


【解决方案1】:

我认为因为您使用的是异步处理程序,所以您需要返回某种响应或承诺

https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2020-04-02
    • 2021-08-22
    • 2019-07-09
    • 2017-10-26
    • 2020-04-29
    相关资源
    最近更新 更多