NODEJS] AWS의 S3에 파일 업로드 다운로드 구현

AWS EC2 서버에서 공지사항에 들어가는 첨부 파일을 업로드 하고 다운로드 하는 기능이 필요 했다.

다음의 순서로 처리하면 쉽게 된다.

1. 사용자 생성 하기

1. AWS IAM에서 사용자를 생성 하고, 애세스 유형을 프로그램 방식으로 선택

사용자 추가
{: .image-left}

이후 결과로 Access key ID, Secret access key를 알고 있어야 한다.

2. 권한으로 AmazonS3FullAccess를 할당

사용자 권한
{: .image-left}

2. nodejs에서 aws-sdk 사용하기

# 프로젝트 초기화
$> npm init

# aws-sdk 모듈 설치
$> npm install aws-sdk --save

3. bucket 생성 하기

createBucket.js

const AWS = require('aws-sdk');
const ID = 'Access key Id';
const SECRET = '';
const BUCKET_NAME = '';
const s3 = new AWS.S3({
  accessKeyId: ID,
  secretAccessKey: SECRET
});
const params = {
  Bucket: BUCKET_NAME,
  CreateBucketConfiguration: {
      // Set your region here
      LocationConstraint: "ap-northeast-2"
  }
};

s3.createBucket(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else console.log('Bucket Created Successfully', data.Location);
});

4. 파일 업로드

uploadFile.js

const fs = require('fs');
const AWS = require('aws-sdk');
const BUCKET_NAME = '';
const s3 = new AWS.S3({
  accessKeyId: '',
  secretAccessKey: ''
});
const uploadFile = (fileName) => {
  const fileContent = fs.readFileSync(fileName);
  const params = {
      Bucket: BUCKET_NAME,
      Key: 'test.txt', // File name you want to save as in S3
      Body: fileContent
  };
  s3.upload(params, function(err, data) {
      if (err) { throw err; }
      console.log(`File uploaded successfully. ${data.Location}`);
  });
};
uploadFile('./uploads/test.txt');

5. 파일 다운로드

download.js

const fs = require('fs');
const AWS = require('aws-sdk');
const BUCKET_NAME = '';
const s3 = new AWS.S3({
  accessKeyId: '',
  secretAccessKey: ''
});
const downloadFile = (fileName) => {
  const params = {
      Bucket: BUCKET_NAME,
      Key: 'test.txt', // File name you want to save as in S3
  };
  s3.getObject(params, function(err, data) {
      if (err) {
          throw err;
      }
      fs.writeFileSync(fileName, data.Body.toString());
  });
};
downloadFile('../../uploads/test-download.txt');

참고자료

Posted by lahuman

댓글을 달아 주세요

javascript에서 제공되는 console methods

오늘 javascript 강좌를 보다가 다음과 같은 코드를 보았다.

console.time('Label');
... 성능측정(시간 측정)을 하려는 코드
console.timeEnd('Label');

... 결과
Label: 13998.528076171875ms

time이라는 method는 인자로 받은 문자열을 기준으로 실행 시간의 시작을 의미하고, timerEnd method는 인자로 받은 문자열을 기준으로 실행 시간을 화면에 표출하고 종료 한다.
이외에 timeLog도 제공하며 시작이후 지금가지 시간을 표기한다.

console.time('Label');
... 성능측정(시간 측정)을 하려는 코드

console.timeLog('Label');
... 출력
Label: 7327.245849609375ms

console.timeEnd('Label');

... 결과
Label: 13998.528076171875ms

기본적으로 console의 info, debug, trace, log, warn 과 같이 로그 레벨을 기준으로 사용하거나, 특별하게 dir(object 형식으로 출력) method 정도 사용해보았다.

금일 알게된건 console에 더 많은 옵션들이 존재 한다는 것이다.

console의 옵션 정리

  • Console.assert()
    • 첫 번째 매개변수가 false인 경우 메시지와 스택 추적을 출력합니다.
  • Console.clear()
    • 콘솔의 내용을 지웁니다.
  • Console.count()
    • 주어진 라벨로 메서드를 호출한 횟수를 출력합니다.
  • Console.countReset()
    • 주어진 라벨의 횟수를 초기화합니다.
  • Console.debug()
    • "debug" 중요도로 메시지를 출력합니다.

참고: Chromium 브라우저는 58 버전 이후 브라우저 콘솔의 "Verbose" 레벨을 선택하지 않으면 이 메서드의 출력 결과가 보이지 않습니다.

  • Console.dir()

    • 주어진 JavaScript 객체의 속성 목록을 상호작용 가능한 형태로 표시합니다. 속성 값이 다른 객체라면 펼쳐서 살펴볼 수 있습니다.
  • Console.dirxml()

    • 객체를 XML/HTML 요소 형태로 나타낼 수 있으면 그렇게 표시하고, 아닐 경우 JavaScript 객체 형태로 표시합니다.
  • Console.error()

    • 오류 메시지를 출력합니다. 추가 매개변수와 함께 문자열 치환을 사용할 수 있습니다.
  • Console.exception() 표준 아님, 사용하지 않기를 권고

    • error()의 별칭입니다.
  • Console.group()

    • 새로운 인라인 그룹을 생성해, 이후 모든 출력을 한 단계 들여씁니다. 그룹을 나오려면 groupEnd()를 호출하세요.
  • Console.groupCollapsed()

    • 새로운 인라인 그룹을 생성해, 이후 모든 출력을 한 단계 들여씁니다. 그러나 group()과 달리, groupCollapsed()로 생성한 그룹은 처음에 접혀 있습니다. 그룹을 나오려면 groupEnd()를 호출하세요.
  • Console.groupEnd()

    • 현재 인라인 그룹을 나옵니다.
  • Console.info()

    • 정보 메시지를 출력합니다. 추가 매개변수와 함께 문자열 치환을 사용할 수 있습니다.
  • Console.log()

    • 일반 메시지를 출력합니다. 추가 매개변수와 함께 문자열 치환을 사용할 수 있습니다.
  • Console.profile()

    • 브라우저의 내장 프로파일러(Firefox 성능 측정 도구 등)를 실행합니다. 선택 사항으로 프로파일에 이름을 붙일 수 있습니다.
  • Console.profileEnd()

    • 프로파일러를 멈춥니다. 프로파일 결과는 브라우저의 성능 측정 도구(Firefox 성능 측정 도구 등)에서 확인할 수 있습니다.
  • Console.table()

    • 표 형태의 데이터를 표에 그립니다.
  • Console.time()

    • 주어진 이름의 타이머를 실행합니다. 하나의 페이지에서는 최대 10,000개의 타이머를 동시에 실행할 수 있습니다.
  • Console.timeEnd()

    • 지정한 타이머를 멈추고, 소요시간을 출력합니다.
  • Console.timeStamp() 표준 아님

    • 브라우저의 타임라인이나 워터폴에 마커를 추가합니다.
  • Console.trace()

    • 스택 추적을 출력합니다.
  • Console.warn()

    • 경고 메시지를 출력합니다. 추가 매개변수와 함께 문자열 치환을 사용할 수 있습니다.

몰라서 쓰지 못했던 옵션이 6개도 넘는다. 앞으로 프로젝트에서 많이 사용해보자!

출처

Posted by lahuman

댓글을 달아 주세요

pm2 로그를 관리하는 모듈을 이용하자

pm2는 Nodejs에서 프로세스를 관리 하는 모듈이다.

아주 많이 사용되고 있으며 주요 기능은 프로세스 관리 및 모니터링을 제공한다. 또한 사용법이 간단하다.

# 설치 
$> npm install pm2 -g 
# 사용
$> pm2 start app.js

6개월 가량 운영하던 서비스에서 디스크 FULL 메시지를 받고 가장 많이 사용중인 파일을 확인하였는데, pm2 로그 파일이었다.

기본 설정을 사용시, 로그 파일은 한개만 생성되고 계속 사이즈가 증량되는 방식으로 제공한다.

pm2 로그를 관리 하기 위하여 검색 결과 pm2-logrotate를 찾았다.
pm2 모듈로, 설치는 다음과 같이 하면 된다.

#설치
$> pm2 install pm2-logrotate

[PM2][Module] Module downloaded
[PM2][WARN] Applications pm2-logrotate not running, starting...
[PM2] App [pm2-logrotate] launched (1 instances)
== pm2-logrotate ==
┌────────────────┬─────────────────────┐
│ key            │ value               │
├────────────────┼─────────────────────┤
│ max_size       │ 10M                 │
│ retain         │ 30                  │
│ compress       │ false               │
│ dateFormat     │ YYYY-MM-DD_HH-mm-ss │
│ workerInterval │ 30                  │
│ rotateInterval │ 0 0 * * *           │
│ rotateModule   │ true                │
└────────────────┴─────────────────────┘

설치를 하면 다음과 같은 기본 설정이 반영 된다.

파일 한개의 최대 크기는 10M 이고 파일은 30개만 남는다. 파일명은 dateFormat을 기반으로 표시 되고 매일 1개의 파일이 생성된다.

설정을 변경하려면 다음과 같은 명령어를 이용하면 된다.

# (1KB)
$> pm2 set pm2-logrotate:max_size 1K 
#  (compress logs when rotated)
$> pm2 set pm2-logrotate:compress true
#  (force rotate every minute)
$> pm2 set pm2-logrotate:rotateInterval '*/1 * * * *'

설치하고 사용이 참 쉬웠다.

참고 자료

Posted by lahuman

댓글을 달아 주세요