글로벌 사진 사이트 구축하기

이재홍 http://www.pyrasis.com 2014.03.24 ~ 2014.06.30

이미지 변환 서버 내용 둘러보기

이미지 변환 서버의 내용을 살펴보겠습니다. 서버 기본 설정 및 정의입니다.

  • 이미지 저장용 S3 버킷 이름, SQS 큐 URL, RDS 엔드포인트 주소(MySQL)와 연결 설정은 여러분들이 생성한 AWS 리소스의 정보를 입력합니다.
  • MySQL에서 파일 정보를 가져올 수 있도록 테이블을 정의합니다.
var s3Bucket = 'examplephoto.image';
var sqsQueueUrl = 'https://sqs.ap-northeast-1.amazonaws.com/232075047203/ExamplePhotoQueue';
var rdsEndpoint = {
  host: 'examplephoto.cnlconsezo7y.ap-northeast-1.rds.amazonaws.com',
  port: 3306
};

// MySQL DB 이름, 계정, 암호
var sequelize = new Sequelize('examplephoto', 'admin', 'adminpassword', {
  host: rdsEndpoint.host,
  port: rdsEndpoint.port
});

// MySQL DB 테이블 정의
var Photo = sequelize.define('Photo', {
  filename: { type: Sequelize.STRING, allowNull: false, unique: true }
});

AWS API로 SQS에서 메시지를 받습니다.

  • 재귀함수 형태이며 무한루프입니다.
  • receiveMessage 함수에 WaitTimeSeconds를 10초로 설정하여 긴 폴링을 사용하고 있습니다.
  • SQS 큐에서 메시지 받은 뒤 메시지의 내용이 있으면 resizeImage 함수를 호출합니다.
// SQS 메시지 받기
function receiveMessage() {
  sqs.receiveMessage({
    QueueUrl: sqsQueueUrl,
    MaxNumberOfMessages: 1,
    VisibilityTimeout: 10,
    WaitTimeSeconds: 10
  }, function (err, data) {
    if (!err && data.Messages && data.Messages.length > 0)
      resizeImage(data.Messages[0]);
    else if (err)
      console.log(err, err.stack);
    receiveMessage();
  });
}

이미지의 해상도를 변환하는 함수입니다.

  • S3 버킷에서 이미지 파일을 가져옵니다.
  • imagemagick 모듈을 이용하여 이미지 파일의 해상도를 가로 800 픽셀로 줄입니다.
  • 해상도를 줄인 이미지 파일을 S3 버킷의 resized 디렉터리에 올립니다.
  • SQS 메시지를 삭제합니다.
  • Sequelize 모듈로 이미지 파일 이름을 MySQL에 저장합니다.
// 이미지 해상도 변환
function resizeImage(Message) {
  var filename = Message.Body;
  s3.getObject({
    Bucket: s3Bucket,
    Key: 'original/' + filename
  }, function (err, data) {
    im.resize({
      srcData: data.Body,
      width: 800
    }, function (err, stdout, stderr) {
      s3.putObject({
        Bucket: s3Bucket,
        Key: 'resized/' + filename,
        Body: new Buffer(stdout, 'binary'),
        ACL: 'public-read',
        ContentType: mime.lookup(filename)
      }, function (err, data) {
        console.log('Complete resize ' + filename);
        deleteMessage(Message.ReceiptHandle);
        insertPhoto(filename);
      });
    });
  });
}

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.