Deploy Rails Application on Docker with Elasticbeanstalk

23
ElasticbeanstalkRailsプリ on Dockerのデプロイを した話 2014/08/21 Developer Procductivity勉強会 株式会社アカツキ 河野 洋志

description

Deploy Rails Application on Docker with Elasticbeanstalk

Transcript of Deploy Rails Application on Docker with Elasticbeanstalk

Page 1: Deploy Rails Application on Docker with Elasticbeanstalk

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

した話2014/08/21 Developer Procductivity勉強会

株式会社アカツキ 河野 洋志

Page 2: Deploy Rails Application on Docker with Elasticbeanstalk

自己紹介• 河野 洋志• twitter: @bonty

• アカツキでエンジニアをしています• 最近はcocos2d-x、アプリケーションの設計、

BigQueryとか興味があります

Page 3: Deploy Rails Application on Docker with Elasticbeanstalk

アカツキエンジニアチームの文化• 最高の方法を考えないのは悪• チーム最適

Page 4: Deploy Rails Application on Docker with Elasticbeanstalk

最高の方法を考えないのは悪• 「最高」は2つの面から

• スピードやコスト、生産性、プロダクトの完成度などの点で最適

• 開発する人が楽しめる、面白い• これらを追求しないと良いものづくりができない。常に新しい、より良い手法を取り込む

Page 5: Deploy Rails Application on Docker with Elasticbeanstalk

チーム最適• 「最高の追求」の裁量は各チームにある。全チーム共通のルールを重視するとプロセスが重くなりがちになって、変化しにくくなる

• 各チームが独立して良い手法を探し共有することで、良い技術は浸透し、悪い技術は淘汰される• 結果的に組織全体にとってベストの手法に変わっていく

Page 6: Deploy Rails Application on Docker with Elasticbeanstalk

ツール• CI

• Jenkins, Travis CI, Circle CI, HoundCI, TestFlight, DeployGate

• Communication

• Github, HipChat, JIRA, Google Spreadsheet

Page 7: Deploy Rails Application on Docker with Elasticbeanstalk

ツール• DevOps

• AWS CloudFormation + Chef + Capistrano

• AWS Elastic Beanstalk + Docker

Page 8: Deploy Rails Application on Docker with Elasticbeanstalk

今日はDockerとElasticbeanstalkの

話をします

Page 9: Deploy Rails Application on Docker with Elasticbeanstalk

Docker

• コンテナ型の仮想マシン

• Dockerfileをこねこねして $ docker run するだけであれこれインストールされた環境が作れる

• 環境をそのまま持ち運びできるので、俺の環境だとhogehogeが発生しづらい

Page 10: Deploy Rails Application on Docker with Elasticbeanstalk

Elasticbeanstalk

• AWSが提供しているHerokuっぽい何か• ELB + Appサーバ な構成がボタン押してるだけで出来てしまう

• Node.JS、PHP、Python、.NET、Java、Rubyアプリをデプロイできる

• 2014/04からDockerアプリケーションをデプロイできるようになった

Page 11: Deploy Rails Application on Docker with Elasticbeanstalk

どうしてこれをやりたいのか• Vagrant + Dockerで開発環境を簡単に持ち運べるようになった• 俺の環境だと動く・ダメ・絶対

• ついでだからプロダクションでもDockerで動かしたくなった

• Elasticbeanstalkとかいうのが便利らしい

Page 12: Deploy Rails Application on Docker with Elasticbeanstalk

なにがうれしいのか• 開発環境とプロダクション環境の差異を減らせる• 環境にまつわるトラブルを減らせる• Twelve-Factor App

• アプリサーバーをImmutableにできる• 毎回新規作成されたインスタンス上で新たにDockerイメージを起動

Page 13: Deploy Rails Application on Docker with Elasticbeanstalk

Elasticbeanstalk + Docker

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

Page 14: Deploy Rails Application on Docker with Elasticbeanstalk

なにをやっとるか1. ローカルでDockerイメージをビルドしてS3上のプライベートレポジトリにpush

2. ローカルマシンからElasticbeanstalkにデプロイリクエスト

3. Elasticbeanstalkが環境に対してデプロイ4. 各インスタンスは起動後、S3にあるイメージを

pullしてきてDockerを起動

Page 15: Deploy Rails Application on Docker with Elasticbeanstalk

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

• 最初はDockerイメージを作らずに毎回インスタンス上でDockerfileからビルドしていた

• apt-get installから始めるので30分経ってもデプロイが終わらない → 悲しい

Page 16: Deploy Rails Application on Docker with Elasticbeanstalk

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

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

Page 17: Deploy Rails Application on Docker with Elasticbeanstalk

神降臨• AWSブログの記事でS3をDockerプライベートレポジトリとしてElasticBeanstalkでデプロイする記事が!!• http://aws.typepad.com/sajp/2014/06/eb-

docker-private-repo.html

Page 18: Deploy Rails Application on Docker with Elasticbeanstalk

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

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

• 各インスタンスでdocker-registryコンテナを立ち上げてプライベートレポジトリのイメージをpull

Page 19: Deploy Rails Application on Docker with Elasticbeanstalk

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

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

Page 20: Deploy Rails Application on Docker with Elasticbeanstalk

デモ

Page 21: Deploy Rails Application on Docker with Elasticbeanstalk

小ネタ(その1)

• 環境変数でDBやキャッシュサーバへのエンドポイントを変更できるようにしておくと色々楽

• Elasticbeanstalkで立ち上がるAMIはnginx経由でリクエストがコンテナに来るように設定されているので、コンテナにはnginxを立てないほうが綺麗

Page 22: Deploy Rails Application on Docker with Elasticbeanstalk

小ネタ(その2)

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

Page 23: Deploy Rails Application on Docker with Elasticbeanstalk

サンプル• github上にサンプルアプリケーションを公開しています• https://github.com/bonty/eb-rails-sample

• 質問などありましたら遠慮なくインターネットでお声がけください!