Ruby on Rails on ECS

2017-11-24

福岡Ruby会議02・前夜祭

うなすけ

connpass

https://fukuokarb.connpass.com/event/68497/

タイトル長過ぎました 🙇

新規RailsアプリをECSで運用したときの知見や、
現行のRailsアプリをDocker化するときに遭遇した課題などについて

改め

Ruby on Rails on ECS

自己紹介

icon
  • 名前: うなすけ
  • 株式会社spice life
  • インフラリードエンジニア

  • twitter @yu_suke1994
  • GitHub @unasuke

spice life

TMIX

TMIX

STEERS

STEERS

もくじ

  1. 新規Railsアプリとは ⬅️⬅️⬅️
  2. まずはDocker化
  3. ECSで動かす
  4. ハマったところ
  5. 既存のRailsのESC化のハードル
  6. まとめ

新規Railsアプリ

rails new
2017-04-10
用途
大口注文の社内管理用

Docker(ECS)化するにはもってこいだった

もくじ

  1. 新規Railsアプリとは
  2. まずはDocker化 ⬅️⬅️⬅️
  3. ECSで動かす
  4. ハマったところ
  5. 既存のRailsのESC化のハードル
  6. まとめ

まずはDocker化

なんだかんだ環境ごとにDockerfileはわかれちゃう

app
config
db
docker/
  └ app-base/
      └ Dockerfile        # apt packages
  └ app-development/
      └ Dockerfile        # gem group :development
  └ app-production/
      └ Dockerfile        # gem group :production

まずはDocker化

asset precompile

Q. assetどこに置く問題

  • S3などのオブジェクトストレージ
  • コンテナの中

まずはDocker化

asset precompile

asset置き場

オブジェクトストレージ
コンテナイメージが軽くなる
コンテナの中
お手軽

まずはDocker化

asset precompile

asset置き場

コンテナの中に置くことにした

CDN → nginx → container

参考:amakanの本番環境をDockerに移行した - ✘╹◡╹✘

まずはDocker化

assets in container

asset配信用ドメイン(CDN)以外からの
assetへのアクセスを弾きたい

まずはDocker化

assets in container

nginx.confで制御

pathasset.example.comexample.com
/asset/*200200
/404200

もくじ

  1. 新規Railsアプリとは
  2. まずはDocker化
  3. ECSで動かす ⬅️⬅️⬅️
  4. ハマったところ
  5. 既存のRailsのESC化のハードル
  6. まとめ

ECSで動かす

Docker imageのbuild/push

なるべく速くすませたい

ECSで動かす

Docker imageのbuild/push

検証したCI Service

  • Circle CI
  • Travis CI
  • Codeship
  • Codefresh
  • Drone.io

ECSで動かす

Docker imageのbuild/push

Drone.ioを選択

  • 😄 Docker layer cache
  • 😄 Fast push to ECR (オンプレなので)
  • 😄 Fast build (c4.large)
  • 😣 オンプレミス
  • 🤔 OSS

ECSで動かす

Deploy

  • Service / Task Definition を一元管理したい
  • 環境を問わずデプロイできるようにする
  • revisionをカッチリ指定したい

ECSで動かす

Deploy

unasuke/mikoshi

https://github.com/unasuke/mikoshi/

Service / Task DefinitionをYaml(ERB)で管理する

定義を含むDocker imageを作成してpull/deploy

ECSで動かす

Deploy

unasuke/mikoshi

# task_definitions/ping2googledns.yml.erb
task_definition:
  family: "ping2googledns"
  network_mode: "bridge"
  container_definitions:
    - name: "ping"
      image: "unasuke/ping2googledns:latest"
      cpu: 128
      memory: 128
hooks:
  after_register:
    - echo registerd

ECSで動かす

Deploy

unasuke/mikoshi

deploy command in CI job

docker run --rm --tty \
  -e IMAGE_REVISION=${DRONE_COMMIT_SHA} \
  -e AWS_REGION=${AWS_DEFAULT_REGION} \
  ${ECR_HOST}/mikoshi-container:latest deploy -g app-name

もくじ

  1. 新規Railsアプリとは
  2. まずはDocker化
  3. ECSで動かす
  4. ハマったところ ⬅️⬅️⬅️
  5. 既存のRailsのESC化のハードル
  6. まとめ

ハマったところ

db:migrate → SIGTERM

ECS RunTaskでのdb:migrateがSIGTERM

ハマったところ

db:migrate → SIGTERM

原因

nginxにtrueを渡して落としていたのが
つられてRailsも落ちる 😨

ハマったところ

db:migrate → SIGTERM

workaround

Railsのみを含むTask Definitionを作成して
それを使いdb:migrate

🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔

ハマったところ

db:migrate → SIGTERM

例えばnginxをやめる!!!!!

ハマったところ

db:migrate → SIGTERM

nginxの役割

  • Basic Auth
    • Railsでもできる!
  • httpsへのredirect
    • Railsでもできる!
  • asset配信のドメイン制御
    • Railsでも……?

ハマったところ

db:migrate → SIGTERM

asset配信のドメイン制御をRackで

Rack middlewareでやっちゃえばいいんじゃ?!

ハマったところ

db:migrate → SIGTERM

asset配信のドメイン制御をRackで

Rack middlewareでやっちゃえばいいんじゃ?!

回収 https://twitter.com/yu_suke1994/status/933349862862594048

ハマったところ

  • logどうやって見るの
  • rails consoleしたいんだけど

時間ないんで省略 🏃💨

もくじ

  1. 新規Railsアプリとは
  2. まずはDocker化
  3. ECSで動かす
  4. ハマったところ
  5. 既存のRailsのESC化のハードル ⬅️⬅️⬅️
  6. まとめ

既存のRailsのESC化のハードル

既存のRailsっていうのはTMIXのことです

あなたとJAVA

TMIXのESC化のハードル

  • ridgepole
    • apply
    • test

TMIXのESC化のハードル

ridgepole

TMIXは1DB、複数App
ridgepoleでschema管理

https://github.com/winebarrel/ridgepole

TMIXのESC化のハードル

ridgepole

applyをどうやっていたか

ridgepole applyはとあるRailsアプリの
インスタンスからcapで行なっていた

⬆️

コンテナ化するとなると……?

TMIXのESC化のハードル

ridgepole

applyをどうするか

ECS RunTaskで行なう(Done!)

このためにmikoshiがRunTaskに対応した

TMIXのESC化のハードル

test

CIでspecを実行するときに
いちいちridgepole applyしている……

⬆️

schema適用済のDB containerを用意できないか?

手がつけられていない……

TMIXのESC化のハードル

「やっていき」の気持ち 💪

もくじ

  1. 新規Railsアプリとは
  2. まずはDocker化
  3. ECSで動かす
  4. ハマったところ
  5. 既存のRailsのESC化のハードル
  6. まとめ ⬅️⬅️⬅️

まとめ

  • ECSで動かすよりも、その前準備が大変
    • CI、deploy、構成etc……
  • 社内アプリから導入したのは良かった
    • 営業時間外のダウンタイムに寛容
  • 勢いも大事
    • 「Dockerやっていくぞ!!!」

もっと詳しく

やれば
できる