SlideShare a Scribd company logo
AWS上での
Webアプリケーションデプロイ
アマゾン データサービス ジャパン株式会社
2013/05/06
本資料の対象
はじめに
デプロイとは
パターン1: AWSでのベーシックなデプロイ
1. AMI+SCMでデプロイ
2. Auto Scalingを適用してみる
3. 更にデプロイツールで自動化してみる
パターン2: Elastic Beanstalkを使ったデプロイ
まとめ
本資料の対象
はじめに
デプロイとは
パターン1: AWSでのベーシックなデプロイ
1. AMI+SCMでデプロイ
2. Auto Scalingを適用してみる
3. 更にデプロイツールで自動化してみる
パターン2: Elastic Beanstalkを使ったデプロイ
まとめ
本資料の対象
現在AWSでシステムを運用中のWeb
サービス開発者の方
複数台のアプリケーションサーバーへ
のコードのデプロイをどうすべきか悩
んでいる方
本資料の対象
はじめに
デプロイとは
パターン1: AWSでのベーシックなデプロイ
1. AMI+SCMでデプロイ
2. Auto Scalingを適用してみる
3. 更にデプロイツールで自動化してみる
パターン2: Elastic Beanstalkを使ったデプロイ
まとめ
よく聞くデプロイ
まわりの問題
時間がかかる
• 1回のデプロイに2時間かかるとすると、1日にデプ
ロイができるのはせいぜい3回。それよりもリリー
スしたい機能が多かったらどうする?
• かといってリリースするコードの単位を大きくして
しまうと問題がおきたときの対応が難しくなる。
• 更に、バグがあったときにも切り戻しに2時間も待
たなきゃいけないのは致命的
ロールバックできない
• バグは発生するもの。デプロイ後、バグが発見され
たときに戻す手順がないと悲惨なことに。
• そういう状況が続くと、そもそもデプロイがリスク
に見えてきて「リリースは危険なので時期をみて慎
重に判断しましょう」とかなって本末転倒!
• DB関連の変更を伴うときはより注意を払うこと。
スキーマ等の変更は必ず後半互換性を持たせる!
前後条件や環境条件が多い
• 「この作業は別の作業Aをやったあとじゃないとう
まく動かない」とか「この作業をやってしまうと元
のコードは動かなくなる」みたいなのは事故の温床。
• 本番環境と開発環境ではコード内の定数を変えない
といけない、みたいなのも事故の温床。
• デプロイは何度やっても同じ結果になるようにする
べき。
こういった罠にはまらな
いように適切なデプロイ
ワークフローをつくりま
しょう
本資料の対象
はじめに
デプロイとは
パターン1: AWSでのベーシックなデプロイ
1. AMI+SCMでデプロイ
2. Auto Scalingを適用してみる
3. 更にデプロイツールで自動化してみる
パターン2: Elastic Beanstalkを使ったデプロイ
まとめ
新しいコードをサーバーに配って有効化
したり、サーバーを新規に配置してサー
ビスに付け加えたり、構成変更やバー
ジョンアップを実施すること。
この資料では主にアプリケーションコー
ドのデプロイについて扱います。
ChefやPuppetなどを使ったインフラ
のデプロイ自動化についてはこの資料で
は扱いません。
デプロイ
どうやってますか?
rsyncでコードを配る?
gitでpullする?
AMIにコードを埋め込む?
Elastic Beanstalk使う?
Capistrano使ってデプロイ?
いろいろあってどれが最適なのか…
素早くできること
• 1回2時間かかったら1日に何回デプロイで
きる?
ロールバックできること
• バグがあったらすぐにもどせないと致命的
条件を少なくすること
• いつだれが何度やっても同じ結果になるよ
うにする
デプロイで大事なこと
本資料の対象
はじめに
デプロイとは
パターン1: AWSでのベーシックなデプロイ
1. AMI+SCMでデプロイ
2. Auto Scalingを適用してみる
3. 更にデプロイツールで自動化してみる
パターン2: Elastic Beanstalkを使ったデプロイ
まとめ
AMIとSCMでデプロイ
17
コード
コード コード
コードはgitなどのSCM、
サーバー構成はAMIで管理す
る
開発環境と本番環境などにお
いてサーバー構成を揃えやす
いのがメリット
デプロイされた後、コードは
SCMを使って最新化する
コード以外を更新する際は
AMIを作り直す
①EC2を
AMI化
②コードは
SCMへコミット
③AMIから
新しいEC2を起動
④起動したEC2に
SCMからコードを
デプロイ
SCMをつかって
コードを最新化
AMIとSCMでデプロイ
18
コード コード
コードごと
AMI化
新規サーバーを
デプロイ
新規にサーバーをデプロイするときはこの手順をすべて実施
コードだけのデプロイの場合はこ
こだけやればOK例えばSSHでデプロイ対象にログインして
$ git pull
$ sudo apachectl restart
新しいサーバー追加したら
• SSHでログインしてgit pull & apachectl restart
コードを新しくするときも
• SSHでログインしてgit pull & apachectl restart
この方式の問題点は?
• それぞれデプロイ対象のサーバーにログイン
してデプロイ作業をしなければいけない
• 台数が増えてくるとつらい!
19
AMIとSCMでデプロイ まとめると
デプロイツールで
作業を自動化しましょう
前述の2つの方式で課題になっていた「各サーバーにSSH
でログインしてコードの最新化やロールバックする」と
いうような作業を自動化してくれるツール
有名どころとしてはCapistrano、Fabric、Mavenなど
デプロイツールとは?
デプロイ対象のサーバー
群すべてに対して自動的
にこういった作業を実施
してくれる。
デプロイツールを組み合わせる
22
コード コード
新規サーバーを
デプロイ
デプロイツールで
コードをデプロイ
サーバーに関しては、前述の「AMI」もしくは「Auto Scaling」を
使って管理・デプロイする
この部分を手動ではなくデ
プロイツールで実施する
デプロイツールを組み合わせる
23
Capistranoでデプロイするなら・・
• Capistranoはもともとrailsアプリケーションのデプロイ用に
作られたものだが、rails以外でも使える。(ただし、その場合
はrailsless-deployというプラグインが必要)
• インストールはgemで。
• 次のページに続く
$ gem install capistrano
$ gem install capistrano_colors #あると便利
$ gem install capistrano-ext #あると便利
$ gem install railsless-deploy #rails以外に使うときに必要
デプロイツールを組み合わせる
24
Capistranoでデプロイするなら・・
• 設定ファイルをつくる。デプロイ対象のアプリのルートディレ
クトリで下記を実行。設定ファイル等が生成される。
• そうすると以下の様な設定ファイル群が生成される
• 次のページに続く
$ capify
$ tree
.
├── Capfile
├── config
│ └── deploy.rb
デプロイツールを組み合わせる
25
Capistranoでデプロイするなら・・
• config/deploy.rbを修正する
• 設定項目はアプリケーション名、SCM種別、SCMリポジトリ
URL、ブランチ、デプロイ対象サーバーのログインユーザーや
ドキュメントルートなど。
• roleを利用することによって複数サーバーのグループ化と一斉
デプロイができる
https://gist.github.com/imaifactory/5613219
デプロイツールを組み合わせる
26
Capistranoでデプロイするなら・・
• deployの準備コマンドを実行。デプロイ対象のサーバーに必要
なディレクトリ等が生成される。
• デプロイ!
• ロールバックも容易
$ cap deploy:setup
$ cap deploy
$ cap deploy:rollback
新しいサーバー追加したら
• デプロイツールで新しいサーバーに個別にデプロイ
• その上で、デプロイツールの設定に新しいサーバー
を追加
コードを新しくするときは
• 対象サーバーに対して一斉にデプロイ
この方式の問題点は?
• サーバー追加時にまだ手動の手間が残る
• 例えばAuto Scalingの時などは困る
27
デプロイツールで自動化 まとめると
Auto Scalingと
組み合わせるには
29
Auto Scalingとは?
負荷や時間に合わせてサーバーの台数を増減することの
できる仕組み
ELBの配下でも利用可能。
Auto scaling Group
CloudWatch
Alarm Auto Scaling
サーバーの起動のタイミングを完全にコント
ロール出来ない(負荷などに合わせて自動的
に立ち上がってくる)
起動時のデプロイも自動化する必要がある!
30
Auto Scalingにすると・・
AMIの中にコードの最新化を自動的に
やってくれる仕組みを実装する必要があ
る。(詳細は次のページで)
Auto Scalingでデプロイ
31
コード コード
新規サーバーを
デプロイ
Auto ScalingではAMIからサーバーをデプロイするところ
まで面倒見てくれる
Auto Scalingでは自分で
AMIを用意する必要があ
る。
apache + mod_php + githubの環境でやるなら・・
• 例えばUser Dataを利用して、起動時に以下のような処理を実
行する。
• capistrano ready(setup相当)なディレクトリを作成し、
githubからリポジトリをクローンしてきてapacheを起動する
32
Auto Scalingでデプロイ
https://gist.github.com/imaifactory/5612971
apache + mod_php + githubの環境でやるなら・・
• User Dataとは、EC2起動時にテキスト情報をインスタンスに
渡す仕組み。前ページのようなシェルスクリプトを渡すと起動
時にルート権限で実行してくれる。
• gitをインストールしたり、httpd.confの設定を調整するなど
についてはインフラ側で調整する(AMI化しておいたり、Chef
等で管理) 33
Auto Scalingでデプロイ
apache + mod_php + githubの環境でやるなら・・
• User Dataで渡されたスクリプトが実行されることによって、
新しく起動してくるEC2は”cap deploy:setup”まで終わった
状態で、最新のコードが配置された状態でapacheが起動して
きてくれる。
• 前ページの画面イメージはマネジメントコンソールでの設定だ
が、実際にはAuto ScalingのLaunch Configurationに対し
てUser Dataを設定する
• あとは必要に応じてcap deloyすればコードの更新が可能。
• 新しく起動したEC2をどうやってcapistranoで管理するかにつ
いては次のページで。
34
Auto Scalingでデプロイ
Auto Scalingを利用すると、デプロイ対象の
サーバーがダイナミックに変わっていくことに
なる
静的なConfigファイルでは管理できない
capistrano-ec2groupやcapistrano-
autoscalingなどのプラグインを使ってデプロ
イ対象のサーバーを動的に管理
他のデプロイツールを使う際にも同様なアプ
ローチで
35
Auto Scaling + Capistrano
新しいサーバー追加したら
• 自動的に最新のコードをデプロイ
コードを新しくするときは
• 対象サーバーに対して一斉にデプロイ
デプロイがだいぶ自動化された!
36
起動時のデプロイも自動化すると
本資料の対象
はじめに
デプロイとは
パターン1: AWSでのベーシックなデプロイ
1. AMI+SCMでデプロイ
2. Auto Scalingを適用してみる
3. 更にデプロイツールで自動化してみる
パターン2: Elastic Beanstalkを使ったデプロイ
まとめ
Elastic Beanstalkでも
デプロイ管理できます
Instance
Amazon RDS
(OPTION)
Elastic Load
Balancer
Instance
Auto scaling Group
CloudWatch
deploy!
AWS上のおすすめ構成を自動作成
コードをデプロイするだけで、Webアプリケーションを開始
Elastic Beanstalkとは?
※gitが使えるのはnode.js, PHP, Python Rubyのみ
新しいサーバー追加したら
• 自動的に最新のコードをElastic Beanstalkがデ
プロイしてくれる
コードを新しくするときは
• これもElastic Beanstalkが自動的にデプロイし
てくれる
複数バージョンのコードを管理・デプロイ可
能なのでロールバックも容易
40
Elastic Beanstalkを使うと
Beanstalkでは
言語ごとにAMIが
予め用意されている。
カスタマイズも可能。
http://bit.ly/YyDNeM
Elastic Beanstalkでデプロイ
41
コード
新規サーバーを
デプロイ
Beanstalkから
コードが配布される
Elastic Beanstalkでは言語ごとに予め決まった構成のAMIが
デプロイされる
Beanstalkへpushしたコードをそのままデプ
ロイしたり、pushされたコードの中から任意
のものをデプロイできる
開発したコードは
Beanstalkへpush
apache + mod_phpの環境でやるなら・・
• ebというElastic BeanstalkのCLIツールを使って作業する。
http://amzn.to/dSdtGP から取得可能。
42
Elastic Beanstalkでデプロイ
#gitとebの初期化
$ cd /your/app/path
$ git init
$ eb init #プロンプトが立ち上がっていくつかのQAで設定が進む
#コミット
$ git add .
$ git commit -a -m ‘first commit’
#Beanstalkへpush. ebの設定が済んでいればこのコマンドが使える。
#これだけでコードがサーバーにデプロイされる!
$ git aws.push
• git aws.pushを実行すると、Beanstalkへコードがpushされた上、
対象のenvironmentにコードがデプロイされる
ロールバックするなら・・
• Elastic Beanstalkではアプリケーションのバージョンを管理
してくれるので、前のバージョンをデプロイしなおせばOK
43
Elastic Beanstalkでデプロイ
Application
Environment Version
WAR/ZIP
URL Environment Configuration
Configuration Template
Environment
URL Environment Configuration
WAR/ZIP
WAR/ZIP
WAR/ZIP
WAR/ZIP
Environment
URL Environment Configuration
コンソール上から別バージョンをデプ
ロイ可能
Elastic Beanstalkではアップロードされ
たコードをバージョン管理してくれる
本資料の対象
はじめに
デプロイとは
パターン1: AWSでのベーシックなデプロイ
1. AMI+SCMでデプロイ
2. Auto Scalingを適用してみる
3. 更にデプロイツールで自動化してみる
パターン2: Elastic Beanstalkを使ったデプロイ
まとめ
どの方法をとるべきか
• これがベスト、というデプロイ方法は存在しない。
• 自分たちの運用フローに最適なものを選択する
早いうちにコストをかけてつくろう
• 「規模が大きくなってきたらやろう」みたいなのもアンチパターン
• 圧倒的に開発のスピードが上がるしコストも下がる
開発も本番も同じ環境、同じ手順でやろう
• 「開発環境はまあいいよね」もよくあるアンチパターン
• 本番だけ特別な環境・手順にしておくといざというときにハマる
サーバーは出来る限りステートレスに
• 負荷に合わせてサーバーを増減などを想定すると、サーバーはどんど
ん新しいものを足したり捨てたりすることになる。この時にサーバー
単体にデータを貯めこんでしまうアーキテクチャは成り立たない。
• データはDBに、ログはS3に追いだそう
45
AWS上でのWebアプリケーションデプロイ

More Related Content

AWS上でのWebアプリケーションデプロイ