※2024/03/29:ネットワーク構成図を更新+データベースサーバーの更新作業に関する課題を追記。Cloudflareへのドメイン登録作業に「SSL/TLS暗号化モードの設定」を追記。
IT技術に全く触れたことがないタダの「モノを書かずにはいられない性分の者」がAWSでMisskeyインスタンスを運用してみた。その所感は以前の記事で述べた通りである。今回の記事では、いったいどのようにしてインスタンスを立ち上げたのか、システム構成図などを交えて詳細に解説したいと思う。
前提として、データベース(Misskeyのユーザーデータや投稿の本体)があるサーバーは、ユーザーがアクセスできるWeb+appサーバーから切り離すものとする。加えて、Misskey本体がメモリを食い尽くす様子を見たため、Dockerは使用してインスタンス内で他にサービスを提供するのはやめておこうと思った。
前置きはここまでとして、今回説明する全体の手順は次のようになる。
- 全体の事前準備(クラウドネットワーク構築など)←この記事で説明するのはココ
- Web+appサーバーとして使用するEC2インスタンスでの作業
- DBサーバーとして使用するEC2インスタンスでの作業
- Misskeyのビルド+デプロイ+デーモン作成
- 定期バックアップ実行などの後処理
以下、EC2インスタンスの作業である旨は省略し「サーバーで~」などと表記する。
また、ここまでの手順は、一旦立ち上がったものを試行錯誤しながら組み上げたものであり、再現性に一部欠ける可能性がある点に留意してほしい。
▼目次
- 全体の事前準備
- ドメイン+メールサーバーの取得
- Cloudflareにドメイン登録+SSL/TLS暗号化モードの設定
- Cloudflare R2でオブジェクトストレージ設定
- AWSのクラウドネットワーク構築
- EC2インスタンスの立ち上げ
- CloudflareでのDNSレコード登録
- その他の準備
前回の記事:hal-2045.hateblo.jp
全体の事前準備
全体の事前準備は以下で構成される。
- ドメイン+メールサーバーの取得
- Cloudflareへのドメイン登録+SSL/TLS暗号化モードの設定
- Cloudflare R2でオブジェクトストレージ設定
- AWSでのクラウドネットワーク構築
- EC2インスタンスの立ち上げ
- CloudflareでのDNSレコード登録
- その他
ドメイン+メールサーバーの取得
MisskeyインスタンスのURLとなるドメインに加え、ユーザーがアカウント設定(主にパスワード変更)に使用するためのメールサーバーを用意する必要がある。今回はお名前ドットコムでドメインを取得し、同サービス+取得したドメインでお名前メール(エコノミープラン)を契約した。メールアドレスは"noreply@~"だとか"postmaster@~"だとかを設定しておこう。
メールアドレスの作成まで出来たら、DMARC認証をオンにしておく。手順が終了すると新しいDNSレコードがひとつ追加で発行される。やり方はこの通りだ。
- お名前ドットコムからお名前メールに遷移
- 左メニューのメールを選択。
- 上部の「メールセキュリティ」に移動
- ページ下部の「DMARC認証設定」をオンにする
この手順を踏むべき理由は、GmailやYahooメールで登録するMisskeyユーザーのためだ。これらのユーザーは送信ドメイン認証(SPF、DKIM、DMARC)が完備されたアドレスからでないとメールを受信できず、パスワードリセットなどで大いに困ることになる。私のようなほとんど知り合いだけの小規模インスタンスを運営するつもりならともかく、50人、100人と受け入れるつもりがあれば、ユーザーからの問い合わせに対応する時間なんて割けないし、ユーザー側でも面倒になって連絡しない……なんてことになる。送信ドメイン認証については下の記事に詳しい。
新潮流になるか?GoogleとYahooが発表した「今後は受信しないメール」の条件
どうでもいいが、先日ちょうど「Gmail宛にメールが届かなくてお偉いさんが頭を下げる」なんて事態が発生していた。こういうのを理解できるようになるのも、非IT系としてはためになった(前置きしたが完全に余談)
Cloudflareにドメイン登録+SSL/TLS暗号化モードの設定
Cloudflareのロードバランシング機能やキャッシュ機能などを使うため、まずはドメイン登録してネームサーバーを利用できるようにする。手順は以下の通り。
- Cloudflareのアカウントを開設する
- アカウントのホーム画面で「サイトを追加」を押す
- ドメインを入力、表示されるネームサーバーを確認
- ドメインを取得したサービスで上記ネームサーバーを登録※
- Cloudflareのアカウントに戻って、Webサイトがアクティブになるのを待つ
※今回ならお名前ドットコムになる。
手順4で示したお名前ドットコムの作業は次の通り。
ログイン→ネームサーバー設定→画面下部で「他のネームサーバーを利用」タブを選択→Misskey用に取得したドメインにチェックを入れ、ネームサーバー情報にCloudflareに表示されたサーバー情報を入れる→確認から手続き終了へ
Cloudflareでドメインがアクティブになるまで、最大で24時間くらいかかる。お名前ユーザーの私の場合は1時間ほどで済む。
▼ドメインがアクティブになったらやること(SSL/TLS暗号化モードの設定)
Cloudflareでドメインをクリックし、詳細設定の画面に入る。左メニューのSSL/TLSをクリックし、SSL/TLS暗号化モードを「フル(厳密)」
に変更しておく。
Cloudflare R2でオブジェクトストレージ設定
Cloudflareにアカウント登録すると、左側のメニューバーにR2というのが出てくる(登録したドメインをクリックすると出てこない。その場合はホーム画面に戻ろう)
R2とはAWS S3に相当するオブジェクトストレージのサービスだ。ここを押して、バケット作成から"misskey-image"だのなんだの、Misskeyに投稿される画像・動画を格納する場所であることが分かるような名前を付けておく。目的は左記のとおりで、実際にバケットの使用開始設定をするのはMisskeyのビルド+デプロイ+デーモン作成の後だ。
AWSのクラウドネットワーク構築
Misskey用になるべくセキュアなネットワークを立ち上げる。初めてAWSを使用する人はMFA認証の登録を忘れないように!
大体の手順は次の通り。
構成図にすると次の通り。
正直言って、セキュリティグループの設定で何とかしている感じ。ルール設定には過不足があるかもしれない。
Web+appサーバーとデータベースサーバーを分離、別のサブネットに置く。それぞれにセキュリティグループを作り、そこで最小限のネット構成を作る。DBサーバーを増やす(レプリケーションしつつフェイルオーバー設定をする)場合に備えて、セキュリティグループの単位でWeb+appサーバーのあるグループと通信できるようにルール設定しておく。さらに、DBサーバーを置いているサブネットのルートテーブルにはS3バケット用のVPCサブネットを作って紐づけておき、データベースバックアップ用のルートを確保しておく。
課題として、データベースサーバーの更新作業が挙げられる。今はNATゲートウェイを都度付け外しすることで対応している。
EC2インスタンスの立ち上げ
EC2インスタンスを2台立ち上げる。RDSを使えばいいのでは?というツッコミは気にしない。 概ねこんな感じ。
▼名前とタグ
web+appサーバーかDBサーバーか区別できるようにする。
ex."Misskey-web" "Misskey-db"
▼OSイメージ選択
Ubuntu22.04選択
▼インスタンスタイプ
今回はどちらもTタイプ(クレジットを消費してCPUパワーを使う)にした。
Web+appサーバーはメモリ4GBあると安心。
▼キーペア(ログイン)
まだない場合は新しいキーペアを発行する。
ダウンロードしたキーペアは、Windowsなら"C:\Users\$user.ssh"に移動させておく。あとでVScodeを使ってリモート接続するため。
▼ネットワーク設定
どちらも「編集」を押して、事前に設定したVPCとセキュリティグループを選択。
▼ストレージ
どちらも30GiBにする。
▼高度な設定
終了保護と停止保護をかける。
ここまで出来たら、ElasticIPを2台それぞれに関連付ける(DBサーバーの方は必要あるのか?)
CloudflareでのDNSレコード登録
Cloudflareにログインし、ホームからMisskeyに使用するドメインをクリックして遷移。
左メニューの「DNS」をクリックし、DNS管理でレコードを追加していく。追加するレコードは以下の通り。
▼Web+appサーバーに向けたAレコード
ドメイン+ElasticIPをAレコードで設定、プロキシはオン。
▼メールサーバー用のレコード
お名前ドットコムにログイン→お名前メールに遷移。左メニュー「ドメイン」をクリックし、Misskeyインスタンスで使う管理用メールアドレスの「DNS」をクリック。レコード一覧が出てくるので、これをちまちまと転記するようにしてCloudflareに登録していく。DMARC認証をオンにしていれば、登録すべきレコードとしてTXTレコードで出ているはず。
その他の準備
DeepLアカウントを開設し、APIキーを取得できるようにしておく。Misskeyインスタンス立ち上げ後にコントロールパネルでAPIキーを入力しておけば、ノート(投稿)の翻訳ができるようになる。
それ以外は特になし。
→次の記事 hal-2045.hateblo.jp