CDN으로 이미지 업로드하기

AWS S3였다면 편했을 것을…

JC
Museion
4 min readJun 30, 2019

--

회사에서 이미지를 별도의 CDN서버에 업로드해서 관리하고 있다. 일반적인 아키텍트에서는 웹서버 이중화를 구성하고, 양 서버에서 이미지를 제대로 빠르게 보여주기 위해 이미지를 업로드하면 CDN서버로 업로드하도록 구성해야 했지만, 안정적인 개발보다 속력을 택하다보니 바른 아키텍트를 구성하지 못했다. 비싼 서버 한 대로 웹서버 트래픽을 모두 처리하고 있었다.

Web Application Hosting의 기본 아키텍트 https://media.amazonwebservices.com/architecturecenter/AWS_ac_ra_web_01.pdf

외부 제휴로 인해 트래픽이 더 늘어나면서 부하 감소를 고민해야했고, CDN 서버를 구성해 이미지를 구분하자는 의견이 나와 서버 세팅 및 이미지 경로 변경 작업을 바로 진행했다.

일반적인 업무 프로세스로는 이미지 업로드 후 CDN으로 이동하거나, 이미지를 CDN으로 바로 업로드하는 개발 과정이 있어야 했으나 서로 다른 업무에 바쁘다보니 해결하지 못하고 있었다(차마 속력을 택했다고는 하지 못하겠다 ㅠㅠ).

정상화 과정에서의 문제 발생

‘일반적인’을 계속 언급한 것은 일반적이지 않은 상태였다는 이야기고, 일반적인 상황으로 옮겨가는 과정인 것이다. 한 대의 서버로 모든 것을 해결할 수는 없다. 특히 회사처럼 순간 유입이 많은 경우 요청을 다 처리하지 못하는 경우가 발생할 수 있어 L4 도입과 서버 이중화를 고민하게 됐다. 시스템의 weak point를 찾으려하다가 모든 지점이 weak point라서(ㅠㅠ) 당장 큰 문제가 발생할 것들부터 정리를 하기 시작했다.

웹서버 이중화를 진행하면서 고민해보니 파일 업로드에서 문제가 발생할 수 있다는 생각을 하게 됐다. 그동안은 왜 문제가 없었을까. 문제가 발생하지 않았던 이유를 찾아보니 담당자가 수동으로 가끔씩 파일을 CDN서버로 옮겨주면서 db 업데이트를 하고 있던 것을 알게 됐다. 시스템의 부족함을 인력이 고생해서 처리하던 문제였음을 발견했다. 그동안 고생했을 담당자에게 감사하며 파일 업로드를 할 때 CDN 반영이 되는방법을 고민했다.

wikepedia:Content delivery network

CDN SERVER

CDN서버를 보니 sftp를 이용해 업로드할 수 있게 되어있다. 여기서부터 삽질이 시작됐다. 내가 아는 CDN 비스무리한 것은 AWS S3밖에 없기에 API 서비스가 있는지 한참을 알아봤고, 이후에는 API 서비스를 구축할 수 없는지도 고민을 했다. 당연하지만 모두 불가능하고 오직 sftp로만 접근이 가능하다.

1. scp

sftp로 접근할 수 있기 때문에 22번 포트가 열렸음을 알고 scp를 이용하는 방법을 살펴봤다. scp에 대해 문서를 잠깐 읽고 관련 코드를 작성했더니 파일을 업로드할 수 있었다. 생각보다 쉽게 될 거라 생각했지만 틀린 생각이었다.

현지 서버의 백엔드는 php로 돌아가는데 php로는 scp 명령을 쓸 수가 없다. rsync으로 명령을 바꿔보기도 했는데 마찬가지로 php에서는 불가능했다. 바로 파일을 올릴 수가 없다면 파일을 복제하는 것은 어떨까.

2.mount

CDN 디렉토리를 마운트하면 원하는대로 쓸 수 있지 않을까. 그러나 CDN 서버는 마운트를 할 수 없는 설정이었다. 우리에게 권한이 없어서 원하는대로 할 수가 없었다. 다시 S3가 그리워지는 순간이다. 방법을 고민하는 사이에 웹서버 분리가 진행됐고 새로 업로드한 파일이 보이지 않는다는 내부 민원이 속출했다.

rsync cron

누군가 파일을 업로드하면 직접 scp 명령을 이용해 업로드를 해줬다. 마침 이벤트를 진행하고 있어서 이미지가 자주 변경됐다. 계속 업로드를 해주다보니 cron으로 돌리는 게 더 낫지 않겠나하는 생각이 들었다. cron을 생각하기 전에는 python으로 대몬을 만들어 디렉토리를 계속 체크하면서 업로드를 하려고 했는데, python을 공부하는 시간이 너무 오래 걸릴 것 같다.

cron으로 동작하도록 스크립트를 수정하고 key를 등록했다. 업로드를 하는 직원들에게 업로드까지 최대 1분이 걸린다는 안내를 했다. 그리고 작동을 확인해보니 원하는대로 작동한다. 두 문단으로 끝난 이야기지만 두 시간 동안 파일 업로드를 해주면서 스크립트를 정리하느라 정신이 없었다.

아래는 cron에 등록한 업로드 스크립트다.

rsync -ru /source/directory/ targetid@targetserver:/target/directory/

이 명령만 실행하면 비밀번호를 묻는다. 아래처럼 key를 등록하면 매번 비밀번호를 묻지 않고 이용할 수 있다.

ssh-keygen -t rsa
ssh-copy-id targetid@targetserver
참고 : SSH 비밀번호 입력없이 로그인하기

이제 CDN 배포 관련한 고민은 끝났다. 다시 빠른 속력으로 달려갈 때가 됐다.

--

--

JC
Museion

책 읽는 개발자. 아빠. 생산성, 책, 개발에 관한 글을 남깁니다.