[Misskey] S3バケットへのアクセスをCloudFront経由にしました

概要

自分が管理しているおひとりさま用Misskeyサーバーで、オブジェクトストレージとしてAWS S3を使用しています。
これまではS3バケットを直接インターネットに公開していましたが、これをCloudFront経由に変更しました。

CloudFrontの設定については以下の記事を参考にしてください。
[駄場の部屋] S3バケットへのアクセスをCloudFront経由にしました

この記事では、Misskeyサーバーの設定について記載しようと思います。
ネットで検索するとCloudflare R2を使っている例は見つけたのですが、S3 + CloudFrontの例は見つかりませんでした。
Cloudflare R2だとエグレス料金が無料なので、この点はS3よりも優れているのかもしれません。
ただ自分の場合はすでにS3で運用していましたし、そこまで料金もかかっていないので、S3 + CloudFrontの構成で進めることにしました。

Misskeyの設定

コントロールパネルの「オブジェクトストレージ」から設定します。
自分の場合、設定値は以下のとおりです。

項目名
Base URLhttps://files.misskey-dabansky.com
Bucket使用するS3バケットの名前
Endpoints3.ap-northeast-1.amazonaws.com
Regionap-northeast-1
Access key, Secret keyIAMユーザーのaws_access_key_idaws_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万円は超えるでしょう。
そこまでアクセス数のない個人サイトを運営する上で、あんまり余計なコストはかけたくないですね。

まあ、理想を実現するためには金がかかる、っていうことで、この記事は終わりです。
( ˘ω˘)スヤァ

Misskey

Posted by maeda6uiui