使用Lambda(节点)将图像从SFTP复制到S3



我使用"ssh2-sftp-client"来完成这项工作。因此,如果我先将文件复制到Lambda的/tmp/文件夹,然后将其上传到s3,基本上可以正常工作。我想将读取流指向s3,而不保存在lambda/tmp/文件夹中。

所以基本上:

let sftp = new Client();
sftp.connect({
host: Config.host,
port: Config.port,
username: Config.user,
password: Config.password
}).then(() => {
return sftp.list('/photos');
}).then((files) => {
return get(files)
}).then((streams) => {
return streamToString(streams)
}).then((dataArray) => {
return uploadToS3.putBatch(Config,dataArray)
}).then(() => {
return cleanSFTP();
}).then(() => {
context.done();
}).catch((err) => {
console.log('Catch Error: ', err);
context.fail();
});

从sftp:获取readstream

function get(files) {
return Promise.all(files.slice(0, 2).map((file) => {
fileList.push(file.name);
return sftp.get(BASIC_URL + '/' + file.name);
}));
}

流到字符串:

var streamToArray = require('stream-to-array')
module.exports = function (fileStreams) {
return Promise.all(fileStreams.map((file) => {
return fileToArray(file)
}))
}

function fileToArray(fileStream) {
return streamToArray(fileStream)
.then((fileArray) => {
return {data: fileArray, key: fileStream.path}
})
.catch((err) => {
return err
})
}

上传到s3:

var AWS = require('aws-sdk')
AWS.config.setPromisesDependency(require('bluebird'));
function putBatch(config, files) {
var s3 = new AWS.S3();
// Make all the putObject calls immediately
// Will return rejected promise if any requests fail
return Promise.all(files.map((file) => {
if (typeof file.key && file.data !== undefined) {
var params = {
Bucket: config.bucket,
Key: "preix/" + file.key,
Body: file.data
};
return s3.putObject(params).promise()
}
}));
};

使用此功能,图像会被复制到s3,但它们的大小与sftp中的不同,并且无法预览图像。

知道吗?

我使用了s3 sftp桥,它可以无缝工作。

https://github.com/gilt/s3-sftp-bridge

只需要s3位置和sftp位置带有凭据,它就会自动同步。

希望能有所帮助。

最新更新