60
Chef(Server)と AWS OpsWorks(tm)の比較 2013/07/06 JAWS-UG Kobe 第2回 OpsWorks(Chef)特集 Saturday, July 6, 13

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

Embed Size (px)

DESCRIPTION

2013/07/06 JAWS-UG Kobe 第2回 OpsWorks(Chef)特集 発表スライド

Citation preview

Page 1: Chef(Server)と AWS OpsWorks(tm)の比較

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

2013/07/06JAWS-UG Kobe 第2回OpsWorks(Chef)特集

Saturday, July 6, 13

Page 2: Chef(Server)と AWS OpsWorks(tm)の比較

自己紹介

2

• http://opsrock.in 共同開発・運営• AWS OpsWorksとChefを主に取り扱うソリューションを提供

• 澤登 HiganWorks合同会社の代表社員• アプリケーションのためのプラットフォーム構築/運用自動化をテーマに活動

Saturday, July 6, 13

Page 3: Chef(Server)と AWS OpsWorks(tm)の比較

本日の内容• Chefの紹介• OpsWorksの紹介• それぞれの目的/用途と特徴• Chef/OpsWorks比較• Chef/OpsWorksでのシステム構築(Ops視点)

• OpsWorksでRailsをChef Deploy

3Saturday, July 6, 13

Page 4: Chef(Server)と AWS OpsWorks(tm)の比較

Chefの紹介

Saturday, July 6, 13

Page 5: Chef(Server)と AWS OpsWorks(tm)の比較

参考スライドから簡単に

5

http://www.slideshare.net/YukihikoSawanobori/what-is-chef201303

Saturday, July 6, 13

Page 6: Chef(Server)と AWS OpsWorks(tm)の比較

Chefって何するツール?• インフラ環境のメタデータ管理• ノードの役割を定義して収束させるフレームワーク

• 環境管理の作業を自動化/一般化するツール• Infrastructure as codeの思想を補助する

6Saturday, July 6, 13

Page 7: Chef(Server)と AWS OpsWorks(tm)の比較

泥臭いツールOhaiを中心にプラットフォーム互換性を支える• 設定収束のためにノード情報の収集• ディストリビューション判断のif elseif elseif elseif elseif ... (Ohai)

• パッケージとサービス管理をDSL(レシピ)で表わすためのChef::Providers(chef-client)

7Saturday, July 6, 13

Page 8: Chef(Server)と AWS OpsWorks(tm)の比較

収束・冪等性• Chef-ClientはノードをCookbookのレシピに書いたとおりの状態に近づけます

• 何度実行しても同じ結果、同じ状態となる (冪等) ようレシピにしておく事が重要

• このへん捕捉• 全てのレシピを常に実行状態(run_list)しておく必要はない

• 構成変更時専用のレシピもあり(でも冪等)

8

beki tou sei

Saturday, July 6, 13

Page 9: Chef(Server)と AWS OpsWorks(tm)の比較

Chef形態あれこれ• Server

• Hosted ChefServer

• OpscodeのSaaS

• Private ChefServer

• Opscodeのサービス

• OpenSource ChefServer

• Linux(ほぼUbuntu)にインストールできるChefサーバ

• Client

• Chef-Client: Serverとセットで

• Chef-Solo:単独の簡易版

9Saturday, July 6, 13

Page 10: Chef(Server)と AWS OpsWorks(tm)の比較

OpsWorksの紹介

Saturday, July 6, 13

Page 11: Chef(Server)と AWS OpsWorks(tm)の比較

こちらも参考スライドから

11

http://www.slideshare.net/YukihikoSawanobori/copy-2013-0622awsopsworksoverview

Saturday, July 6, 13

Page 12: Chef(Server)と AWS OpsWorks(tm)の比較

AWS OpsWorksとは?

12Saturday, July 6, 13

Page 13: Chef(Server)と AWS OpsWorks(tm)の比較

AWS OpsWorksとは?

12

• アプリケーションのライフサイクル管理を一本化するために作られたソリューション

Saturday, July 6, 13

Page 14: Chef(Server)と AWS OpsWorks(tm)の比較

AWS OpsWorksとは?

12

• アプリケーションのライフサイクル管理を一本化するために作られたソリューション

• プラットフォームの自動構築

Saturday, July 6, 13

Page 15: Chef(Server)と AWS OpsWorks(tm)の比較

AWS OpsWorksとは?

12

• アプリケーションのライフサイクル管理を一本化するために作られたソリューション

• プラットフォームの自動構築• アプリケーションのdeploy(undeploy)

Saturday, July 6, 13

Page 16: Chef(Server)と AWS OpsWorks(tm)の比較

プラットフォームの自動構築• アプリケーションが動作するプラットフォームとは?

• ネットワーク環境の構築• サーバ(インスタンス)の調達• ミドルウェアの設定

13Saturday, July 6, 13

Page 17: Chef(Server)と AWS OpsWorks(tm)の比較

プラットフォームの自動構築• アプリケーションが動作するプラットフォームとは?

• ネットワーク環境の構築• サーバ(インスタンス)の調達• ミドルウェアの設定

13Saturday, July 6, 13

Page 18: Chef(Server)と AWS OpsWorks(tm)の比較

プラットフォームの自動構築• アプリケーションが動作するプラットフォームとは?

• ネットワーク環境の構築• サーバ(インスタンス)の調達• ミドルウェアの設定

13Saturday, July 6, 13

Page 19: Chef(Server)と AWS OpsWorks(tm)の比較

プラットフォームの自動構築• アプリケーションが動作するプラットフォームとは?

• ネットワーク環境の構築• サーバ(インスタンス)の調達• ミドルウェアの設定

13Saturday, July 6, 13

Page 20: Chef(Server)と AWS OpsWorks(tm)の比較

プラットフォームの自動構築• アプリケーションが動作するプラットフォームとは?

• ネットワーク環境の構築• サーバ(インスタンス)の調達• ミドルウェアの設定

13Saturday, July 6, 13

Page 21: Chef(Server)と AWS OpsWorks(tm)の比較

アプリケーションのdeploy• アプリケーション≒ソースコード(リポジトリ)• git, svn, zip(http, s3)+ 何らかの配布/ビルドの仕組み

14Saturday, July 6, 13

Page 22: Chef(Server)と AWS OpsWorks(tm)の比較

アプリケーションのdeploy• アプリケーション≒ソースコード(リポジトリ)• git, svn, zip(http, s3)+ 何らかの配布/ビルドの仕組み

14Saturday, July 6, 13

Page 23: Chef(Server)と AWS OpsWorks(tm)の比較

アプリケーションのdeploy• アプリケーション≒ソースコード(リポジトリ)• git, svn, zip(http, s3)+ 何らかの配布/ビルドの仕組み

14

OpsWorks Agent

Saturday, July 6, 13

Page 24: Chef(Server)と AWS OpsWorks(tm)の比較

アプリケーションのdeploy• アプリケーション≒ソースコード(リポジトリ)• git, svn, zip(http, s3)+ 何らかの配布/ビルドの仕組み

14

OpsWorks Agent

タスク実行

Saturday, July 6, 13

Page 25: Chef(Server)と AWS OpsWorks(tm)の比較

アプリケーションのdeploy• アプリケーション≒ソースコード(リポジトリ)• git, svn, zip(http, s3)+ 何らかの配布/ビルドの仕組み

14

OpsWorks Agent

タスク実行 タスク実行管理

Saturday, July 6, 13

Page 26: Chef(Server)と AWS OpsWorks(tm)の比較

OpsWorksを理解する用語集• スタック• 特定のアプリケーションシステム全体• レイヤ• アプリケーション動作プラットホームを役割別に定義するインスタンスの集合

• WEB役,DB役など• ライフサイクル (次ページへ)

15Saturday, July 6, 13

Page 27: Chef(Server)と AWS OpsWorks(tm)の比較

1.Setup2.Configure3.Deploy4.UnDeploy5.Shutdown

16

OpsWorksのライフサイクル定義

Saturday, July 6, 13

Page 28: Chef(Server)と AWS OpsWorks(tm)の比較

1.Setup2.Configure3.Deploy4.UnDeploy5.Shutdown

16

OpsWorksのライフサイクル定義

プラットフォーム部分

Saturday, July 6, 13

Page 29: Chef(Server)と AWS OpsWorks(tm)の比較

1.Setup2.Configure3.Deploy4.UnDeploy5.Shutdown

16

OpsWorksのライフサイクル定義

プラットフォーム部分

アプリケーション部分

Saturday, July 6, 13

Page 30: Chef(Server)と AWS OpsWorks(tm)の比較

Chef / OpsWorksそれぞれの

目的/用途と特徴

Saturday, July 6, 13

Page 31: Chef(Server)と AWS OpsWorks(tm)の比較

その前に...それぞれの印象

18

OpsWorks

Chef

•”アプリ”のデプロイ、ライフサイクル管理に 全力特化•しきたりが意外と重要

•使い方は色々•”プラットフォーム”を結構広い意味で取り扱える

※発表者個人の感想です、先入観を持たないようお願いします

Saturday, July 6, 13

Page 32: Chef(Server)と AWS OpsWorks(tm)の比較

その前に...それぞれの印象

18

OpsWorks

Chef

•”アプリ”のデプロイ、ライフサイクル管理に 全力特化•しきたりが意外と重要

•使い方は色々•”プラットフォーム”を結構広い意味で取り扱える

※発表者個人の感想です、先入観を持たないようお願いします

Saturday, July 6, 13

Page 33: Chef(Server)と AWS OpsWorks(tm)の比較

その前に...それぞれの印象

18

OpsWorks

Chef

•”アプリ”のデプロイ、ライフサイクル管理に 全力特化•しきたりが意外と重要

•使い方は色々•”プラットフォーム”を結構広い意味で取り扱える

※発表者個人の感想です、先入観を持たないようお願いします

Saturday, July 6, 13

Page 34: Chef(Server)と AWS OpsWorks(tm)の比較

対応OSディストリビューション

19

OpsWorks

Chef

•AmazonLinux(CentOSベース)•Ubuntu12.04

•redhat系、Debian系•Windows、MacOSX•FreeBSD、Solaris•などなど各種対応

Saturday, July 6, 13

Page 35: Chef(Server)と AWS OpsWorks(tm)の比較

クラウドインテグレーション

20

OpsWorks

Chef

•AWSとはそこそこ。•ELB, CloudWatchなどとデフォルト連携OK

•Bootstrapとプラグインで大概対応可•サーバ調達IaaSもどこでもいい(EC2, OpenStack,Joyent等)•そもそもIaaSをChefで構築したり(OpenCenter(OpenStack)など)

Saturday, July 6, 13

Page 36: Chef(Server)と AWS OpsWorks(tm)の比較

CookBooks管理

21

OpsWorks

Chef

•システム一式を同一リポジトリでまとめて管理する必要がある•スタックへの更新は一括適用

•ChefServerにCookbookバージョン管理の仕組みを備える•Berkshelf,Librarian等、Server/Solo問わず使いやすいツールあり

Saturday, July 6, 13

Page 37: Chef(Server)と AWS OpsWorks(tm)の比較

Chefのバージョン

22

OpsWorks

Chef

•0.9.15.5(2013/07時点)•Defenition, LibrariesとLWRPはひと通り使えるが最近の書式に対応していない箇所も

•11.x•コミュニティCookbooksはほぼ10以降のバージョン用

Saturday, July 6, 13

Page 38: Chef(Server)と AWS OpsWorks(tm)の比較

ChefClientの実行

23

OpsWorks

Chef

•ライフサイクルの進行ごとにChefSoloを順次実行。(都度JSON作成)•Chef単純にタスク実行としての意味合いが強い•イベント対応でオンタイム実行も

•ChefClientでChefServerと通信•基本はCronで継続的に実行

Saturday, July 6, 13

Page 39: Chef(Server)と AWS OpsWorks(tm)の比較

ノードのAttributes

24

OpsWorks

Chef

•スタック・レイヤの情報のみが随時更新&構成に利用可能•ユーザ指定はスタックの”Custom Chef Json”にて

•Ohaiの収集情報がServerに集約され、フルに活用できる。•レシピ内でのSetAttribute、Role他でのAttributeマージor更新が柔軟

Saturday, July 6, 13

Page 40: Chef(Server)と AWS OpsWorks(tm)の比較

テストスイート

25

OpsWorks

Chef

•地味にminitest-chef-handlerが付いている。•cookbooks内に受け入れtestを書いて、Failさせることは可能。•ServerSpecもおそらく有効

•Vagrantを軸にtest-kitchenなどのツールが揃っている•ChefSpec, FoodcriticなどCookbookごとのテストもそこそこやりやすい

Saturday, July 6, 13

Page 41: Chef(Server)と AWS OpsWorks(tm)の比較

Chef/OpsWorksでのシステム構築(Ops視点)

Saturday, July 6, 13

Page 42: Chef(Server)と AWS OpsWorks(tm)の比較

テーマはアプリケーションの

ホスト

Saturday, July 6, 13

Page 43: Chef(Server)と AWS OpsWorks(tm)の比較

Chefでシステム構築例• まず単体サーバ• とりあえずアプリケーションを動かすところへ持っていく

• ミドルウェアの設定にChefを使っていく• アプリのデプロイは場合によってツールを選択

• 構築中:Capistrano=> 本番: CapistranoまたはChefなど

28Saturday, July 6, 13

Page 44: Chef(Server)と AWS OpsWorks(tm)の比較

ステップ1:構築初期

29

ChefServer

DevServer

APP

ミドルウェアを適当に設定

手動設定をCookbookに起こしながらDevサーバ側で実行を繰り返して調整。先にテストを書くのもベター。

Saturday, July 6, 13

Page 45: Chef(Server)と AWS OpsWorks(tm)の比較

ステップ2:役割定義

30

ChefServer

DevServer

APP

HTTP Proxy

アプリケーションのプラットフォームとして、各種ミドルウェアを役割別に分類し、グループ化する。

QueueServer

Roleとしてrun_listを登録していくKVS(Cache)

MailServerDatabaseApp Runtime

Saturday, July 6, 13

Page 46: Chef(Server)と AWS OpsWorks(tm)の比較

ステップ3:Staging/本番展開

31

ChefServer

StagingServer1

役割(Role)はChefServerのSearchAPIを使うか、DataBagなどで集中管理してそれぞれのIP(場所)をお互い知れるようにしておく。

Roleのrun_listを適用していく

StagingServer2

StagingServer3

StagingServer4

StagingServer5

StagingServer6Database

MailServer

QueueServer

APPAPP

AppRuntime AppRuntime

HTTP Proxy

KVS(Cache)

Saturday, July 6, 13

Page 47: Chef(Server)と AWS OpsWorks(tm)の比較

Chefで構築まとめ• 最初は開発サーバを直接適当にいじりながら徐々にCookbookへ

• 最終的には開発サーバもChef実行で収束するようにしておく(手作業再現)

• 手作業の代わりとしてテストが使える※よく知っているミドルウェアが対象ならテストファーストが効率良い

• ロールの定義とChefServerへのクエリベースの構成まで持っていけば量産体制へ

32Saturday, July 6, 13

Page 48: Chef(Server)と AWS OpsWorks(tm)の比較

OpsWorksでシステム構築例• アプリを中心に、まず必要な役割(レイヤ)を考える

• なるべく標準レイヤでまかないつつ、無いものを追加していく

• レイヤは”Custom Cookbook”と”Custom Chef JSON”で

• アプリのデプロイはChefのDeployリソース一択

33Saturday, July 6, 13

Page 49: Chef(Server)と AWS OpsWorks(tm)の比較

OpsWorksレイヤ追加

34

Cookbookリポジトリ

OpsWorks

新しいレイヤCustom Cookbookで新しいレイヤを作成。個別設定、クレデンシャル情報などはCustom Chef JSONに定義する。

Custom Chef JSON

Saturday, July 6, 13

Page 50: Chef(Server)と AWS OpsWorks(tm)の比較

新レイヤの利用

35

Cookbookリポジトリ

OpsWorks

新しいレイヤ

既存レイヤはOpsWorks Backendを通じて、新しいレイヤ上インスタンスの情報を取得。クレデンシャル等はJSONから。

Custom Chef JSON

既存レイヤ

OpsWorks Backend

Saturday, July 6, 13

Page 51: Chef(Server)と AWS OpsWorks(tm)の比較

OpsWorksでrailsを

Chef Deploy

Saturday, July 6, 13

Page 52: Chef(Server)と AWS OpsWorks(tm)の比較

デプロイしたRailsアプリ• Railsリポジトリ内にChefレシピを含める• 他のAWSと連携する• RailsServerとは別に、ワーカーデーモンがひとつ

• 定期的実行するCronにジョブを登録する

• ChefのDeployリソースなのでChefServerでも大体通用

37Saturday, July 6, 13

Page 53: Chef(Server)と AWS OpsWorks(tm)の比較

ChefのDeployについて• デプロイを細かいタスクに分けて実行• 各タスクの間にフックを仕込める• 仕込み先は”Railsプロジェクト”のリポジトリ

• migrate, symlink, restartのそれぞれberfore/afterのタイミング

38Saturday, July 6, 13

Page 54: Chef(Server)と AWS OpsWorks(tm)の比較

他の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

Page 55: Chef(Server)と AWS OpsWorks(tm)の比較

ワーカーデーモンを起動する 1/2

40

• 起動・終了スクリプトを設置するためbefore_symlinkあたりのフックでChefる

• deploy/before_symlink.rbsqs_start_script  =<<__EOL__#!/bin/bash

export  RAILS_ENV=productioncd  #{::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

Page 56: Chef(Server)と AWS OpsWorks(tm)の比較

ワーカーデーモンを起動する 2/2

41

• 実際に(再)起動するためafter_restartのフックでChefる

• deploy/after_restart.rbexecute  'start  sqs_worker'  do    command  '/srv/www/rails_ses/shared/scripts/sqs_start'    action  :runend

デーモン開始をexecute

Saturday, July 6, 13

Page 57: Chef(Server)と AWS OpsWorks(tm)の比較

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

Page 58: Chef(Server)と AWS OpsWorks(tm)の比較

最後に• OpsWorksの主題はアプリのライフサイクル管理

• タスク実行にChefのレシピが使える• 用意されているものから選択するのは楽• ChefServerは用途色々• 自由度が高い分、システムの目的・ノードの役割をしっかり定義しておかないとぐだります

43Saturday, July 6, 13

Page 59: Chef(Server)と AWS OpsWorks(tm)の比較

OpsRock.in

44Saturday, July 6, 13

Page 60: Chef(Server)と AWS OpsWorks(tm)の比較

以上ありがとうございましたご質問・ご相談は

適当にお越しください(^^)

Saturday, July 6, 13