Skip to content

Instantly share code, notes, and snippets.

@bonty
Created August 21, 2014 06:01
Show Gist options
  • Save bonty/28ea3a6ea2ac9459a843 to your computer and use it in GitHub Desktop.
Save bonty/28ea3a6ea2ac9459a843 to your computer and use it in GitHub Desktop.
2014-08-21 Developer Productivity Study http://startuptechtalk.doorkeeper.jp/events/14088

ElasticbeanstalkでRailsアプリ on Dockerのデプロイをした話


自己紹介

  • 河野 洋志
  • twitter: @bonty inline
  • アカツキでエンジニアをしています
  • 最近はcocos2d-x、アプリケーションの設計、BigQueryとか興味があります

アカツキエンジニアチームの文化

  • 最高の方法を考えないのは悪
  • チーム最適

最高の方法を考えないのは悪

  • 「最高」は2つの面から
    • スピードやコスト、生産性、プロダクトの完成度などの点で最適
    • 開発する人が楽しめる、面白い
  • これらを追求しないと良いものづくりができない。常に新しい、より良い手法を取り込む

チーム最適

  • 「最高の追求」の裁量は各チームにある。全チーム共通のルールを重視するとプロセスが重くなりがちになって、変化しにくくなる
  • 各チームが独立して良い手法を探し共有することで、良い技術は浸透し、悪い技術は淘汰される
    • 結果的に組織全体にとってベストの手法に変わっていく

ツール

  • CI
    • Jenkins, Travis CI, Circle CI, HoundCI, TestFlight, DeployGate
  • Communication
    • Github, HipChat, JIRA, Google Spreadsheet

ツール

  • DevOps
    • AWS CloudFormation + Chef + Capistrano
    • AWS Elastic Beanstalk + Docker

今日はDockerとElasticbeanstalkの話をします

left


Docker

  • コンテナ型の仮想マシン
  • Dockerfileをこねこねして $ docker run するだけであれこれインストールされた環境が作れる
  • 環境をそのまま持ち運びできるので、俺の環境だとhogehogeが発生しづらい

Elasticbeanstalk

  • AWSが提供しているHerokuっぽい何か
  • ELB + Appサーバ な構成がボタン押してるだけで出来てしまう
  • Node.JS、PHP、Python、.NET、Java、Rubyアプリをデプロイできる
  • 2014/04からDockerアプリケーションをデプロイできるようになった

どうしてこれをやりたいのか

  • Vagrant + Dockerで開発環境を簡単に持ち運べるようになった
    • 俺の環境だと動く・ダメ・絶対
  • ついでだからプロダクションでもDockerで動かしたくなった
  • Elasticbeanstalkとかいうのが便利らしい

なにがうれしいのか

  • 開発環境とプロダクション環境の差異を減らせる
    • 環境にまつわるトラブルを減らせる
    • Twelve-Factor App
  • アプリサーバーをImmutableにできる
    • 毎回新規作成されたインスタンス上で新たにDockerイメージを起動

Elasticbeanstalk + Docker

色々と試行錯誤した結果、以下の構成に落ち着いた

inline


なにをやっとるか

  1. ローカルでDockerイメージをビルドしてS3上のプライベートレポジトリにpush
  2. ローカルマシンからElasticbeanstalkにデプロイリクエスト
  3. Elasticbeanstalkが環境に対してデプロイ
  4. 各インスタンスは起動後、S3にあるイメージをpullしてきてDockerを起動

兵どもが夢の跡(その1)

  • 最初はDockerイメージを作らずに毎回インスタンス上でDockerfileからビルドしていた
    • apt-get installから始めるので30分経ってもデプロイが終わらない → 悲しい

兵どもが夢の跡(その2)

  • DockerHubにイメージをpushしてから各インスタンスでpullして起動
    • デプロイは早くなったけど公開イメージになるのでプロダクションで使えない → 悲しい

神降臨


なにをやっとるか(その1)

  • 開発マシン上でdocker-registryコンテナ(プライベートレポジトリ用コンテナ)を立ち上げてビルドしたイメージをS3にpush
  • 各インスタンスでdocker-registryコンテナを立ち上げてプライベートレポジトリのイメージをpull

なにをやっとるか(その2)

  • 各インスタンスがレポジトリコンテナを立ち上げるので、レポジトリ用サーバを立てるよりも可用性が上がる → 嬉しい

デモ


小ネタ(その1)

  • 環境変数でDBやキャッシュサーバへのエンドポイントを変更できるようにしておくと色々楽
  • Elasticbeanstalkで立ち上がるAMIはnginx経由でリクエストがコンテナに来るように設定されているので、コンテナにはnginxを立てないほうが綺麗

小ネタ(その2)

  • DockerfileとDockerrun.aws.jsonをgitレポジトリルートに配置しておくとDockerrun.aws.jsonが無視される
    • (railsアプリの場合)レポジトリルートから1階層奥にアプリ本体とDockerfileを配置するとDockerのコンテキストなど気にしないといけないことが減る

サンプル

  • github上にサンプルアプリケーションを公開しています
  • 質問などありましたら遠慮なくインターネットでお声がけください!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment