워드프레스는 웹사이트의 규모에 따라서 백엔드 아키텍처가 달라집니다. 같은 구조에서 수직 확장도 물론 가능하지만, 언제나 수평 확장이 유리하기 때문입니다. 저희 블로그는 이제 구축한 단계이므로 보통 난이도의 수평 확장을 염두에 둔 구조로 이루어져 있습니다. 핵심 키워드는 다음과 같습니다.

이번 글에서는 각 단계별로 설정 방법을 알아보고, 현재는 단일 EC2 (AWS Elastic Compute Cloud)에 구축되어있는 현재의 아키텍처를 어떻게 확장 가능한지 알아보도록 하겠습니다.

워드프레스 배포

AWS에서는 이미 잘 알려진 다양한 애플리케이션에 대해서 사전 정의된 이미지를 제공하고 있습니다. 워드프레스 웹사이트를 가장 빠르게 배포하는 방법은 이러한 사전 정의된 이미지를 통해서 EC2를 실행하는 것입니다.

다양한 워드프레스 이미지들이 보입니다.

우리는 이미 ALB를 사용하기로 결정을 한 상태였기 때문에 NGINX는 따로 필요가 없습니다. 그래서 위 목록에서 가장 첫 번째로 나타나 있는, Bitnami에서 제공하는 기본적인 워드프레스 이미지를 선택하였습니다. 사전에 AWS Marketplace를 구독할 수 있는 권한이 있어야 합니다.

그 후에 EC2의 타입과 VPC 정보, 스토리지, 보안 그룹 그리고 EC2에 엑세스하기 위해서 필요한 사설 키를 생성합니다.

외부 접근을 차단하기 위해서 Private Subnet에 배포하는 것을 추천합니다만, 해당 사설망에 연결되지 않은 경우에는 Private Subnet의 EC2에 접근하기 위한 별도의 Bastion Host를 필요로 할 수 있습니다. 그리고 보안 그룹에서 SSH 접근을 위한 22번 포트에 대해서만 인바운드 룰을 설정합니다. 소스는 관리자가 접근 가능한 아이피 혹은 Bastion Host로 설정합니다.

발급받은 PEM 키를 이용하여 EC2에 SSH가 정상적으로 접근이 가능한지 확인하고 그대로 커넥션을 유지합니다. 사용자 이름은 bitnami 입니다.

ALB와 ACM을 이용한 SSL

EC2가 배포되는 동안에 ACM으로 가서 SSL 인증서를 신청하도록 합니다. 혹은 기존에 발급받은 인증서 파일을 업로드하여 사용하는 것도 가능합니다.

필요한 서브 도메인 (blog, cdn-blog) 혹은 모든 서브 도메인에 대한 인증서를 신청합니다.

*를 이용한 모든 서브도메인에 대한 인증서 신청을 진행합니다.

Amazon에서 발급하는 공인 인증서 신청을 진행하면 도메인 인증을 위한 CNAME 레코드를 제공합니다. CNAME을 DNS에 등록하면 인증이 완료되고 인증서가 발급됩니다.

이제, EC2의 로드밸런서 항목으로 가서 신규 로드밸런서를 생성합니다. HTTPS 443 포트에 대한 리스너를 설정하고, ACM에서 생성한 SSL 인증서를 연동합니다. 보안 그룹은 443 포트의 모든 소스에 대한 인바운드 룰을 지정합니다. 대상 그룹을 생성할 때는 HTTPS 프로토콜로 443 포트에 대해서 생성하며, 대상은 위에서 생성한 EC2로 지정하면 됩니다.

로드밸런서 생성이 완료되면 HTTP 접근을 모두 HTTPS로 바꿔주기 위해서 HTTP에 대한 80 포트 리스너를 생성하여 443 포트로 리다이렉트를 설정합니다.

물론, 기존 로드밸런서에 연동하는 것도 가능합니다. 다른 호스트와 겹치지 않게 443 포트의 리스너에 규칙을 설정합니다. 호스트 헤더가 blog.opsnow.com인 경우에 대해서 대상 그룹을 앞서와 동일하게 설정합니다.

EC2에서 사용하는 보안 그룹에도 인바운드 룰을 하나 더 추가해야 합니다. ALB를 통해서 들어오는 사용자가 EC2의 워드프레스 접근이 가능하도록, ALB의 보안 그룹을 소스로 하는 443 포트에 대한 인바운드 룰을 EC2의 보안 그룹에 추가해줍니다.

워드프레스 접속 확인하기

앞서 EC2에 접속한 SSH 쉘에서 ./apps/wordpress/htdocs/wp-config.php 의 실행 권한을 660으로 변경하고 vi 에디터를 이용하여 wp-config.php에서 URL을 변경합니다.

//define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/');
//define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/');

define('WP_SITEURL', 'https://blog.opsnow.com');
define('WP_HOME', 'https://blog.opsnow.com');
Code language: PHP (php)

앞선 과정에서 생성된 ALB의 DNS 이름에 대해서 blog 서브 도메인에 대한 CNAME을 설정하고, DNS 레코드가 반영되기까지 잠시 기다립니다.

여기까지가 블로그 구동을 위한 필수 과정입니다. 이제, blog.opsnow.com으로 접속해보면 Hello World 게시물이 존재하는 가장 기본적인 워드프레스 화면을 볼 수 있어야 합니다.

이처럼 EC2와 ALB, ACM 기반의 HTTPS 워드프레스 블로그가 구축되었습니다!