Amazon Lightsail 에서 Ghost 블로그 운영하기 #4. Amazon S3 연동 외부저장소 설정

Ghost를 운영할 때 Amazon S3를 이용하여 외부 저장소 환경을 만들어 안전하고 유연한 저장소 환경을 설정하는 방법을 소개한다.

Amazon Lightsail 에서 Ghost 블로그 운영하기 #4. Amazon S3 연동 외부저장소 설정
Photo by William Warby / Unsplash

Amazon Ligtsail 을 사용하면 정해진 금액에 정해진 용량을 사용해야한다. 만약 $7 사이즈를 선택해서 서버를 구축했다면 스토리지 공간이 40GB 이다. 운영체제 기본 사이즈가 약 2GB 정도 되니 38GB 정도만 사용할 수 있다. 만약 Ghost에 사진을 올린다면 요즘처럼 고화질 사진을 올리게 될 때, 저장공간은 금방 부족해질 것이다.

그래서 저장공간을 확보하기 위해서 파일첨부가 되는 저장공간을 AWS S3를 사용하기로 한다. Ghost 공식 사이트에서 AWS S3 와 Ghost 의 연동에 관련된 내용을 소개하고 있다.

공식 문서에서는 Amazon S3저장소를 연동하는 2가지 어댑터를 소개한다.

두가지 어댑터 중에 2번째 어댑터를 사용하는 방법을 소개한다. 첫번째 어댑터는 최근 Ghost 에서 연동하는데 adapter 인식을 하지 못하는 이슈가 있기 때문이다.

Amazon S3 버킷 생성 및 설정

Amazon S3를 저장소로 사용하려면 Amazon S3 에 접근 가능한 credentials 이 필요하고 S3 버킷이 필요하다. AWS 에 가입을 했고 S3에 접근 가능한 credentials 이 있다고 생각하고 진행하도록 하겠다.

Amazon S3 에서 Create bucket 버튼을 선택하여 Ghost 저장소로 사용할 새로운 버킷을 만들자. 혹시 기존의 버킷을 그대로 사용해도 상관없다.

새로 생성할 버킷 이름은 각자 원하는 이름으로 입력한다. 나는 ghostblog-sungkwang-dev라고 생성할 예정이다.

다른 설정은 기본으로 그대로 두고 Block Public Access settings for this bucket 에 대한 설정을 모두 체크하지 않도록 한다. 이렇게 모두 체크하지 않으면 public 으로 접근 가능한 버킷이 된다. Amazon S3 보안에 관해서는 따로 소개할 예정이다. 지금 주제는 Ghost 저장소로 S3를 사용하기 위한 public 접근 가능한 저장소를 만드는데 목적을 둔다.

다음은 Object Ownership을 설정하는데 기본값은 ACLs disabled(recommended)로되 설정되어 있다. 이것을 ACLs enabled로 수정한다. 그리고 동의항목에 체크를 한다.

다른 설정은 모두 그대로 두고 마지막으로 Create bucket 버튼을 선택한다.

Create bucket 버튼을 선택하면 다음과 같이 S3 에 새로운 버킷이 생성된다.

이제 S3의 권한을 설정한다. AWS 사용자 credentials을 가지고 접근할 경우 S3 의 모든 액션을 사용할 수 있는 권한을 지정하고, 그 외 GetObject 액션만 허용해서 파일을 읽어가는 권한만 주도록 한다.

방금 생성한 버킷을 선택하면 Permissions 링크가 보이는데 선택한다. 버킷을 생성할 때 Block access에 관한건 모두 체크를 해지해서 넘어가고 Buket policy 의 Edit를 선택한다.

Policy 의 Edit 버튼을 선택하면 에디터가 나오는데 여기에 JSON 타입으로 Policy 를 정의할 수 있다. 오른쪽에 문법을 도와주는 리소스가 있으니 선택해서 하나씩 추가해도 된다. Add new statement 를 선택하면 새로운 statement가 추가된다.

다음 내용을 참조해서 입력하면 된다.

  • Principal: 접근하는 대상을 선택한다. AWS S3에 접근할 수 있는 credentials을 만들었다면 arn 으로 참조 가능하다. 아래 stmt-1 의 Principal의 AWS 를 참조해서 입력한다.
  • Action: 정의한 리소스의 액션에 대한 범위를 정의한다. 모두 선택할 때는 * 를 사용한다.
  • Resource: 사용할 리소스를 정의한다. arn 으로 S3에 생성한 버킷이름을 지정하는데 아래 코드를 참조해서 입력하면 된다. 새로 생성한 s3 의 버킷은 ghostblog-sungkwang-dev 이고 이를 리소스로 정의할 때는 arn으로 아래와 같이 정의한다.
{
    "Version": "2012-10-17",
    "Id": "20240910",
    "Statement": [
        {
            "Sid": "stmt-1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::1234567890:user/user-ghostblog-sungkwang-dev"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::ghostblog-sungkwang-dev",
                "arn:aws:s3:::ghostblog-sungkwang-dev/*"
            ]
        },
        {
            "Sid": "stmt-2",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::ghostblog-sungkwang-dev",
                "arn:aws:s3:::ghostblog-sungkwang-dev/*"
            ]
        }
    ]
}

Ghost에 ghost-storage-adapter-s3 설치

Amazon S3에 버킷을 생성했으면 이제 서버에 접속해서 ghost-storage-adapter-s3를 설치한다.

cd /var/www/ghostblog.sungkwang.dev
npm install ghost-storage-adapter-s3
sudo mkdir -p ./content/adapters/storage
sudo cp -r ./node_modules/ghost-storage-adapter-s3 ./content/adapters/storage/s3

Ghost 설정에 S3 어댑터 설정 추가

Ghost 디렉토리 안에 Ghost 설정을 담당하는 파일은 config.production.json 파일이다. 설정 파일에 S3 어댑터에 대한 내용을 추가한다. 설정파일에 아무런 추가 설정을 하지 않을 경우 S3 어댑터는 storage 속성으로 정의한다.

  • accessKeyId와 secretAccessKey는각자의 credentials로 입력하면 된다.
  • bucket: 앞에서 생성한 Ghost 의 저장소가 될 S3 버킷 이름을 입력한다.
  • region: AWS S3를 생성할 때 정의한 지역인데 대한민국은 ap-northeast-2 이다.
  "storage": {
    "active": "s3",
    "s3": {
      "accessKeyId": "{{AWS IAM credential accessKeyId}}",
      "secretAccessKey": "{{AWS IAM credential secretAccessKey}}",
      "bucket": "ghostblog-sungkwang-dev",
      "region": "ap-northeast-2",
      "forcePathStyle": true
    }
  }

이제 모든 설정이 끝났다 Ghost를 ghost-cli를 이용하여 재시작 한다.

ghost restart

이제 실제 업로드한 파일이 S3 에 저장이 되는지 확인해보자. Ghost 블로그 Dashboard에 로그인해서 글을 작성할 때 이미지를 업로드해보자. Ghost Dashboard 주소는 도메인뒤에 /ghost 를 추가한다.

https://ghostblog.sungkwang.dev/ghost

처음 관리자 계정을 만들었다면 로그인 후 Dashboard로 바로 접근 가능하고, 만약 블로그 포스팅을 순서를 따라왔다면 관리자 계정을 만들지 않아서 아래와 같이 관리자 계정을 생성하는 화면이 나온다. 정보를 입력하고 가입하면 된다.

새로운 Post를 추가하고 사진을 올려보자

사진이 정상적으로 업로드가 된 것을 확인할 수 있다. 사진이 우리가 설정한 Amazon S3에 저장되었는지 AWS Console 에서 확인해보자.

Ghost 에서 업로드한 사진이 S3 버킷 안에 2024/09/ 패스 안에 만들어진 것을 확인할 수 있다.

이번 포스팅에서는 Ghost 의 저장소를 서버 인스턴스가 아닌 Amazon S3를 연동해서 외부에 파일을 저장하는 저장소를 구축하는 방법을 소개했다. Amazon Lightsail은 매달 일정금액에 대해서 제한적인 용량을 사용하기 때문에 용량을 많이 찾이하는 첨부파일 저장소를 S3를 이용해서 외부에 운영하게되면 제한적인 저장소 용량을 안전하게 확장해서 운영할 수 있다.

다만, 이렇게 운영할 경우 S3의 비용이 추가적으로 발생할 수 있다. 처음 AWS를 시작할때 Free Tier를 가지고 운영할 수 있겠지만 Free Tier 서비스가 만료되면 S3의 과금이 추가적으로 발생할 수 있으니 실제 운영시에는 자신의 운영정책에 맞게 운영해야 한다는 것을 주의하자.

질문 및 의견을 남겨주세요 >