使用 Lambda(节点)将图像从 SFTP 复制到 S3
Copy images from SFTP to S3 using Lambda (node)
我正在使用 '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 获取读取流:
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-bridge,它可以无缝运行。
https://github.com/gilt/s3-sftp-bridge
只需要带有凭据的 s3 位置和 sftp 位置,它会自动同步。
希望对您有所帮助。
我正在使用 '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 获取读取流:
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-bridge,它可以无缝运行。
https://github.com/gilt/s3-sftp-bridge
只需要带有凭据的 s3 位置和 sftp 位置,它会自动同步。
希望对您有所帮助。