マストドンのバックエンドに Google Cloud Storage を使う方法
先日マストドンのぼっちインスタンス、mstdn.okumin.com を Google Cloud Platform で構築しました。
その全体構成は『今流行りの #mastodon on Google Container Engine』で紹介しています。
この記事で述べられているように、mstdn.okumin.com はアイコンや投稿画像を保存する領域として、Google Cloud Storage を使用しています。
先程バックエンドに GCS を使う方法について質問を受けたので、Qiita にまとめておこうと思います。
Google Cloud Storage を使う理由
mstdn.okumin.com では、複数インスタンスからの読み書きを容易にするため、GCS を使用しています。
マストドンのプロセスのうち、アイコンや投稿画像の書き込みを行うプロセスは Web フロント(Rails) とバックグラウンドプロセス(sidekiq)の2つです。
前者はユーザーのアイコンアップロードなどを行うため、後者はよくわからんけどフォロイーのアイコンなどを保存するために書き込みを行います。
mstdn.okumin.com はこれらのプロセスをそれぞれ別の K8S Pod としてデプロイしているため、最小構成でも複数コンテナから同時に静的ファイルを書き込めるストレージを用意する必要があります。
最初は sidekiq が画像を保存すると知らなかったので永続ディスクを Web フロントにアタッチしていました。
永続ディスクは複数サーバからの同時書き込みができないようなので、問題が発覚したときは頭を抱えたのですが、GCS には S3 互換 API があるという情報を入手。
マストドンはストレージバックエンドとして S3 を使用することができるので、これを使うことにしました。
マストドンで GCS を使う方法
1. GCS のバケットを作る
適当なバケットを作ります。
この記事では「mstdn_bucket」というバケットを作ることにします。
2. S3 互換 API 用アクセスキー、シークレットキーを取得
(Amazon S3 からの)単純な移行に書かれている手順を参考に、アクセスキーとシークレットキーを取得します。
3. S3 を使うように設定する
.env.production.sample で触れられているように、環境変数を用いて S3 モードをセットアップすることができます。
設定値は、次のようになります。
S3_ENABLED=true
S3_BUCKET=mstdn_bucket
# 手順2で取得したアクセスキー
AWS_ACCESS_KEY_ID=GOOGXXXXXXXXXXXXXXXX
# 手順2で取得したシークレットキー
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# 多分なんでもいいと思うが、自分は次のように設定している
S3_REGION=ASIA-NORTHEAST1
S3_PROTOCOL=https
S3_HOSTNAME=storage.googleapis.com
S3_ENDPOINT=https://storage.googleapis.com/
ポイントは「S3_ENDPOINT」を設定する必要がある点で、これがないとうまく動作しませんでした。
まとめ
以上、S3 互換 API を使って GCS をマストドンバックエンドとして使用する方法でした。
mstdn.okumin.com は過剰な構成になっていて、技術的に語れる点が他にもあるので、暇があれば小出しにしていきたいと思います。
稼働中の Terraform と Kubernetes 設定ファイルを参考に書いたので間違ってはいないと思いますが、色々思い出しながら書いた部分もあるので、間違っていたら教えてください。