NodeJS SFTP connection password as an SSM Parameter

Viewed 13

I use this code to get an object on S3 upload event and send it via SFTP to external server. The only issue is I need to remove hardcoded password and replace it with an SSM Parameter Value.

console.log('Loading function');
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const ssm = new AWS.SSM();
const fs = require('fs');

const connSettings = {
  host: 'samplehost',
  port: '22',
  username: 'sampleuser',
  password: 'samplepassword'
};

exports.handler =  function(event, context, callback) {
  console.log('Received event:', JSON.stringify(event, null, 2));
  console.log('Bucket Name: ' + event['detail']['bucket']['name']);
  console.log('Object Key: ' + event['detail']['object']['key']);
  const bucket = event['detail']['bucket']['name'];
  const key = event['detail']['object']['key'];
  const params = {
    Bucket: bucket,
    Key: key,
  };
  console.log(params.Bucket, params.Key);
  s3.getObject(params, (err, data) => {
    if (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);
      callback(message);
    } else {
      if (data.ContentType == 'binary/octet-stream') {
        console.log('CONTENT TYPE is correct');
        var localPath = "/somepath" + key;
        var remotePath = '/somepath' + key;
        var tempFile = fs.createWriteStream(localPath);
        var stream;
        stream = s3.getObject(params).createReadStream().pipe(tempFile);
        console.log("Put file in temp");
        console.log('Created data object');
        console.log('Starting SFTP');
        let Client = require('/opt/node_modules/ssh2-sftp-client/src/index');
        let sftp = new Client();
        sftp.connect(connSettings)
        .then(() => console.log('Connected to sftp, starting sftp put for ' + key + ' file.'))
        .then(() => {
            console.log('Finished sftp put for ' + key + ' file.');
            return sftp.put(localPath, remotePath, true, 'utf-8');
        })
        .then(() => {
            console.log('Ended sftp connection.');
            return sftp.end();
        })
        .then(callback(null, 'Success'))
        .catch ((err) => {
          console.log(err, 'Error occured during sftp relay.');
          callback('Error', err);
        });
        tempFile.on('finish', function() {
         stream.destroy();
         });
      } else {
        console.log('Uploaded file not .csv format, will not be processed.');
        }
      }
  });
};

Whatever I try just dont seem to work, I mostly get the "is not defined" error. I can usually get the parameter value just fine, but then cannot integrate it into my code as password parameter for sftp connection, f.e 1):

var secretAcessKeyParam = ssm.getParameter(SSMoptions).promise();

secretAcessKeyParam.then(function (data, err) {
  if (err) console.log(err, err.stack);
  else {
    process.env.secretAccessKey = data.Parameter.Value;
    const secretAccessKey = process.env.secretAccessKey;
    console.log(secretAccessKey);
  }
});

const connSettings = {
  host: 'samplehost',
  port: '22',
  username: 'sampleuser',
  password: secretAccessKey
};

2):

const fromParameterStore = async() => {
    const { Parameter } = await ssm.getParameter(SSMoptions).promise();
    return Parameter.Value;
};

const testValue = await fromParameterStore();

const connSettings = {
  host: 'samplehost',
  port: '22',
  username: 'sampleuser',
  password: testValue
};
0 Answers
Related