Nodejs AWS - получить xml файл из S3 и опубликовать sh содержимое в sns - PullRequest
0 голосов
/ 20 июня 2020

Я новичок ie на nodejs. Я пытаюсь создать лямбда-функцию для извлечения файла xml из ведра S3 и публикации sh каждой записи файла xml в sns с форматом json.

Он все еще не работает . В журнале я не вижу ответа или ошибки функции publishTextPromise. Я пробовал образец кода для публикации сообщения в sns topi c, и он работает нормально. Значит, разрешения для моей лямбды и sns должны быть правильными.

Может ли кто-нибудь указать, в чем проблема? Большое спасибо!

журнал

INFO sending info to SQS
INFO before sending

код

// eslint-disable-next-line import/no-unresolved
const aws = require('aws-sdk');

const s3 = new aws.S3({ apiVersion: '2006-03-01' });


// Set region  ---not sure if we need that
//AWS.config.update({region: 'REGION'});

const convertXML = (s3Xml) => {
    // eslint-disable-next-line global-require
    const { parseString } = require('xml2js');
    parseString(s3Xml, (_err, result) => {

        result.infofield.info.forEach((xmlRecord) => {

        publishMessage(xmlEntry);

        });
    });
};



// promise
var publishMessage =(messageContent) => {
    console.log('sending info to SQS');
   // console.log(JSON.stringify(messageContent, null, 4));

        aws.config.update({region: 'ap-southeast-2'});
        // Create publish parameters
        var params = {
            Message: JSON.stringify(messageContent), /* required */
            TopicArn: 'arn:aws:sns:ap-southeast-2:xxxxxxxxxxxxxxxxxx' 
        };
    
        console.log("before sending");
        try{
            // Create promise and SNS service object
            var publishTextPromise = new aws.SNS({apiVersion: '2010-03-31'}).publish(params).promise();
        
            // Handle promise's fulfilled/rejected states
            publishTextPromise.then(
                function(data) {
                    console.log(`Message ${params.Message} send sent to the topic ${params.TopicArn}`);
                    console.log("MessageID is " + data.MessageId);
                }).catch(
                    function(err) {
                    console.error(err, err.stack);
                });
        } catch (err) {
            console.log(err);
        }
        console.log("after sending");

}



/**
 * Main Handler
 */
exports.handler = async (event)  => {
    console.log('Received event:', JSON.stringify(event, null, 2));

    // Get the object from the event and show its content type
    const bucket = event.Records[0].s3.bucket.name;
    const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    const params = {
        Bucket: bucket,
        Key: key,
    };
    try {
        const data = await s3.getObject(params).promise();

        const s3Xml = data.Body.toString('utf-8');
        console.log('s3Xml:', s3Xml);

        convertXML(s3Xml);

        return s3Xml;
    } catch (err) {
        console.log(err);
        const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
        console.log(message);
        throw new Error(message);
    }
};
...