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
};