Mastdonインスタンス立ててみた in Azure #ssmjp

519 Views

May 29, 17

スライド概要

2017-05-29 #ssmjp mastodon
Azure上でマネージドサービスを使って
クラウドっぽくMastodonを動かしてみた話

profile-image

秋葉原生まれ大手町育ちの歌って踊れる江戸っ子インフラエンジニア。 0と1が紡ぐ「ゆるやかなつながり」に魅せられ早20年、 SNSとCGMの力で世界を幸福にするのがライフワーク。 市民、幸福は義務です。 あなたは幸福ですか?

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Mastodonインスタンス 立ててみた in Azure Aki@nekoruri 2017-05-29 #ssmjp

2.

Mastodon • Twitterっぽいアレ • 高頻度で短文が更新されるマイクロブログ • 添付ファイル(画像や動画)が付いたりする • 「フォロー」に基づいた購読・通知と雑なアクセスコントロール • 分散SNS(Federated Social Web) • 「Twitterっぽいアレ」をブログ更新通知などの仕組みで分散化を実現 • 割と死に体だったプロトコルも流用採用している • Rails上に教科書通りに分散システムを実装(非同期処理の多用) • 微妙な言い換え(ツイート⇒トゥート、等)

3.

日本におけるMastodon • 4月中旬に過剰とも言える流行の波 • 猫も杓子もといった流行期は脱出 • PixivのPawooやドワンゴのfriends.nico など、CGMサイトに対応するSNSとして 一定の存在感は引き続き確保 • 分散SNSの実現可能性を十分に示した 出典:https://friends.nico/@TaiseiMiyahara/10996911

4.

Mastodon用語 • インスタンス • 一つのドメインを持つMastodonシステム(例:mstdn.jp、pawoo.net) • インスタンス毎にその管理者が運用し、ポリシーを持つ • ネットワーク屋っぽく言えばAS(自律システム) • リモートフォロー • 別のインスタンスのユーザをフォロー(購読)する • ローカルタイムライン • 自分と同じインスタンスで発言された全ての公開トゥートのタイムライン • 連合タイムライン • ローカルタイムライン +インスタンス内の誰かがリモートフォローする全ての公開トゥート

5.

AzureにMastodonを立ててみよう 1. まず服を脱ぎます UbuntuのVMを立てます。 2. 外部からのHTTPSの接続を許可します。 3. Dockerとdocker-composeを入れます。

6.

あとは神チュートリアル資料の通り http://qiita.com/zembutsu/items/f1f1ede26102ba27fce2

7.

ほい

8.

9.

んなわけはない

10.

運用こそが本当の戦い • スケールアウト対応 • 添付ファイルがローカルファイル • DB(PostgreSQL/Redis)が同一ホスト内のコンテナ間接続 • ドメインの分離 • 「添付」画像は、トゥートに直接URLとして含まれる。 ⇒ あとからドメインの変更・分離は難しいので最初に対応すること • バックアップとか冗長化とか • ぶっちゃけもうデータベースの面倒なんて自分で見たくない ⇒ マネージドDB使おう • ぶっちゃけもうメール配信キューの面倒なんて(ry ⇒ マネージドSMTPサービス使おう

11.

オブジェクトストレージの変更 • Mastodon自体の機能としてはAmazon S3に対応 • S3互換のなにかを持ってくれば良い • Google Cloud Storageは標準のS3互換APIでそのまま通る模様 • s3proxy • S3互換APIを提供するプロキシサーバ • Azure BlobやOpenStack Swiftなどに保存できる • ローカルファイルにも保存できる ⇒ クラウド使わない場合もひとまずs3proxyでドメイン分離が可能

12.

オブジェクトストレージの変更 • Azure BlobがカスタムドメインのHTTPSができない • とりあえずCDNを挟んで回避 • Azure CDN from Verizonなら無償でHTTPS証明書取れます • 解説記事の通りにやれば良い • http://blog.tmyt.jp/entry/2017/04/19/202922 『今話題のMastodonインスタンスを建ててS3の代わりに Azure Blob Storageを使う』 • paperclip.rb へのパッチは既に不要

13.

データストアのマネージドサービス化 • メインのDBはPostgreSQL • いやっふう! Azure Database for PostgreSQLプレビュー来た! • 内部のPubSubなどにRedis • Azure Redis Cache

14.

PostgreSQLの切り替え • PortalからAzure Database for PostgreSQL構築 • 接続のセキュリティとか適当に設定 • データ移行 • とりあえずpg_dumpで吸ってpsqlで投入 • 設定変更してdocker-composeあげ直し • docker-compose.ymlでdbを削除 • .env.productionに接続情報

15.

Redisの切り替え • Redis Cacheを構築 • とりあえずテストでSSL無しで検証(時間不足) • 設定変更してdocker-composeあげ直し • docker-compose.ymlでredisを削除、.env.productionに接続設定 • 注意点 • Mastodon側で利用するRedisライブラリがSSL非対応 「NotImplementedError (SSL not supported by hiredis driver)」 • アクセスキーに「+/」が入ると駄目 • URLエンコードすればParseは通るが、デコードされずにサーバに投げられる! • ライブラリ周りの組み合わせのバグっぽい • 当たりを引けるまでアクセスキー再生成ガチャを回せば回避可能(ひどい)

16.

メール配信の切り替え • みんなだいすきSendGrid • Azureマーケットプレイス経由でも利用できるけど、 今回は構造計画研究所さん経由 • 設定変更してdocker-composeあげ直し • docker-compose.ymlでmtaを削除、.env.productionに接続情報 • ルート証明書ストアを適切に設定する必要がある (が、所詮通知だけと割り切って検証しない設定も可能) • メールなのでDNS設定も • SendGridのDomain Whitelabel機能を設定⇒DNSにレコード登録 • SPF/DKIMともにPASSできる

17.

最終的な構成 SendGrid 画像など Web/Streaming docker-compose管理 AzureCDN Azure Blob 外部 インスタンス frontend (nginx) s3proxy web (rails) Redis (managed) streaming (node) sidekiq (worker) PostgreSQL (managed)

18.

その他の課題 • コンテナ管理 • 監視

19.

コンテナ管理 • コンテナ数などの管理 • ウェブアプリだけでなく、非同期タスクのスループットが重要 • 負荷に応じたワーカーの制御が必要 • そもそもdocker-composeとか手で叩く時代じゃない • GKEみたいなのが欲しい • Azure Container Serviceでそれっぽくできそう • 結局はコンテナのスケジューリングの問題に行き着く

20.

監視 • 一般的なサーバ性能メトリクス • CPU、メモリ • Sidekiqキュー • 規模が大きくなるとここが詰まる模様 • 複数のキューごとにプロセス分離など • マネージドサービスのメトリクス • PostgreSQL • Redis • サービス死活 • ユーザの投稿内容 • 自インスタンスのユーザの投稿の違法性 • Federate先のユーザから流れてきた投稿の違法性

21.

まとめ • Azureでもクラウドっぽくできマストドン • Azure Database for PostgreSQL万歳! • AWS Certificate Managerの影に隠れているけど、 Azure CDNもDigiCertのフルマネージド証明書が取得/利用可能 • 手抜きしたけどLB最初から挟んだ方が良い • もうステートレスになってるから、LB挟んで増やせばOK • ちなみに1月からMicrosoft MVPになりました • みんな祝って! • 今後も基本はベンダーニュートラルでやっていきます。 <良 い モ ノ は 良 い>

22.

で、誰? • Aki (@nekoruri) • BLEなIoTシステムの クラウド側担当 • ちょろっと執筆も • 「薄い本」も出しています • 最近はすっかり セキュリティ教育畑に…… • セキュリティ・キャンプ プロデューサー • SecHack365 実施協議会委員 • ProjectDIVA Arcade LV.623 NEW!