mastodonにwasabiのオブジェクトストレージを組み込み、設定する。

以前自鯖を使用していた際にアップデートなど思い当たる節がないのにも関わらず、何故かあの見慣れた「ゾウがPCバンバンする画面」が現れた。

特に思い当たる節が本当になかったので、色々調べたら、「ストレージの容量がパンパンで、他のユーザーのデータを読み込めなくなってる」という説が浮上。以下のコマンドで調べてみる。

user@vultr:~#df -h

すると、案の定容量がパンパンだということがわかった。結構容量食うのよね…

 と、いうことでMastodonのユーザ投稿ファイルをサーバ内に保存せずオブジェクトストレージにアップロードする機能を使うことに。

Misskeyの場合はオブジェクトストレージの設定をGUIのような感じで結構直感で出来るが、mastodonはできないので、そのやり方をここに記しておく。

なんでwasabi

と、言ってもオブジェクトストレージを展開しているサービスというのは沢山ある。それこそ私が自鯖を保有しているvultrもオブジェクトストレージのサービスを持っているし、国産のConohaやAWSのS3などなど…挙げたらキリがないわけだが…

その中でもwasabiを選んだ理由は

1発でwasabiは設定を成功したから&安いから

である。

そもそもWasabiはAPIがAWS S3互換のオブジェクトストレージサービスであり、何より利用料金が非常に安価であるのが特徴。GBあたりの料金だと $0.0049 per GB/月、日本円で約0.72円。2022年11月現在、円安が進んでいるが、1円かからない。とりあえずこれ選んどけば間違いないし、お財布にも優しいし、めんどくさい設定はほぼないからいいよね、ってことで。

ちなみに私が設定した際、下記のQiitaの記事を参考にしたが、如何せん記事自体の最終更新日が2019年なので、wasabiのUIなども色々変わっていた。

https://qiita.com/mecaota/items/365fa9330366e74f756a

なので、画像など諸々を2022年現在のUIに変えたバージョンってことで、1つ宜しくお願い致します。

ほな、つくりまっせ~

Bucketを作る…の前に。

bucketを作る前に、wasabiのアカウントを作ってない人はまず作る。

https://wasabi.com/ja/

アカウントを作る際は「アカウントを作成」的なボタンは無い模様。「無料トライアル」をクリックしてスタートする。

アカウントを作り終え、コンソール画面を開くと、左上の「wasabi」マークに赤文字で「trial」と出ているはずだ。

無料トライアルってことで、wasabiのアカウントを作る際は、作ってから30日間はお金がかからないようだが、残念ながらトライアル枠だとオブジェクトストレージへの設定ができない。どうもトライアル枠には制限があるようだ。なので、クレジットカードを登録しないとできない。なので、左下の「billing」から支払方法を設定する。

とんだ画面で「Payment settings」のボタンから支払方法を設定。

その後、コンソール画面に戻ると、左上の赤文字の「trial」という文字が消えているはずだ。これで本登録会員ユーザーになった。ここから、本格的にオブジェクトストレージを作る。

Bucketを作る

オブジェクトストレージというのはあくまでサービスの単語であり、イメージとしては、今から作る「Bucket」という大きな箱に画像などのデータを入れていく感じ。なのでその箱を作る。右上にある「CREATE BUCKET」というボタンをクリック。

「Select Bucket Name」はBucketの名前。今回ここでは「mstdn-objectbox」としよう。

「Region」はそのサーバーの設置場所。なんか記憶ではアメリカしかなかった気がするが、気付いたらいっぱいニョキニョキ生えてた。日本に住んでるなら無難に「Tokyo」にすべきなんじゃないかな。ここではTokyoで制作する前提として見ていただきたい。

ちなみに「Tokyo」を選んだ際、その横に書いてある「ap-northeast-1」「s3.ap-northeast-1.wasabisys.com」は後で入力するので今のうちにメモっておこう。あと選んだリージョンごとにこの2つの部分は違うので柔軟に対応する事。

Quick Setupは無視。Quick Setupは既存の既に持っているオブジェクトストレージをコピーしたりするときに使用する模様。

名前とリージョンを設定したら「NEXT」の左側にある「CREATE BUCKET」をクリック。BUCKET一覧に追加されているはずだ。

箱はできたので、その箱の詳細部分を触っていく。BUCKET名をクリックし、右側にある歯車マークをクリックする。

POLICIESタブをクリックすると、コンソール画面が出てくる。

ここに、以下のコマンドをコピペする。下記文字列をコピペする。{your-bucket-name}の部分にはさっき設定したBUCKETの名前を入れる。

従って、「mstdn-objectbox」と設定したのであれば"Resource": "arn:aws:s3:::mstdn-objectbox/*"となる。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AddPerm",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::{your-bucket-name}/*"
    }
  ]
}

その後、右下にある「SAVE」を押す。これでこのbucketの中身に誰でもアクセスできるようになる。もちろん読みに来ることしか出来ないのでご安心を。

USERを作る

箱を作り、その箱を設定も出来た。ただ、今のままだとただ箱が置いてあるだけである。箱に画像やデータを出し入れするには、その画像やデータを出し入れする権限を持つユーザーが必要だ。その為、今からそのユーザーを作る。左のメニュ―タブにある「Users」をクリックし、右上の「CREATE USER」をクリック。

UsernameはBucket名同様、テキトーに好きなものを入力。今回は「mstdn-user」としておく。そして、ここで「Type of Access」の「Programmatric(Create API Key)」にチェックを入れる。ここを忘れずに。終わったら次へ。

続いてグループの設定。1つのオブジェクトストレージしか管理しないのであればぶっちゃけ必要ないが、まぁ、万が一のために作っておく。特に意味はない。「+CREATE A GROUP」をクリックし、グループ名を好きに入力し、「SAVE」を押してグループ制作完了だ。今回は「wasabidaisuki-club」とした。ちなみに僕はワサビは特段好きってわけでもない。あ、でも寿司は必ずワサビ有りにしてる。寿司おいしいよね。

終わったらスクロールして右下の「NEXT」をクリック。

この後に出てくる「Policies」に関しては後々設定するので、何も考えずどんどん次に進み、「CREATE USER」をクリックする。

すると、「Access Key」「Secret Key」が発行される。下に「COPY KEYS TO CLIPBOARD」という文字がある。それをクリックすると2つのキーをコピーしている状態になる。メモ帳とかにペーストして忘れないようにすること。後々Mastodon側で設定するときに使う。

特にSecret Keyに関しては、再発行が出来ない。忘れたらAPI key発行からやり直さないといけなくなるので注意。あとこの画面が出るのが数秒後なので、間違えて×ボタンを押したりしないように。

USERのPolicyの設定

とりあえずUSERを作ったが、今のままだとこのユーザーは箱の中身を見れはするが、出し入れはできない。要は箱の中を見学してる一般客状態である。ここに書き込み権限を与えて、箱の中身を操作できるようにする。

左側のメニュータブから「Policies」を選び、右側の「CREATE POLICY」をクリックする。

次の画面で、「Policy name」と「Policy Document」を設定する。真ん中の「Description」はそのPolicyの説明欄なので、必ず書かないといけないところではない。空欄でおk。

「Policy name」は自分の好きな名前に設定。今回は何も考えず「mastodon-policy」にしておく。「Policy Document」は下記の文字列をコピペ。例によって{your-bucket-name}の部分にはさっき設定したBUCKET名を入れること。

「mstdn-objectbox」と設定したのであれば、"Resource": "arn:aws:s3:::mstdn-objectbox/*"となる。

さっきとの違いは、今回は{your-bucket-name}の部分が2ヶ所あるので注意。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::{your-bucket-name}"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": "arn:aws:s3:::{your-bucket-name}/*"
    }
  ]
}

終わったら下の「CREATE POLICY」ボタンを押して保存する。これで、この権限を設定したユーザーやグループからのAPIアクセスに対してデータの書き込み・読み取り・削除権限が付与される。

では、次はこのPOLICYをグループに対して適用させる。左側のメニューから「Groups」を選び、さっきUSER制作時に作ったグループ名をクリック。私の場合は「wasabidaisuki-club」が存在するはずなので、それをクリック。

まずは使用するユーザーがしっかりグループに所属されているか確認。下にスクロールして、「Assigned Users」のタブを開いて、さっき作ったユーザーの名前が出たらおk。

その後、Policyを反映させるには、その下の「Policies」に移動し、検索欄にさっき設定したPolicyの名前を検索する。サジェストが出てくるので、途中で多分出てくる。

その後、サジェストに出てきたものをクリックしたら、右の「Assigned Policies」の部分にそのPolicy名が現れる。これで設定完了だ。そのグループにPolicyを反映させることに成功した。「SAVE」といったボタンが無いので不安になるが、大丈夫だ。

以上で、Wasabi側の設定は全て終わった。Mastodon側の設定に移動する。

Mastodon側の設定

※non-dockerを前提に解説しますので、dockerインストールの方は適宜置き換えてください。

Mastodonのサーバーにコンソールでログインしたら、mastodonのディレクトリに移動し、「.env.production」を開く。

そしたら色々書かれていると思うので、一番下に移動したうえで下記の項目を追記する。

S3_ENABLED=true
S3_BUCKET={bucket名} # 設定したバケット名
AWS_ACCESS_KEY_ID={access key} # USERで制作したAccessキー
AWS_SECRET_ACCESS_KEY={secret key} # USERで制作したSecretキー
S3_REGION=ap-northeast-1 # Tokyoの場合はこのままコピペ。
S3_PROTOCOL=https
S3_HOSTNAME=s3.ap-northeast-1.wasabisys.com # Tokyoの場合はこのままコピペ。
S3_ENDPOINT=https://s3.ap-northeast-1.wasabisys.com # Tokyoの場合はこのままコピペ。

書き換えが終わったら、systemctl restart mastodon-*でmastodonのサービスを全て再起動させる。すると次回起動時からmastodonのメディアは全てwasabiに保存される。一度テキトーに画像ファイルなどをアップロードして、ちゃんと表示されるか確認し、表示されたら接続完了である。

Q:アイコンやヘッダー、画像投稿が全部真っ暗になり、表示できなくなった。

A.再起動後、全ての画像などのメディアはwasabiの方へ行くようになったので、既存のデータの保存場所であるローカルのストレージを読み込まなくなった。従って、アイコンなどを事前に設定していた場合は「そのデータ、wasabiにないやん!」となり、真っ暗になるという仕組みだ。もし、過去の画像投稿などがどうでもいいのであれば、改めてアイコンなどはアップロードすれば治る。

おまけ:wasabiと既存のMastodonデータを同期。

これは新規に鯖を建てて、今から利用を開始する場合は特にいらない作業である。

まず、Mastodonが動作するOSに、aws-cliをインストールする。AWSやAWS互換SaaSと接続する為のコマンドツールだ。ちなみにこれ、python製なので、python(3系でOK)を導入した上で、python3-pipをインストールする。

OSはUbuntu上で動作している(パッケージマネージャがaptの場合)前提で解説する。

$ sudo apt install python3
$ sudo apt install python3-pip

pythonとpip導入後、pipでawscliをインストール

$ pip3 install awscli

その後、AWS CLIの設定をしたいので、以下のコマンドを叩く

$ aws configure

AWS CLIの設定画面が開いたら、wasabiで発行したAccess keyとSecret keyをそれぞれAccess Key IDSecret Access Keyで入力。Default Regionはwasabiのbucket一覧にかかれているRegionの項目を入れる。今回の場合だとTokyoなので、ap-northeast-1となる。。Default output formatの部分は無視。

設定が終わったら、その設定を同期し、有効化する。

Mastodonのディレクトリに移動して、public/system以下に入っているファイルを全て転送する。今回の場合は、{bucket名}にはmstdn-objectboxが入る。なお、選択したリージョンによってendpointが異なるので、注意。

今回の場合はTokyoなので、以下のようになる。

$ aws s3 sync public/system s3://{bucket名}/ --endpoint-url=https://s3.ap-northeast-1.wasabisys.com

これでMastodonの既存メディアフォルダと、wasabiとの同期がスタートする。

まとめ

多分探せばもっと安いし簡単なやり方があると思うが、wasabiは結構他の鯖缶の人も愛用しているイメージが勝手にあるので、いいかなぁと思った。結構オブジェクトストレージ設定の記事って、あんまり無いのよね。探したけど。海外ニキの記事とかもありますが、一番これがシンプルで分かりやすかったかなぁと思いました。

説明がバカほどへたくそなんで、分かりづらかったりしたらコメントくださいまし。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です