Lambda@Edge 를 활용한 이미지 리사이즈
현재 구현할 서비스의 필요한 해상도는 S/M/L/XL 정도가 되겠다.
CloudFront에 파라미터명을 설정해주고 (*.jpg?d=s) 들어오는 사이즈에 따라 이미지 사이즈를 변경해 S3에 올리게끔 처리했다.
이미지 리사이즈엔 node.js에서 퍼포먼스가 좋아 많이 사용하고 있는 sharp 라이브러리를 사용하였다.
HEIF도 지원이 필요한 데 곧 제공될 예정이지만 현재는 아니라 기다리고 있는 중이다.
S3.getObject({ Bucket: BUCKET, Key: originalKey }).promise()
.then(data => Sharp(data.Body)
.resize(width)
.toFormat(requiredFormat)
.toBuffer()
)
.then(buffer => {
S3.putObject({
Body: buffer,
Bucket: BUCKET,
ContentType: 'image/' + requiredFormat,
CacheControl: 'max-age=31536000',
Key: key,
StorageClass: 'STANDARD'
})
AWS 블로그에서 제공되고 있는 소스이니 잘 가져다 구현하면 된다.
https://{BUCKET_URL}/images/805656.png?d=s 와 같이 요청하면 해상도별로 S3에 구분한 경로에 저장이 된다.
요청이 들어오는 User-Agent에 따라 이미지 확장자를 분기해 줄 수 있으니(이를테면 안드로이드는 webp로 iOS는 HEIF) 해당 부분도 추가로 구현할 예정이다.
Lambda를 통해 특정 기능을 구현한 적은 처음이었는 데, 생각보다 간단하게 환경을 구성하지 않고 금방 개발할 수 있었다.
중요한 서비스엔 부하가 가지 않게 하기도 하고 빠르게 구현할 수 있었는 데 운영하면서 발생하는 이슈는 몸소 겪어볼 예정이다.
또한 얼마나 효율적으로 사용되는 지는 서비스를 런칭해서 사용해보고 리포트를 분석해야할 듯 하다. Request 하는 횟수에 따른 비용(백만 번은 무료인 Lambda와 다르게.. 사용하는 만큼 비용을 지불해야하기 때문에)과 Hit는 얼마나 되는 지와 모든 단말기의 해상도 파일이 필요하지 않을 거라 추측만 했을 뿐이라 실제로 비용적인 면 등을 면밀히 살펴봐야할 듯 하다.
참고 URL :
'server' 카테고리의 다른 글
fluentd와 함께하는 검색 데이터 수집 (0) | 2019.06.26 |
---|---|
Redisson (0) | 2019.06.26 |
ModelMapper (0) | 2019.06.25 |
WAS 속도 느림 현상 (0) | 2017.02.01 |
로그 관리를 위한 logrotate.d (0) | 2016.12.16 |
댓글