Chef(Server)と
AWS OpsWorks(tm)の比較
2013/07/06
JAWS-UG Kobe 第2回
OpsWorks(Chef)特集
Saturday, July 6, 13
自己紹介
2
• http://opsrock.in 共同開発・運営
• AWS OpsWorksとChefを主に取り扱
うソリューションを提供
• 澤登 HiganWorks合同会社の代表社員
• アプリケーションのためのプラットフォーム構築/運
用自動化をテーマに活動
Saturday, July 6, 13
本日の内容
• Chefの紹介
• OpsWorksの紹介
• それぞれの目的/用途と特徴
• Chef/OpsWorks比較
• Chef/OpsWorksでのシステム構築
(Ops視点)
• OpsWorksでRailsをChef Deploy
3
Saturday, July 6, 13
Chefの紹介
Saturday, July 6, 13
参考スライドから簡単に
5
http://www.slideshare.net/YukihikoSawanobori/what-is-chef201303
Saturday, July 6, 13
Chefって何するツール?
• インフラ環境のメタデータ管理
• ノードの役割を定義して収束させるフレーム
ワーク
• 環境管理の作業を自動化/一般化するツール
• Infrastructure as codeの思想を補助する
6
Saturday, July 6, 13
泥臭いツールOhaiを中心に
プラットフォーム互換性を支える
• 設定収束のためにノード情報の収集
• ディストリビューション判断の
if elseif elseif elseif elseif ... (Ohai)
• パッケージとサービス管理をDSL(レシピ)で
表わすためのChef::Providers(chef-client)
7
Saturday, July 6, 13
収束・冪等性
• Chef-ClientはノードをCookbookのレシピに書
いたとおりの状態に近づけます
• 何度実行しても同じ結果、同じ状態となる (冪
等) ようレシピにしておく事が重要
• このへん捕捉
• 全てのレシピを常に実行状態(run_list)してお
く必要はない
• 構成変更時専用のレシピもあり(でも冪等)
8
beki tou sei
Saturday, July 6, 13
Chef形態あれこれ
• Server
• Hosted ChefServer
• OpscodeのSaaS
• Private ChefServer
• Opscodeのサービス
• OpenSource ChefServer
• Linux(ほぼUbuntu)にインストールできるChefサーバ
• Client
• Chef-Client: Serverとセットで
• Chef-Solo:単独の簡易版
9
Saturday, July 6, 13
OpsWorksの紹介
Saturday, July 6, 13
こちらも参考スライドから
11
http://www.slideshare.net/YukihikoSawanobori/copy-2013-0622awsopsworksoverview
Saturday, July 6, 13
AWS OpsWorksとは?
12
Saturday, July 6, 13
AWS OpsWorksとは?
12
• アプリケーションのライフサイクル管理を一
本化するために作られたソリューション
Saturday, July 6, 13
AWS OpsWorksとは?
12
• アプリケーションのライフサイクル管理を一
本化するために作られたソリューション
• プラットフォームの自動構築
Saturday, July 6, 13
AWS OpsWorksとは?
12
• アプリケーションのライフサイクル管理を一
本化するために作られたソリューション
• プラットフォームの自動構築
• アプリケーションのdeploy(undeploy)
Saturday, July 6, 13
プラットフォームの自動構築
• アプリケーションが動作する
プラットフォームとは?
• ネットワーク環境の構築
• サーバ(インスタンス)の調達
• ミドルウェアの設定
13
Saturday, July 6, 13
プラットフォームの自動構築
• アプリケーションが動作する
プラットフォームとは?
• ネットワーク環境の構築
• サーバ(インスタンス)の調達
• ミドルウェアの設定
13
Saturday, July 6, 13
プラットフォームの自動構築
• アプリケーションが動作する
プラットフォームとは?
• ネットワーク環境の構築
• サーバ(インスタンス)の調達
• ミドルウェアの設定
13
Saturday, July 6, 13
プラットフォームの自動構築
• アプリケーションが動作する
プラットフォームとは?
• ネットワーク環境の構築
• サーバ(インスタンス)の調達
• ミドルウェアの設定
13
Saturday, July 6, 13
プラットフォームの自動構築
• アプリケーションが動作する
プラットフォームとは?
• ネットワーク環境の構築
• サーバ(インスタンス)の調達
• ミドルウェアの設定
13
Saturday, July 6, 13
アプリケーションのdeploy
• アプリケーション ソースコード(リポジトリ)
• git, svn, zip(http, s3)
+ 何らかの配布/ビルドの仕組み
14
Saturday, July 6, 13
アプリケーションのdeploy
• アプリケーション ソースコード(リポジトリ)
• git, svn, zip(http, s3)
+ 何らかの配布/ビルドの仕組み
14
Saturday, July 6, 13
アプリケーションのdeploy
• アプリケーション ソースコード(リポジトリ)
• git, svn, zip(http, s3)
+ 何らかの配布/ビルドの仕組み
14
OpsWorks Agent
Saturday, July 6, 13
アプリケーションのdeploy
• アプリケーション ソースコード(リポジトリ)
• git, svn, zip(http, s3)
+ 何らかの配布/ビルドの仕組み
14
OpsWorks Agent
タスク実行
Saturday, July 6, 13
アプリケーションのdeploy
• アプリケーション ソースコード(リポジトリ)
• git, svn, zip(http, s3)
+ 何らかの配布/ビルドの仕組み
14
OpsWorks Agent
タスク実行 タスク実行管理
Saturday, July 6, 13
OpsWorksを理解する用語集
• スタック
• 特定のアプリケーションシステム全体
• レイヤ
• アプリケーション動作プラットホームを役
割別に定義するインスタンスの集合
• WEB役,DB役など
• ライフサイクル (次ページへ)
15
Saturday, July 6, 13
1.Setup
2.Configure
3.Deploy
4.UnDeploy
5.Shutdown
16
OpsWorksのライフサイクル定義
Saturday, July 6, 13
1.Setup
2.Configure
3.Deploy
4.UnDeploy
5.Shutdown
16
OpsWorksのライフサイクル定義
プラットフォーム部分
Saturday, July 6, 13
1.Setup
2.Configure
3.Deploy
4.UnDeploy
5.Shutdown
16
OpsWorksのライフサイクル定義
プラットフォーム部分
アプリケーション部分
Saturday, July 6, 13
Chef / OpsWorks
それぞれの
目的/用途と特徴
Saturday, July 6, 13
その前に...それぞれの印象
18
OpsWorks
Chef
• アプリ のデプロイ、ライ
フサイクル管理に 全力特化
•しきたりが意外と重要
•使い方は色々
• プラットフォーム を結構
広い意味で取り扱える
※発表者個人の感想です、先入観を持たないようお願いします
Saturday, July 6, 13
その前に...それぞれの印象
18
OpsWorks
Chef
• アプリ のデプロイ、ライ
フサイクル管理に 全力特化
•しきたりが意外と重要
•使い方は色々
• プラットフォーム を結構
広い意味で取り扱える
※発表者個人の感想です、先入観を持たないようお願いします
Saturday, July 6, 13
その前に...それぞれの印象
18
OpsWorks
Chef
• アプリ のデプロイ、ライ
フサイクル管理に 全力特化
•しきたりが意外と重要
•使い方は色々
• プラットフォーム を結構
広い意味で取り扱える
※発表者個人の感想です、先入観を持たないようお願いします
Saturday, July 6, 13
対応OSディストリビューション
19
OpsWorks
Chef
•AmazonLinux(CentOSベース)
•Ubuntu12.04
•redhat系、Debian系
•Windows、MacOSX
•FreeBSD、Solaris
•などなど各種対応
Saturday, July 6, 13
クラウドインテグレーション
20
OpsWorks
Chef
•AWSとはそこそこ。
•ELB, CloudWatchなどとデフォルト連
携OK
•Bootstrapとプラグインで大概対応可
•サーバ調達IaaSもどこでもいい
(EC2, OpenStack,Joyent等)
•そもそもIaaSをChefで構築したり
(OpenCenter(OpenStack)など)
Saturday, July 6, 13
CookBooks管理
21
OpsWorks
Chef
•システム一式を同一リポジトリでまとめ
て管理する必要がある
•スタックへの更新は一括適用
•ChefServerにCookbookバージョン管
理の仕組みを備える
•Berkshelf,Librarian等、Server/Solo問
わず使いやすいツールあり
Saturday, July 6, 13
Chefのバージョン
22
OpsWorks
Chef
•0.9.15.5(2013/07時点)
•Defenition, LibrariesとLWRPはひと通
り使えるが最近の書式に対応していない
箇所も
•11.x
•コミュニティCookbooksはほぼ10以降
のバージョン用
Saturday, July 6, 13
ChefClientの実行
23
OpsWorks
Chef
•ライフサイクルの進行ごとにChefSolo
を順次実行。(都度JSON作成)
•Chef単純にタスク実行としての意味合
いが強い
•イベント対応でオンタイム実行も
•ChefClientでChefServerと通信
•基本はCronで継続的に実行
Saturday, July 6, 13
ノードのAttributes
24
OpsWorks
Chef
•スタック・レイヤの情報のみが随時更新
&構成に利用可能
•ユーザ指定はスタックの Custom Chef
Json にて
•Ohaiの収集情報がServerに集約され、
フルに活用できる。
•レシピ内でのSetAttribute、Role他で
のAttributeマージor更新が柔軟
Saturday, July 6, 13
テストスイート
25
OpsWorks
Chef
•地味にminitest-chef-handlerが付いて
いる。
•cookbooks内に受け入れtestを書いて、
Failさせることは可能。
•ServerSpecもおそらく有効
•Vagrantを軸にtest-kitchenなどのツー
ルが っている
•ChefSpec, FoodcriticなどCookbook
ごとのテストもそこそこやりやすい
Saturday, July 6, 13
Chef/OpsWorksでのシ
ステム構築
(Ops視点)
Saturday, July 6, 13
テーマは
アプリケーションの
ホスト
Saturday, July 6, 13
Chefでシステム構築例
• まず単体サーバ
• とりあえずアプリケーションを動かすところ
へ持っていく
• ミドルウェアの設定にChefを使っていく
• アプリのデプロイは場合によってツールを選
択
• 構築中:Capistrano
=> 本番: CapistranoまたはChefなど
28
Saturday, July 6, 13
ステップ1:構築初期
29
ChefServer
DevServer
APP
ミドルウェアを
適当に設定
手動設定をCookbookに起こしな
がらDevサーバ側で実行を繰り返
して調整。
先にテストを書くのもベター。
Saturday, July 6, 13
ステップ2:役割定義
30
ChefServer
DevServer
APP
HTTP Proxy
アプリケーションのプラットフォーム
として、各種ミドルウェアを役割別に
分類し、グループ化する。
QueueServer
Roleとしてrun_listを
登録していく
KVS(Cache)
MailServer
Database
App Runtime
Saturday, July 6, 13
ステップ3:Staging/本番展開
31
ChefServer
StagingServer1
役割(Role)はChefServer
のSearchAPIを使うか、
DataBagなどで集中管理
してそれぞれのIP(場所)を
お互い知れるようにしてお
く。
Roleのrun_listを
適用していく
StagingServer2
StagingServer3
StagingServer4
StagingServer5
StagingServer6
Database
MailServer
QueueServer
APPAPP
AppRuntime AppRuntime
HTTP Proxy
KVS(Cache)
Saturday, July 6, 13
Chefで構築まとめ
• 最初は開発サーバを直接適当にいじりながら
徐々にCookbookへ
• 最終的には開発サーバもChef実行で収束
するようにしておく(手作業再現)
• 手作業の代わりとしてテストが使える
※よく知っているミドルウェアが対象なら
テストファーストが効率良い
• ロールの定義とChefServerへのクエリベー
スの構成まで持っていけば量産体制へ
32
Saturday, July 6, 13
OpsWorksでシステム構築例
• アプリを中心に、まず必要な役割(レイヤ)を
考える
• なるべく標準レイヤでまかないつつ、無いも
のを追加していく
• レイヤは Custom Cookbook と Custom
Chef JSON で
• アプリのデプロイはChefのDeployリソース
一択
33
Saturday, July 6, 13
OpsWorksレイヤ追加
34
Cookbook
リポジトリ
OpsWorks
新しいレイヤ
Custom Cookbookで新しいレイ
ヤを作成。
個別設定、クレデンシャル情報な
どはCustom Chef JSONに定義
する。
Custom Chef JSON
Saturday, July 6, 13
新レイヤの利用
35
Cookbook
リポジトリ
OpsWorks
新しいレイヤ
既存レイヤはOpsWorks Backendを
通じて、新しいレイヤ上インスタン
スの情報を取得。
クレデンシャル等はJSONから。
Custom Chef JSON
既存レイヤ
OpsWorks
Backend
Saturday, July 6, 13
OpsWorksで
railsを
Chef Deploy
Saturday, July 6, 13
デプロイしたRailsアプリ
• Railsリポジトリ内にChefレシピを含める
• 他のAWSと連携する
• RailsServerとは別に、ワーカーデーモンが
ひとつ
• 定期的実行するCronにジョブを登録する
• ChefのDeployリソースなのでChefServerで
も大体通用
37
Saturday, July 6, 13
ChefのDeployについて
• デプロイを細かいタスクに分けて実行
• 各タスクの間にフックを仕込める
• 仕込み先は Railsプロジェクト の
リポジトリ
• migrate, symlink, restartの
それぞれberfore/afterのタイミング
38
Saturday, July 6, 13
他のAWSと連携するので
コンフィグを作る
• before_restartのフックでChefる
• deploy/before_restart.rb
39
aws_configs	
  =<<__EOL__
production:
	
  	
  access_key_id:	
  "#{node[:aws_configs][:access_key_id]}"
	
  	
  secret_access_key:	
  "#{node[:aws_configs][:secret_access_key]}"
__EOL__
file	
  ::File.expand_path('../../shared/config/aws.yml',	
  release_path)	
  do
	
  	
  action	
  :create
	
  	
  content	
  aws_configs
	
  	
  mode	
  '0660'
	
  	
  owner	
  'deploy'
	
  	
  group	
  'www-­‐data'
end
link	
  ::File.join(release_path,	
  'config/aws.yml')	
  do
	
  	
  to	
  ::File.expand_path('../../shared/config/aws.yml',	
  release_path)
	
  	
  owner	
  'deploy'
end
yamlの文字列作成
sharedの下にファイル設置
最新のアプリコードの下に
リンク作成
Saturday, July 6, 13
ワーカーデーモンを起動する 1/2
40
• 起動・終了スクリプトを設置するため
before_symlinkあたりのフックでChefる
• deploy/before_symlink.rb
sqs_start_script	
  =<<__EOL__
#!/bin/bash
export	
  RAILS_ENV=production
cd	
  #{::File.expand_path('../../current',	
  release_path)}
bundle	
  exec	
  thor	
  sqs:start	
  -­‐d	
  -­‐-­‐pidfile	
  tmp/pids/sqs_worker.pid
__EOL__
file	
  ::File.expand_path('../../shared/scripts/sqs_start',	
  release_path)	
  do
	
  	
  action	
  :create
	
  	
  content	
  sqs_start_script
	
  	
  mode	
  '0755'
	
  	
  owner	
  'deploy'
	
  	
  group	
  'www-­‐data'
end
開始スクリプトの
文字列作成
実行権をつけて設置
Saturday, July 6, 13
ワーカーデーモンを起動する 2/2
41
• 実際に(再)起動するため
after_restartのフックでChefる
• deploy/after_restart.rb
execute	
  'start	
  sqs_worker'	
  do
	
  	
  command	
  '/srv/www/rails_ses/shared/scripts/sqs_start'
	
  	
  action	
  :run
end
デーモン開始を
execute
Saturday, July 6, 13
Cronにジョブを登録する
42
• after_restartのフックでChefる
• deploy/after_restart.rb
cron	
  'add	
  sqs_scheduler'	
  do
	
  	
  action	
  :create
	
  	
  minute	
  '3/*'
	
  	
  command	
  ::File.expand_path('../../shared/scripts/scheduler',	
  release_path)
end
3分置きに実行するコマンドを
Cronに登録する
Saturday, July 6, 13
最後に
• OpsWorksの主題はアプリのライフサイクル
管理
• タスク実行にChefのレシピが使える
• 用意されているものから選択するのは楽
• ChefServerは用途色々
• 自由度が高い分、システムの目的・ノード
の役割をしっかり定義しておかないとぐだ
ります
43
Saturday, July 6, 13
OpsRock.in
44
Saturday, July 6, 13
以上
ありがとうございました
ご質問・ご相談は
適当にお越しください(^^)
Saturday, July 6, 13

Chef(Server)と AWS OpsWorks(tm)の比較