node.jsamazon-web-servicesaws-lambdassh2-sftp

Download file to AWS Lambda using SSH client


I am trying to download a file from an EC2 instance and store it temporarily in the tmp folder inside AWS Lambda. This is what I have tried:

let Client  = require('ssh2-sftp-client');
let sftp = new Client();
sftp.connect({
    host: host,
    username: user,
    privateKey : fs.readFileSync(pemfile)
}).then(() => {
    return sftp.get('/config/test.txt' , fs.createWriteStream('/tmp/test.txt'))
}).then(() => {
    sftp.end();
}).catch(err => {
    console.error(err.message);
});

The function runs without generating an error but nothing is written to the destination file. What am I doing wrong here and how could I debug this? Also is there a better way of doing this altogether?


Solution

  • This is not the cloud way to do it IMO. Create a S3 bucket, and create proper Lambda execution role for the lambda function to be able to read from the bucket. Also, create a role for the EC2 instance to be able to write to the same S3 bucket. Using S3 API from both sides, the lambda function and the EC2, should be enough to share the file.

    Think about this approach: you decouple your solution from a VPC and region perspective. Also, since the lambda only needs to access S3, you save a ENI (elastic network interface) resources, so you are not using your VPC private ips. These are just advantages that may not care in your case, but it is good to be aware of them.