아마존 EC2로 서버를 운영하다보면 이미지 등 파일을 서버에 업로드하고 저장해야 하는 경우가 있다. 단일 서버라면 디스크에 파일을 저장할수 있다. 그러나 EC2로 오토 스케일링을 묶어놓은 경우는 다르다. 스케일 아웃될 경우 같은 파일을 가지고 있는 서버가 여러대 생성되기 때문이다. 데이터 정합성, 리소스 낭비 같은 문제가 있다.

AWS에는 파일저장을 위해 Simple Storage Service (S3) 제품 제공하는데 이러한 경우 사용할수 있다. S3에 파일을 업로드하는 노드(nodejs) 어플리케이션을 만들어 보자.

S3 버킷 생성

웹콘솔을 통해 손쉽게 S3에 버킷을 생성하고 버킷 접근 권한을 설정하자. 퍼미션(Permission) 설정을 통해 IAM에 등록된 사용자 별로 List/Upload/Delete 권한을 부여할 수 있다. 또한 버킷의 정책(Policy)을 설정할수 있는데, 이것은 좀더 세밀한 접근권한 설정인것 같다. (참고: 정책 설정 예제) 아마존에서 제공하는 정책 생성기를 통해서 정책을 만들고 생성된 json 문자열을 복사해서 사용한다.

s3cmd

S3에는 s3cmd라는 툴을 제공하는데 이것을 통해 S3에 이미지 파일을 업로드할 수 있다. aws sdk와 비교하여 이미지 파일 100개 업로드하여 비교해 보았다.

  • s3cmd: 53.0s
  • nodejs용 sdk 7.16s

s3cmd는 순차적으로 100장을 업로드하는데 비해 nodejs는 비동기로 처리할수 있어서 응답속도가 훨씬 빠르다. Nodejs용 S3 sdk를 사용하자.

S3 SDK

npm install aws-sdk 로 sdk 노드 모듈을 설치한다. 노드용 aws sdk사용은 이곳을 참조. 몇 가지 사항만 짚고 넘어간다.

Api 키 세팅

~/.bashrc 파일에 api 키 정보를 추가하고 업데이트 한다.

export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."
vi ~/.bashrc // ~/.bashrc파일에 위 내용을 추가
source ~/.bashrc

지역 설정

S3 버킷으로 업로드시 아래와 같은 에러 메세지가 나올 수 있다.

PermanentRedirect: The bucket you are attempting to access must be … 생략

내 경우는 S3 지역 설정을 해주지 않아서 문제였다. 노드 소스에서 AWS.config.region = ‘us-east-1’를 추가하여 지역 정보를 설정한다. AWS 지역정보는 여기를 참조.