Passing file in S3 to function Lambda

0

I was wondering if anyone could help me with this issue. Basically, I'm using the library kml2geojson to convert a .KML file to .geoJSON in Python. The kml2geojson library has a function called kml2geojson.main.convert(filepath, directorypath) which takes the .KML file that needs to be converted and the directory it should put the new .geoJSON file.

I can do this fine in my machine, but I'm not sure how I'd do that using Lambda and S3. Suppose the name of the file in the S3 bucket is test.kml and the name of the bucket is bucketkmltest. How would I write the file path and the directory path (bucket path) in the function parameters?

Many thanks in advance,

Gabriel

Edited by: GabrielP on Dec 12, 2020 12:02 AM

Edited by: GabrielP on Dec 12, 2020 12:15 AM

asked 3 years ago528 views
1 Answer
0

Here’s some example code showing get and put from S3 in Lambda

// dependencies
const AWS = require('aws-sdk');
const util = require('util');
const sharp = require('sharp');

// get reference to S3 client
const s3 = new AWS.S3();

exports.handler = async (event, context, callback) => {

// Read options from the event parameter.  
console.log("Reading options from event:\n", util.inspect(event, {depth: 5}));  
const srcBucket = event.Records\[0].s3.bucket.name;  
// Object key may have spaces or unicode non-ASCII characters.  
const srcKey    = decodeURIComponent(event.Records\[0].s3.object.key.replace(/\+/g, " "));  
const dstBucket = srcBucket + "-resized";  
const dstKey    = "resized-" + srcKey;  

// Infer the image type from the file suffix.  
const typeMatch = srcKey.match(/\.(\[^.]*)$/);  
if (!typeMatch) {  
    console.log("Could not determine the image type.");  
    return;  
}  

// Check that the image type is supported    
const imageType = typeMatch\[1].toLowerCase();  
if (imageType != "jpg" && imageType != "png") {  
    console.log(`Unsupported image type: ${imageType}`);  
    return;  
}  

// Download the image from the S3 source bucket.   

try {  
    const params = {  
        Bucket: srcBucket,  
        Key: srcKey  
    };  
    var origimage = await s3.getObject(params).promise();  

} catch (error) {  
    console.log(error);  
    return;  
}    

// set thumbnail width. Resize will set the height automatically to maintain aspect ratio.  
const width  = 200;  

// Use the Sharp module to resize the image and save in a buffer.  
try {   
    var buffer = await sharp(origimage.Body).resize(width).toBuffer();  
          
} catch (error) {  
    console.log(error);  
    return;  
}   

// Upload the thumbnail image to the destination bucket  
try {  
    const destparams = {  
        Bucket: dstBucket,  
        Key: dstKey,  
        Body: buffer,  
        ContentType: "image"  
    };  

    const putResult = await s3.putObject(destparams).promise();   
      
} catch (error) {  
    console.log(error);  
    return;  
}   
      
console.log('Successfully resized ' _ srcBucket _ '/' _ srcKey _  
    ' and uploaded to ' _ dstBucket _ '/' + dstKey);   

};

answered 3 years ago

You are not logged in. Log in to post an answer.

A good answer clearly answers the question and provides constructive feedback and encourages professional growth in the question asker.

Guidelines for Answering Questions