Ghost 블로그 AWS에서 운영하기 - 1. AWS Elastic Beanstalk에 설치하기

Ghost

Ghostnode.js 기반의 블로그 서비스이다. http://ghost.org/ 에서 블로그 호스팅 서비스를 신청하여 사용할 수도 있고, MIT license로 배포중인 설치형 블로그 소스를 사용하여 직접 서버에 설치해서 사용할 수 있다.

AWS Elastic Beanstalk

AWS Elastic Beanstalk는 AWS 에서 어플리케이션 웹 서비스를 간단하고 빠르게 실행할 수 있는 AWS의 핵심 서비스중에 하나이다. EBS(Elastic Beanstalk)는 개발자가 복잡한 AWS의 인프라환경을 구축하는 것을 함축적이고 간단하게 몇 단계만 거쳐 빠르게 서비스를 디플로이할 수 있도록 도와준다. EBS에서는 다양한 어플리케이션 서버를 운영할 수 있도록 Pyhton, Java, PHP, Ruby, .Net 그리고 Node.js를 지원하고 있다. 최근에는 Docker를 지원하여 거의 모든 어플리케이션 서비스를 할 수 있게 되었다.

우리는 Ghost 블로그를 AWS Elastic Beanstalk에서 운영하기로 결정 했고 이 문서에서 설치하는 방법을 소개한다.

Ghost 설치 및 development 환경 설정

Ghost 소스를 받는 방법은 여러가지가 있다. https://github.com/TryGhost/Ghost 에서 git를 사용하여 clone을 받을 수도 있고 또는 https://ghost.org/zip/ghost-latest.zip 링크를 통해서 가장 최신 소스를 받을 수 있다. 우리는 최신 안정화 버전을 zip 으로 받는다.

curl -L -O https://ghost.org/zip/ghost-latest.zip  

다운 받은 zip 파일의 압축을 푼다.

unzip ghost-lastest.zip  

Ghost 설정파일 수정

다운로드받은 소스를 살펴보면 config.example.js 파일이 존재한다. 이 파일은 Ghost 설정파일을 미리 만들어 놓은 것인데 이 파일을 config.js 파일로 복사한다.

cp config.example.js config.js  

config.js 파일을 열면 다음과 같이 환경에 따라 다양하게 설정을 변경할 수 있도록 각 환경에 관련된 설정을 확인할 수 있다.

config = {  
    production: {},       // 실제 서비스로 운영될 환경
    development: {},      // 개발 환경
    testing: {},          // 테스트 환경설정
    ‘testing-mysql’:{},   // Mysql 연동 테스트
    ‘testing-pg’:{}       // PostgreSQL 연동 테스트
}

우선 development 환경을 살펴보자.

    // ### Development **(default)**
    development: {
        url: 'http://localhost:2368',
        // #### Database
        // Ghost supports sqlite3 (default), MySQL & PostgreSQL
        database: {
            client: 'sqlite3',
            connection: {
                filename: path.join(__dirname, '/content/data/ghost-dev.db')
            },
            debug: false
        },
        // #### Server
        // Can be host & port (default), or socket
        server: {
            // Host to be passed to node's `net.Server#listen()`
            host: '127.0.0.1',
            // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
            port: '2368'
        },
        // #### Paths
        // Specify where your content directory lives
        paths: {
            contentPath: path.join(__dirname, '/content/')
        }

development의 기본적인 설정은 SQLite 를 사용하도록 되어 있다. 기본 포트는 2368이다. 기본적인 설정을 변경하지 않고 우리는 곧 바로 서버를 시작할 수 있다. 서버를 시작하기 전에 필요한 패키지를 설치해야한다.

npm install  

패키지를 설치한 다음 다음 명령어로 Ghost 서비스를 시작한다.

npm start  

다음과 같이 email 서비스 설정이 되어 있지 않다는 경고가 나타났지만, 서비스가 시작되면서 자동으로 SQLite 에 스키마 마이그레이션이 진행되며 정상적으로 서비스가 시작된 것을 확인할 수 있다.

이제 브라우저를 열어서 Ghost 서비스가 정상적으로 올라왔는지 확인해보자. http://localhost:2368 Ghost 의 아름다운 기본 theme를 가지고 정상적으로 서비스가 시작된 것을 확인할 수 있을 것이다.

앞에서 npm start로 서비스를 시작할 때 나타난 경고를 다시 한번 살펴보자.

WARNING: Ghost is attempting to use a direct method to send email.  
It is recommended that you explicitly configure an email service.  
Help and documentation can be found at http://support.ghost.org/mail.  

이 경고는 email 설정을 하지 않아서 나타난 메세지이다. 경고를 없애기 위해서 email 설정을 해보자. 가장 간단하고 쉽게 이메일 서비스를 설정하는 방법은 gmail을 사용하는 것이다. 또는 직접 운영하고 SMTP를 사용해도 상관없다. 내가 연구하고 있는 연구소에서는 AWS SES(Simple Email Service를 사용하고 있는데 SES를 바로 사용할 수 있도록 설정할 수도 있다.(http://support.ghost.org/mail/)

앞에서 development 환경설정에 관련된 프로퍼티 안에 mail 에 관련된 설정을 추가한다. 개인이 사용하고 있는 gmail 내용으로 대처한다.

mail: {  
    transport: 'SMTP',
    options: {
        service: 'Gmail',
        auth: {
            user: ‘gmail 메일 주소’,
            pass: ‘gmail 비밀번호’
        }
    }
}

메일 설정을 저장하고 npm start로 서비스를 시작해보면 이제 더 이상 경고 메세지가 나타나지 않는 것을 확인할 수 있다.

Ghost 웹 Dashboard

Ghost 를 설치하고 난 이후 Ghost의 웹 환경 설정은 dashboard에서 할 수 있다. Ghost의 dashboard는 http://호스트/ghost 와 같이 /ghost 라는 url에서 할 수 있다.

http://localhost:2368/ghost

가장 먼저 보이는 것은 기본 계정을 만드는 것이다. 이렇게 가장 먼저 생성된 계정은 이후 Admin 권한을 갖게 된다.

처음 계정을 생성하면서 다른 멤버들을 초대해서 팀 블로그를 할 수 있다. 멤버 초대는 시작할 때 하지 않아도 이후 dashboard에서 초대할 수 있다. 이 때 메일 발송으로 초대하는데 그래서 Ghost 설정 파일에서 mail 설정을 올바르게 할 필요가 있다.

계정이 생성되고 난 다음은 Dashboard로 들어오게 된다.

우리는 간단하게 Ghost를 환경을 설정하는 방법을 development 환경으로 살펴보았다. 이젠 AWS 에서 사용할 수 있도록 준비해보자.

AWS RDS 설정

위에서 development 환경에서 사용할 때 우리는 SQLite를 사용하였는데, AWS EC2에서 데이터를 저장하기 위해서는 AWS EBS(Elastic Block Storage)를 사용하거나 AWS RDS(Relational Database Service)를 사용 한다. 우리는 RDS를 사용할 것이다. AWS RDS에 관한 내용은 매우 방대하기 때문에 이 포스팅에서는 간단하게 RDS를 생성하여 필요한 Database를 생성하여 Ghost를 연결하는 방법만 소개할 것이다.

AWS RDS Dashboard에 들어가서 Launch a DB Instance 버튼을 클릭한다.

Select Engine 에서는 MySQL을 선택한다. 실제 서비스가 아니라면 Free Tier를 선택하면 된다.

Specify DB Details에서 Free Tier 조건을 넘기지 않으면 Free Tier로 생성이 된다. db.t2.micro Instance 타입에서 20GB 저장공간을 초과하지 않으면 Free Tier로 사용할 수 있다.

Configure Advanced Settings 에서는 네트워크와 보안설정, 그리고 Database 옵션을 설정할 수 있다.

AWS EBS 설정

AWS Console에서 Elastic Beanstalk를 선택한다.

EBS Dashboard가 열리면 Create New Application을 선택하여 새로운 어플리케이션을 추가한다. 우리는 어플리케이션 이름을 hbn-saltfactory-blog 라고 생성하였다.

새로운 어플리케이션을 추가한 이후에는 어플리케이션의 EBS environment 를 추가해야한다. Create one now 를 선택한다.

EBS envrionment는 Web server environment와 Work environment 두가지 타입으로 생성할 수 있는데 우리는 Ghost 서비스를 Node.js 서버 환경으로 운영하기 위해서 Web server environment를 선택한다.

Create a new environment 화면에서는 다음과 같이 설정한다. - Platform : Node.js - Application code : Sample application (또는 기존의 코드를 선택해도 된다)

기본적인 설정은 위와 같이 몇 가지만 설정하면 되지만 AWS VPC(Virtual Private Cloud 와 같은 환경을 설정하기 위해서는 Configuration more options를 선택하여 옵션 설정을 진행한다.

Envrionment settingsModify를 선택하여 Parameters를 다음과 같이 수정한다. Name은 EBS environment에서 중복되지 않는 이름으로 만든다. 우리는 hbn-ebs-env-saltfactory-blog-release 라는 이름으로 만들었다. Domain은 실제 웹 서비스를 접근할 수 있는 도메인으로 .ap-northeast-2.elasticbeanstalk.com 앞에 Name 이름과 동일하게 적어준다. 또는 필요에 의해서 자신이 원하는 이름을 사용해도 상관없다. 우리는 hbn-ebs-env-saltfactory-blog-release.ap-northeast-2.elasticbeanstalk.com 으로 도메인을 설정했다. 도메인 이름을 중복될 수 없다. 도메인 이름을 설정한 후 반드시 Check availability를 눌러서 중복 체크를 진행해야한다.

자신에 맞는 설정을 추가적으로 진행한다. (주의할 점은 만약 Free Tier로 사용하고 싶을 경우 Multiple Instances 를 사용할 수 없다. Single Instance만 사용해야 과금이 되지 않는다.)

EBS environment 가 정상적으로 생성되면 위에서 설정한 domain으로 접근할 수 있다. http://hbn-ebs-env-saltfactory-blog-release.ap-northeast-2.elasticbeanstalk.com/ 로 접근하면 다음과 같은 Sample Code로 만들어진 사이트를 볼 수 있다.

AWS EB CLI (Elastic Beanstalk Command Line Interface)

AWS EBS에 소스코드를 deploy 시키는 방법은 3가지가 있다.
- .zip 파일을 업로드 - S3 경로를 사용 - AWS EB CLIeb deploy 명령어 사용

우리는 AWS EB CLI를 사용할 것이다. 우선 EB CLI를 설치한다. Python이 미리 설치되어 있어야하며 pip를 사용하여 설치한다.

pip install --upgrade --user awsebcli  

만약 Mac 사용자라면 brew install awsebcli로 설치할 수 있다.

프로젝트 초기화

우리는 앞에서 ghost를 설치한 디렉토리로 이동을 하여 이 디렉토리를 앞에서 생성한 AWS EBS 의 프로젝트로 초기화 할 것이다.

eb init  

위 명령어를 입력하면 Select a default region 이 나오게 되는데 ap-northeast-2: Asia Pacific (Seoul)을 선택한다. 또는 해당 리전을 선택한다. 다음은 AWS EBS 에 생성한 어플리케이션을 선택한다. Select an application to use 에서 앞에서 생성한 hbn-saltfactory-blog 어플리케이션을 선택한다. http://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/eb-cli3-configuration.html 글을 참조

프로젝트 초기화가 끝나면 프로젝트 디렉토리 안에 .elasticbeanstalk/ 라는 디렉토리가 생성이되고 안에 config.yml 파일이 생성이 된다. 이 파일은 다음과 같다.

branch-defaults:  
  master:
    environment: hbn-ebs-env-saltfactory-blog-release
environment-defaults:  
  hbn-ebs-env-saltfactory-blog-release:
    branch: null
    repository: null
global:  
  application_name: hbn-saltfactory-blog
  default_ec2_keyname: null
  default_platform: 64bit Amazon Linux 2016.09 v3.3.0 running Node.js
  default_region: ap-northeast-2
  profile: null
  sc: git

EB CLIgit 와 깊은 연관성을 가진다. git에서 commit 이력을 보고 소스코드가 변경된 것을 감지하여 deploy 하기 때문이다.

.ebextensions (Advanced Envrionment Customization with Configuration Files)

앞에서 우리는 AWS Console에서 AWS EBS Dashboard를 사용하여 Environment를 생성하고 설정하였다. 하지만 AWS EB CLI를 사용한다면 .ebextensions 파일을 사용하여 EBS Envrionment 환경을 설정할 수 있다. 프로젝트 디렉토리에 .ebextensions 디렉토리를 만들고 안에 environment.config 파일을 다음 내용으로 생성한다.

option_settings:  
  - option_name: NODE_ENV
    value: production
  - namespace: aws:elasticbeanstalk:container:nodejs
    option_name: NodeCommand
    value: "npm start"
  - namespace: aws:elasticbeanstalk:container:nodejs
    option_name: NodeVersion
    value: "6.9.1"

Ghost Production 설정

우리는 앞에서 Ghost를 테스트하기 위해서 development 설정으로 실행을 했다. 하지만 AWS EBS에서는 production 환경으로 실행을 할 것이다. 이를 위해서 앞에서 .ebextensions에 보면 NODE_ENV 라는 환경변수에 production을 설정할 것을 확인할 수 있다. Ghost 의 환경을 수정하기 위해서 프로젝트 디렉토리 안에 있는 config.js 파일을 열어서 production 설정을 한다. 우리는 AWS EBS의 dashboard에서 환경설정 변수를 정의하기 위해서는 process.env.환경변수로 사용할 수 있다.

    production: {
        url: process.env.HBN_DOMAIN,
        mail: {
            transport: 'SMTP',
            options: {
                 service: process.env.HBN_SMTP_SERVICE,
                 auth: {
                     user: process.env.HBN_SMTP_USER, 
                     pass: process.env.HBN_SMTP_PASS  
                 }
             }

        },
        database: {
            client: 'mysql',
            connection: {
                host: process.env.HBN_MYSQL_HOSTNAME,
                user: process.env.HBN_MYSQL_USERNAME,
                password: process.env.HBN_MYSQL_PASSWORD,
                database: process.env.HBN_MYSQL_DATABASE,
                port: process.env.HBN_MYSQL_PORT
            },
            debug: false
        },

        server: {
            host: '127.0.0.1',
            port: process.env.PORT
        },

    },

config.js 파일 수정이 끝나면 AWS EBS Dashboard에서 Configuration 메뉴를 선택한다. 그리고 Software Configuration 안에서 환경변수를 앞에서 생성한 RDS 정보와 Gmail 정보로 저장한다.

이제 모든 설정은 끝났다.

Ghost deploy

이제 내 소스코드를 AWS EBS에 deploy 시키는 일만 남았다. AWS EB CLI의 deploy 명령어는 다음과 같다.

eb deploy  

터미널 창에서 소스코드가 업로드 되고 AWS EBS Environment가 업데이트된 것을 확인하면 앞에 정의한 도메인으로 접속하면 Ghost 서비스가 AWS EBS 정상적으로 올라온 것을 확인할 수 있다.