워드프레스 uploads 폴더를 aws S3으로

아마존 웹서비스(aws)와 워드프레스(WordPress)의 궁합에 대한 개인 후기를 공유해 봅니다.

작업한 웹사이트는 한국인을 대상으로 한 인터넷 강의 웹사이트(LMS)였고, 작업의 핵심은 서버를 도쿄 리전에서 서울 리전으로 옮기고, ec2에서 어플리케이션,파일,데이터베이스를 처리하던 기존 방식에서, aws EC2 + RDS + S3으로 웹서버+디버서버+파일서버로 분리하여 재구성하는 것이었습니다. 개인적으로 이 궁합이 비용과 안정성에서 aws와 WordPress의 가장 좋은 궁합이라 판단합니다. autoscale과 cloudfront만 붙이면 이후에 서버 확장이 간편해 지고요.

  • EC2 : ubuntu 16기반의 apache2, php7.0, mysql-client, sendmail , ssl… 등
  • RDS : mysql 5.6
  • S3 : 워드프레스의 uploads 폴더를 S3으로

 

aws 도쿄 리전에서 서울 리전으로 서버 이전

먼저 도쿄 리전에 있는 서버를 서울 리전으로 이사했습니다.  2016년 1월에 aws 서울 리전이 발표되면서 더이상 서버를 도쿄 리전에 둘 필요가 없어졌습니다. aws 서버 이전에 대한 내용은 아래의 포스트를 참고하였습니다. 다만 저는 일일이 수동으로 세팅하고 이전하였습니다.

 

aws와 WordPress의 새 궁합

이번 작업의 핵심은 EC2에 웹서버 세팅하여 워드프레스를 두고, db는 aws RDS로 분리하고, 워드프레스의 uploads 폴더는 aws S3에 저장하는 것입니다.

(1) 도쿄 리전 백업

파일 백업과 DB 백업이며 방법은 생략합니다.

(2019.1. 추가) 워드프레스 서버 이사 플러그인인 All in on WP migration을 추천합니다.

 

(2) 서울 리전 ec2, rds, s3 설정

Ec2의 OS는 ubuntu 14버전에서 16버전으로 바꾸었고, php도 5.6에서 php7.0으로 버전업하였습니다.  체감상 속도 향상이 느껴집니다.  각각의 설정 방법은 구글링하면 많이 나오므로 생략합니다. 몇가지 확인할 사항은…

  • ec2 웹서버 세팅시 mysql은 mysql-server는 설치하지 않고 mysql-client만 설치하며.
  • RDS 설정시 문자셋 utf8mb4(또는 utf8)를 설정한 Parameta Group을 추가 적용하고, rds 접속을 위한 security group을 확인하고.
  • S3 설정시 s3사용 권한만 있는(AmazonS3FullAccess) s3 전용 사용자 추가를 권장하고, 과정에서 생성되는 access key도 꼭 다운받아 두시고요. 당연히 사전 지식으로 IAM 사용법이 필요합니다.

 

작업한 웹사이트는 특정 시간대에는 접속가가 거의 없지만, 학원이 시작되는 저녁에 접속자가 폭주합니다. 따라서 autoscale로 자동 서버 증설과 축소를 계획하였습니다. 이 과정에서 함께 고려했던 것이 Elastic Beanstalk으로 구성하는 방법이었는데 이는 장단점이 동시에 존재하는듯 합니다.

워드프레스는 업데이트가 자주 있고 특히 플러그인 등의 업데이트마다 버전 관리가 필요한데 작은 사이트의 관리자에게는 오히려 번거로운 작업이 되는듯 합니다. 중대형 사이트라면 자체 개발자가 있을 것이고 그렇다면 차라리 Git 등을 활용한 버전관리가 더 적합하지 않나 생각됩니다.

그럼에도 elastic beanstalk은 충분히 고려할만한 좋은 선택이라는 점은 동의합니다. 아래 관련 링크입니다만, 꼭 그대로 하기보다는 aws를 어느정도 익숙한 분이라면 응용의 실마리가 될거라 생각됩니다.

(3) uploads 폴더를 S3으로

일부 문서는 w3 total cache 플러그인을 제안했는데, 2017년 6월 현재 아래 2가지 플러그인이 정답입니다.

플러그인 세팅 방법은 구글링으로 대체합니다. 위에서도 생략했습니다만 s3 사용권한을 가진 사용자의 access key가 필요합니다.

 

기존의 uploads 폴더를 S3으로

이전을 잘 마쳤습니다. 이제 남은 일은 이미 운영되던 웹사이트라서 전부터 쌓여있는 uploads 폴더를 s3으로 옮기는 작업만 남았습니다.

wp offload s3 lite는 플러그인을 설치한 이후에 추가되는 미디어 파일만 s3으로 저장 또는 (설정에 따라) 복사합니다. 기존 파일을 옮기려면 Pro버전을 구매해야 하는데 wp offload s3 Lite 무료 버전으로 기존 uploads 폴더의 파일을 s3으로 옮겨 보겠습니다.

첫번째 방법은 단순 무식하게 수동으로 직접!! 파일이 많지 않다면 이미지 등의 미디어를 수동으로 다시 업로드하는 방법입니다. ^^;; 수동이라는 의미는 워드프레스 포스트에서 이미 업로드된 이미지를 다시 업로드하라는 의미입니다. 하지만 파일이 수 백 수 천개라서 수동으로 하기 힘든 경우라면?

두번째 방법은 순서대로 적어보면…

(1) wp offload s3 lite의 설정을 보면 [Path] 부분에 설정한대로 S3의 버킷에 폴더가 만들어졌을 겁니다.

 

(2) 기존 /uploads/ 이하의 폴더를 S3 버킷의 설정한 폴더로 직접 업로드합니다. s3 brower 등의 툴로  마치 ftp와 같은 화면으로 s3에 직접 업로드할 수 있습니다.

 

(3) 데이터베이스를 수정합니다. (DB 백업은 필수!!)

이제 mysql 워드프레스 데이터베이스의 wp_posts 테이블의 post_content 에 있는 href 와 src 값을 변경합니다.

console에 직접 접속하거나 MySQL Workbench 등을 활용합니다.

mysql -h myinstance.123456789012.us-east-1.rds.amazonaws.com -P 3306 -u mymasteruser -p

아래를 참고하여 실행합니다.

UPDATE wp_posts SET post_content = replace(post_content, 'href="http://UR-SITE/wp-content/uploads/', 'href="http://aws-bucket-URL/wp-content/uploads/');
UPDATE wp_posts SET post_content = replace(post_content, 'src="http://UR-SITE/wp-content/uploads/', 'src="http://aws-bucket-URL/wp-content/uploads/');

 

(4) 위의 (3)번 과정에 도움이 되는 script를 외국 개발자 TJ Nevis가 공개하였기에 소개합니다.

해당 파일을 wp-config.php 파일이 있는 폴더에 업로드하여 실행하면 됩니다.(http://UR-SITE/S3FixExistingMedia.php)

변경 값을 다시 원상태로 되돌리려면 ?remove=ture로 재실행하면 됩니다.(http://UR-SITE/S3FixExistingMedia.php?remove=true)

확인 후 S3FixExistingMedia.php 파일은 삭제합니다.

 

이제 uploads 와 하부 폴더는 모두 S3에 위치합니다. 마지막으로 wp offload s3 lite 설정에서 [Advanced Options] – [Remove Files From Servere] 를 on으로 할지 off로 할지 결정하십시오. 기본값인 off로 그대로 두면 업로드된 파일은 ec2에서 s3으로 복사가 되지만 실제는 s3에 있는 파일로 링크 됩니다.

이상의 설정에 더하여 CloudWatch에 요금 알람을 만들고 Ec2의 cpu 알람을 만들고, RDS의 메모리 사용 알람을 만들었습니다. 이제 클라이언트는 스마트폰의 AWS Console 앱을 이용하여 서버를 실시간으로 모니터링하게 하였습니다.

 

10 Comments

  1. lyk

    안녕하세요? 컨텐츠 잘보았고 많이 도움되었습니다^^ 감사합니다!
    관려하여 몇가지 질문을 드려도 될까요?

    1. S3를 사용하면 이미지 트래픽에 대한 걱정이 없어지는 것 맞나요?
    2. 엘레멘토를 사용하고 있는데 S3로 이전하면 엘레멘토에서도 S3서버에서 이미지등을 끌어올 수 있나요?
    3. 혹시 비용을 지불하고 S3 설치를 의뢰드릴 수 있나요?

    감사합니다!

    1. baksimgorkii

      1.ec2에서 생성한 ebs 볼륨보다 s3 비용이 더 쌉니다. 그리고 ec2와 s3간의 트래픽은 무료이고요.
      2.엘레멘토가 뭘 말하는지 제가 모르겠습니다만^^;; s3은 파일서버라 어느 어플리케이션에서든 접근 가능합니다.
      3.구글링해서 시도해 보셔도 되지 않을까요? ^^ 어렵다면 메일 주십시오.
      s3이 파일서버에 해당되기에 백업하거나 서버를 옮기거나 할때 더 편하고, 오픈마켓의 이미지를 s3에서 끌어오는 식의 다른 어플리케이션에서 접근해야 하는 경우에는 선택할만만 합니다만 특별한 경우가 아니라면 크게 신경쓰지 않아도 될듯도 합니다.

  2. baksimgorkii

    2018년 언제부터인가 amazon web services 플러그인은 없어도 되게 바뀌었습니다. wp offload s3 플러그인 하나만 있으면 됩니다.

  3. Nell

    안녕하세요, aws관련 정보를 찾다가 본 글에서 도움을 받고있습니다. 감사합니다.
    워드프레스 아마존s3에 대해 혹 궁금한점 여쭤봐도 될까요?
    http://s3-리전코드.amazonaws.com/버킷명/객체키
    의 형식을 따르는 aws작업물 url에서 wordpress를 통한 웹페이지 작업시 해당 url에 2019/03(2019년 3월이라는 의미)이런 형식의 날짜가 삽입되는데요,
    1.4월에 ‘WordPress aws s3 플러그인’으로 웹페이지에 업로드된 2019/03인 이미지 파일을 새로운 이미지로 파일으로 교체 업로드 할 경우에 해당 이미지는 2019/03의 url을 갖게 되는지 아니면 2019/04으로 교체가 되는지 궁금합니다.
    (동일 페이지에 파일명을 바꾸어 미디어 업로드를 한 이미지의 url은 2019/04로 바뀌어있음)
    2. 특정 사이트에서 웹 페이지를 3월에 제작했기 때문에 이 페이지 내의 모든 사진url에 삽입된 날짜가 2019/03이라는 답변을 받았었는데요, 페이지만 3월에 만들어지고 이미지는 4월 중순에서야 업로드 되어도, 그 이미지의 url에 2019/03이라고 표시되는지 궁금합니다.
    (마찬가지로 동일페이지에 이미 2019/04의 값을 같은 이미지가 혼용되어 존재)

    1. baksimgorkii

      플러그인을 나중에 설치했더라도 기존 파일을 s3에 복사하고 url을 바꿔주는 것이기에 2019/03이 유지될 것으로 추측합니다. 저도 테스트해보지 않아서 정확하진 않습니다.

    2. baksimgorkii

      질문을 다시 읽어보았습니다. 4월에 이미지 파일을 새로 업로드하면 04폴더에 저장되겠죠. 플러그인 설정에서 Year/Month 를 끄는 것도 다른 아이디어가 되겠네요. 워프가 기본으로 월/일 폴더를 만들지만(ec2의 워프 폴더에도 여전히) s3으로 복사될때는 워프의 설정과 상관없이 플러그인의 옵션 규칙을 따릅니다. 복사이니까요. 저는 s3에는 wp-content/uploads 대신에 /datas 폴더명으로 하고 year/month 옵션도 끄고 사용하기도 합니다.

  4. 501772

    그리고 ec2와 s3간의 트래픽은 무료이고요…

    관련 문의 드립니다.
    이 무료의 조건이 어떻게 되는건가요?
    하나의 계정으로 연결 되는건가요?
    아니면 어떤 조건인지 궁금합니다~
    모두의 ec2와 s3 가 무료는 아닐듯 해서요. 궁금증 입니다!

    1. baksimgorkii

      aws 내부의 트래픽이라서 ec2와 s3간의 전송 트래픽은 무료입니다.

  5. 501772

    엇. 문의 글이 없어진건지..
    ec2와 s3간의 트래픽은 무료이고요.
    이 글이요..
    같은 계정간에 무료 인거죠?

Leave a Reply

Your email address will not be published. Required fields are marked *