From c7c46db5a1725d3387bea682c39f42212ecd4358 Mon Sep 17 00:00:00 2001 From: yoution Date: Tue, 4 Feb 2020 13:38:43 +0800 Subject: [PATCH] change aws s3 cli to aws-sdk --- package.json | 2 +- src/routes/attachments/create.js | 17 ++++++--- src/util.js | 62 +++++++++++++++++++++----------- 3 files changed, 55 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index a7e72a9c..6490f091 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "amqplib": "^0.5.1", "analytics-node": "^2.1.1", "app-module-path": "^1.0.7", - "aws-sdk": "^2.468.0", + "aws-sdk": "^2.610.0", "axios": "^0.19.0", "bluebird": "^3.4.1", "body-parser": "^1.15.0", diff --git a/src/routes/attachments/create.js b/src/routes/attachments/create.js index be69ab48..ac9a2061 100644 --- a/src/routes/attachments/create.js +++ b/src/routes/attachments/create.js @@ -76,17 +76,26 @@ module.exports = [ contentType: data.contentType, isPublic: false, }, + // Promise.resolve({ + // status: 200, + // data: { + // result: { + // status: 200, + // }, + // }, }).then((resp) => { req.log.debug('Presigned Url resp: ', JSON.stringify(resp.data, null, 2)); if (resp.status !== 200 || resp.data.result.status !== 200) { return reject(new Error(resp.data.result.message)); } - // store deistination path & url - const destinationUri = `s3://${config.get('attachmentsS3Bucket')}/${filePath}`; - const sourceUri = `s3://${data.s3Bucket}/${data.filePath}`; + const sourceBucket = data.s3Bucket; + const sourceKey = data.filePath; + const destBucket = config.get('attachmentsS3Bucket'); + const destKey = filePath; + req.log.debug('Moving s3 file'); // transfer file - return util.s3FileTransfer(req, sourceUri, destinationUri); + return util.s3FileTransfer(req, sourceBucket, sourceKey, destBucket, destKey); }).then(() => accept()).catch(reject); } else { accept(); diff --git a/src/util.js b/src/util.js index a593751e..1f096f5f 100644 --- a/src/util.js +++ b/src/util.js @@ -15,10 +15,10 @@ import querystring from 'querystring'; import config from 'config'; import urlencode from 'urlencode'; import elasticsearch from 'elasticsearch'; +import AWS from 'aws-sdk'; // import jp from 'jsonpath'; import Promise from 'bluebird'; import models from './models'; -// import AWS from 'aws-sdk'; import { ADMIN_ROLES, @@ -30,7 +30,6 @@ import { RESOURCES, } from './constants'; -const exec = require('child_process').exec; const tcCoreLibAuth = require('tc-core-library-js').auth; const m2m = tcCoreLibAuth.m2m(config); @@ -269,28 +268,49 @@ _.assignIn(util, { /** * Moves file from source to destination - * @param {object} req request object - * @param {object} source source object - * @param {string} dest destination url + * @param {object} req request object + * @param {string} sourceBucket source bucket + * @param {string} sourceKey source key + * @param {string} destBucket destination bucket + * @param {string} destKey destination key * @return {promise} promise */ - s3FileTransfer: (req, source, dest) => new Promise((resolve, reject) => { - const cmdStr = _.join([ - 'aws s3 mv', - `"${source}"`, - `"${dest}"`, - '--region us-east-1', - ], ' '); - exec(cmdStr, (error, stdout, stderr) => { - req.log.debug(`s3FileTransfer: stdout: ${stdout}`); - req.log.debug(`s3FileTransfer: stderr: ${stderr}`); - if (error !== null) { - req.log.error(`exec error: ${error}`); - return reject(error); - } - return resolve({ success: true }); + s3FileTransfer: async (req, sourceBucket, sourceKey, destBucket, destKey) => { + const s3 = new AWS.S3({ + Region: 'us-east-1', + apiVersion: '2006-03-01', }); - }), + + + try { + const sourceParam = { + Bucket: sourceBucket, + Key: sourceKey, + }; + + const copyParam = { + Bucket: destBucket, + Key: destKey, + CopySource: `${sourceBucket}/${sourceKey}`, + }; + + await s3.copyObject(copyParam).promise(); + req.log.debug(`s3FileTransfer: copyObject successfully: ${sourceBucket}/${sourceKey}`); + // expect delteObject not block the request + setTimeout(async () => { + try { + await s3.deleteObject(sourceParam).promise(); + req.log.debug(`s3FileTransfer: deleteObject successfully: ${sourceBucket}/${sourceKey}`); + } catch (e) { + req.log.debug(`s3FileTransfer: deleteObject failed: ${sourceBucket}/${sourceKey} : ${e.message}`); + } + }); + return { success: true }; + } catch (e) { + req.log.debug(`s3FileTransfer: error: ${e.message}`); + throw e; + } + }, /**