2017/04/29
きりのみなと
mastodon.chotto.moe
on AWS
全体構成
1
DBサーバ(RDS)
db.t2.micro
Mastodon鯖
t2.large
Redis(ElastiCache)
cache.t2.micro
ロードバランサ
ACM+ALB
メディアファイル
S3Bucket+
StaticWebHosting
CDN(CloudFront)
メール通知
SES
権威DNS
Route53
Mastodon
ユーザ
全体構成における考え方
 AWSマネージドサービスを活用する
– メールサーバを立てずSESを使う
 データは腹持ちさせない
– PostgreSQLはRDSに任せる
– RedisはElastiCacheRedisに外出しする
– メディアファイルはS3バケットに保持させる
– Docker-composeでMastodon本体をバージョンアップす
る時にシビアにデータの保持を考えなくて済むため
2
全体構成における考え方
 ユーザ通信は全て暗号化させる
– ALBはAWS Certificate ManagerのSSL証明書を使い、
Mastodonの設定でHTTP to HTTPSリダイレクトさせる
– メディアファイルはCloudFront + S3バケット(静的ウェ
ブホスティング)でHTTPS上でコンテンツ配信する
– ユーザはメールアドレス+パスワードを入力してログ
インするのにHTTP通信なのはとてもマズい
– HTTPSサイトの中からCSS/Javascript/Websocket等の外
部コンテンツをHTTPで呼び出すとブラウザ側でエラー
になるので、全通信をHTTPS化する必要がある
3
Mastodon鯖の構成
 DB/Redisを外出ししているので、本家の
Docker-compose.ymlを少し修正して利用
 一つのインスタンス上に、ポートを分けて以下
3つのMastodon環境を同居させている
– jitakurack.chotto.moe
– mastodon.chotto.moe
– ステージング環境
 今のところ冗長化はしていない
– なのでMastodonのバージョンアップ中は落ちますw
4
Mastodon鯖のスペック
 EC2 t2.largeを利用
– vCPU 2core
– Mem 8GB
– EBS only
 CPUよりはメモリが大事
5
Ubuntu 16.04 LTSへMastodonを導入
1. Docker + Docker Compose の導入
– 公式ドキュメントに沿ってDockerをまず導入
 Get Docker for Ubuntu
https://docs.docker.com/engine/installation/linux/ubuntu/
– Docker導入後、Docker Composeを配置
 Install Docker Compose
https://docs.docker.com/compose/install/
2. Mastodonのリポジトリの取得
– 本家のコードを手元にクローンする
 git clone https://github.com/tootsuite/mastodon.git
6
Ubuntu 16.04 LTSへMastodonを導入
3. docker-compose.ymlを編集
– 公式だとPostgreSQL/RedisもDocker Imageを利用する
が、RDS / ElastiCacheを利用するので該当部分をコメ
ントアウトする
7
version: '2'
services:
web:
restart: always
build: .
image: gargron/mastodon
env_file: .env.production
command: bundle exec rails s -p 3000 -b '0.0.0.0'
ports:
- "3000:3000"
volumes:
- ./public/assets:/mastodon/public/assets
- ./public/system:/mastodon/public/system
streaming:
restart: always
build: .
image: gargron/mastodon
env_file: .env.production
command: npm run start
ports:
- "4000:4000"
sidekiq:
restart: always
build: .
image: gargron/mastodon
env_file: .env.production
command: bundle exec sidekiq -q default -q mailers -q pull -q push
volumes:
- ./public/system:/mastodon/public/system
Ubuntu 16.04 LTSへMastodonを導入
4. .env.productionを編集
– ElastiCache Redis周り
 REDIS_HOST=${ElastiCacheクラスタエンドポイント名}
 REDIS_PORT=${ElastiCacheポート番号(デフォルト6379)}
– RDS PostgreSQL周り
 DB_HOST=${RDSインスタンスDNS名}
 DB_USER=${DBユーザ名}
 DB_NAME=${DBスキーマ名}
 DB_PASS=${DBパスワード}
 DB_PORT=${RDSサービスポート番号(デフォルト5432)}
8
Ubuntu 16.04 LTSへMastodonを導入
4. .env.productionを編集
– SES周り
 SMTP_SERVER=${SESエンドポイント名}
 SMTP_PORT=587
 SMTP_LOGIN=${IAMユーザのSMTP ID (AKIA…)}
 SMTP_PASSWORD=${IAMユーザのSMTP Password}
 SMTP_FROM_ADDRESS=${SESで登録した送信元メールア
ドレス}
9
Ubuntu 16.04 LTSへMastodonを導入
4. .env.productionを編集
– S3バケット周り
 S3_ENABLED=true
 S3_BUCKET=${S3バケット名}
 S3_REGION=ap-northeast-1
 以下はIAM Roleを利用しない(出来なかった)場合に設定
 AWS_ACCESS_KEY_ID=${IAM Userで作成したAPIキー}
 AWS_SECRET_ACCESS_KEY=${IAM Userで作成したシーク
レットキー}
– CloudFront周り
 S3_CLOUDFRONT_HOST=${CloudFront経由のホスト名}
10
Ubuntu 16.04 LTSへMastodonを導入
5. Dockerイメージの取得or作成
– 公式にDockerイメージが定期的に作成されているので
それをそのまま利用する
 docker-compose pull
– 当然、docker buildでビルドすることも出来るが数分~
10分程度かかってしまうので注意
 docker-compose build
11
Ubuntu 16.04 LTSへMastodonを導入
6. DBデータの更新、CSS/Javascriptの最新化
– Railsだから仕方ない
 docker-compose run --rm web rake db:migrate
 docker-compose run --rm web rake assets:precompile
7. Mastodonの起動
– 作成はup (-dでデーモン化)、破棄はdown
 docker-compose up –d
– 起動はstart、停止はstop
– ログを見たい場合はlogs (-fでtail -fのように追いかけ)
 docker-compose logs -f
12
AWS独特の注意事項
 同一サーバ上で、Web(Rails)とStreaming
(node.js)を同居させる場合は、URLベースで通
信先ポートを変えてあげる必要あり
13
Mastodon鯖
t2.large
ロードバランサ
ACM+ALB web:
3000
streaming:
4000
defaultは3000番に流す
/api/v1/streaming/*は
4000番に流す
AWS独特の注意事項
 Webのヘルスチェックは GET /about → レスポ
ンスコード 301 が良さそう
14
200番が返ってくる
URLがあんまり無い…
(静的コンテンツもassets:precompile
するとURLが変わる)
AWS独特の注意事項
 Streamingのヘルスチェックは GET / → レスポ
ンスコード 200-499が良さそう
15
Tokenが無いのでどんなURLを
たたいても401が返ってくる悲しみ
AWS独特の注意事項
 CloudFrontが使うSSL証明書は us-east-1 で作る
 ALBが使うSSL証明書は ALB/EC2 がいるリー
ジョンで作る
– このドキュメントを見ている人は大抵は ap-northeast-1
で作ることになるはず
→ ACMの証明書は忘れず2カ所で作成しましょう
16
その他
 コンプライアンス的なやつ
– ALBアクセスログはS3に忘れず保管しておきましょう
– MastodonのログはCloudwatch LogsかFluentdを使って
外部退避しましょう
– 一般向けにWebサービスを公開している以上、正しく管
理するのは世間への義務です
17
メモ
 本家の最新コードにただ追従する場合は
docker-compose buildしなくても良い
– git pull
– docker-compose pull
– docker-compose run --rm web rake db:migrate
– docker-compose run --rm web rake assets:precompile
– docker-compose up -d
 sidekiqは2個以上に増やしておいた方が良い
– docker-compose scale sidekiq=2
18
メモ
 crontabで必ず1日1回実行すること
– docker-compose run --rm web rake mastodon:daily
19

20170429 jitakurack mastodon