우리는 단일 js파일을 노드 환경에서는 'node ~.js' 이런 식으로 실행 할 수 있다. 그렇다면 돌아가고 있는 서버 안에서는 어떻게 이런 스크립트를 실행시켜야할까.
const exec = require('child_process').exec;
const execSync = util.promisify(require('child_process').exec);
exec는 Node.js에서 다른 프로세스의 명령을 실행할 때 사용한다. 또한 exec함수는 shell을 사용하기 때문에 편하게 사용할 수 있다. 하지만 exec함수는 콜백함수를 받아서 동작하기에 async await같은 프로미스를 이용하는 구문에서는 처리가 귀찮을 수 있다. 이럴 때 execSync 처럼 프로미스를 리턴하도록 만들어 줄 수 있다.
간단히 폴더를 tar 파일로 압축하여 s3에 올리는 스크립트이다. 이 스크립트는 노드 서버안에 있으며, 노드 프로젝트에서 "aws-adk" 라이브러리를 설치한 상태이다.
const fs = require('fs');
const util = require('util');
const AWS = require('aws-sdk');
require('dotenv').config();
const execSync = util.promisify(require('child_process').exec);
const s3 = new AWS.S3({
accessKeyId: process.env.IB_S3_KEYID,
secretAccessKey: process.env.IB_S3_KEY,
region: 지역,
});
const target = process.argv[2];
const date = process.argv[3];
const tarFileName = `${date}.tar`;
async function db_backup() {
try {
await execSync(`sudo tar -cvf ${tarFileName} ${mongodb의 볼륨경로}`);
await s3
.upload({
Bucket: process.env.IB_S3_BUCKET,
Key: `${target}/${tarFileName}`,
ACL: 버킷 접근 권한,
Body: fs.createReadStream(tarFileName),
ContentType: 'application/x-tar',
})
.promise();
await execSync(`rm -rf ${tarFileName}`);
} catch (err) {
console.log(err);
}
}
event_backup();
"require('dotenv').config"는 프로젝트 루트 경로의 .env를 읽어서 process.env를 통해 환경변수에 접근할 수 있게 해준다. 이 스크립트를 실제 실행하게 될 때에
exec(`node script/event_backup.js ${eid} ${getDate()}`)
이렇게 실행하게 되는데, 이때 전달되는 props는 process.argv 배열에 들어오게 되고, 그 순서는 다음과 같다.
exec / (`node script/event_backup.js / ${eid} / ${getDate()}`
argv[0] / argv[1] / argv[2] / argv[3]
이렇게 전달받은 파라미터로 스크립트를 실행하게 된다.