[Misskey] S3バケットへのアクセスをCloudFront経由にしました
概要
自分が管理しているおひとりさま用Misskeyサーバーで、オブジェクトストレージとしてAWS S3を使用しています。
これまではS3バケットを直接インターネットに公開していましたが、これをCloudFront経由に変更しました。
CloudFrontの設定については以下の記事を参考にしてください。
[駄場の部屋] S3バケットへのアクセスをCloudFront経由にしました
この記事では、Misskeyサーバーの設定について記載しようと思います。
ネットで検索するとCloudflare R2を使っている例は見つけたのですが、S3 + CloudFrontの例は見つかりませんでした。
Cloudflare R2だとエグレス料金が無料なので、この点はS3よりも優れているのかもしれません。
ただ自分の場合はすでにS3で運用していましたし、そこまで料金もかかっていないので、S3 + CloudFrontの構成で進めることにしました。
Misskeyの設定
コントロールパネルの「オブジェクトストレージ」から設定します。
自分の場合、設定値は以下のとおりです。
| 項目名 | 値 |
| Base URL | https://files.misskey-dabansky.com |
| Bucket | 使用するS3バケットの名前 |
| Endpoint | s3.ap-northeast-1.amazonaws.com |
| Region | ap-northeast-1 |
| Access key, Secret key | IAMユーザーのaws_access_key_idとaws_secret_access_key |
ここで指定するIAMユーザーはS3バケットにファイルをアップロードする際に使用するものです。
自分が使用しているIAMユーザーでは、Misskeyで使用するS3バケットに対して以下の操作を許可しています。
- s3:ListBucket
- s3:GetObject
- s3:PutObject
- s3:DeleteObject
データベースの更新
すでに運用しているサーバーの場合、Base URLを変更すると既存のファイルにアクセスできなくなります。
このため、データベースを更新して各ファイルのURLを変更する必要があります。
まずはデータベースのバックアップを作成します。
自分はデータベースをDockerコンテナとして実行しているので、以下のコマンドでpg_dumpを実行します。
docker exec -it misskey-db-1 pg_dump -U dabansky misskey-dabansky > db_backup_20260421.sql
自分の場合、Misskeyを更新する前に、関連するファイルをすべてtarballにしてバックアップするのですが、念のためこの手順も実行しておきました。
(この手順のためのシェルスクリプトを作成してあります)
おひとりさま用サーバーならデータ破壊しても困るのは自分だけなので問題ないですが、バックアップを作成しておくに越したことはないですね。
実際の更新作業に移ります。
今回自分が更新したのは、drive_fileテーブルとemojiテーブルです。
その他にも更新が必要なテーブルがあるかもしれませんが、ちょっとわかりませんでした。
データベースに接続します。
docker exec -it misskey-db-1 psql -U dabansky misskey-dabansky
影響を受けるレコード数を確認しておきましょう。
SELECT COUNT(*)
FROM drive_file
WHERE url LIKE '%s3.amazonaws.com%';
以下のフィールドを更新します。
- url
- thumbnailUrl
- webpublicUrl
BEGIN;
UPDATE drive_file
SET url = REPLACE(
url,
'https://<S3バケットの名前>.s3.amazonaws.com',
'https://files.misskey-dabansky.com'
)
WHERE url LIKE 'https://<S3バケットの名前>.s3.amazonaws.com%';
UPDATE drive_file
SET "thumbnailUrl" = REPLACE(
"thumbnailUrl",
'https://<S3バケットの名前>.s3.amazonaws.com',
'https://files.misskey-dabansky.com'
)
WHERE "thumbnailUrl" LIKE 'https://<S3バケットの名前>.s3.amazonaws.com%';
UPDATE drive_file
SET "webpublicUrl" = REPLACE(
"webpublicUrl",
'https://<S3バケットの名前>.s3.amazonaws.com',
'https://files.misskey-dabansky.com'
)
WHERE "webpublicUrl" LIKE 'https://<S3バケットの名前>.s3.amazonaws.com%';
問題なければCOMMITを実行してください。
emojiテーブルも同様に更新します。
SELECT COUNT(*)
FROM emoji
WHERE uri LIKE 'https://<S3バケットの名前>.s3.amazonaws.com%';
BEGIN;
UPDATE emoji
SET "publicUrl" = REPLACE(
"publicUrl",
'https://<S3バケットの名前>.s3.amazonaws.com',
'https://files.misskey-dabansky.com'
)
WHERE "publicUrl" LIKE 'https://<S3バケットの名前>.s3.amazonaws.com%';
問題なければCOMMITを実行してください。
以上の作業によって、過去にアップロードしたファイルにアクセスできるようになりました。
ただ、ちょっと記憶が曖昧で申し訳ないですが、プロフィール画像やバナー画像はこの手順を実施しても更新されなかったはずなので、Misskeyの画面から再度設定し直しました。
感想
本来はMisskeyサーバー自体へのアクセスも何らかのCDNを経由させた方がいいですね。
以前にCloudflareを試したのですが、Cloudflareを噛ませると、今使っているSSL証明書の更新の仕組みが動かなくなった記憶があります。
AWSを使っているのでAWSの仕組みに乗っかるのが一番簡単だと思います。
自分が今ぱっと思いつく構成だとEC2 + ALB + CloudFrontなのですが、おひとりさま用Misskeyサーバーのためにそこまでする価値があるのか…?
ALBを導入すると、毎月の支払いが確実に1万円は超えるでしょう。
そこまでアクセス数のない個人サイトを運営する上で、あんまり余計なコストはかけたくないですね。
まあ、理想を実現するためには金がかかる、っていうことで、この記事は終わりです。
( ˘ω˘)スヤァ