【インフラ】環境構築・共有について、わかっておいた方がいいツールたち【Vagrant/Chef/Docker/Ansible/AWS】
Vagrant
VagrantはVirtual Boxなどの仮想化ソフトウェアと一緒に使うツール。Vagrantはプロバイダ(仮想化ソフトウェア)を選択できるので、他にもVMwareやAmazon EC2で使うこともできる。
VagrantとVirtual Boxを使って何がしたいのか
- 実行環境を開発と本番で揃えたい。
- 開発環境を構築する際に個人のローカル環境に依存しないようにしたい。
- すぐに使える仮想環境を構築したい。
- 環境構築を自動化したい。
- チームで同一の環境を簡単に構築したい。
環境構築の自動化
Vagrant は Chef、puppet などの構成管理ツールと連携して環境構築を自動化できる。 vagrant up した時点で自動で環境は構築される。
Virtual Boxのスナップショット機能を使えば、以前の状態に元に戻すことができる。
Chefとは
ruby製のサーバの構成管理ツールで、サーバ構築の自動化をしてくれるツール。
ソフトウェアのインストールや設定などを設定ファイルに記述しておくことで、サーバをその設定ファイルの状態にしてくれる。設定ファイルにはサーバのあるべき完成状態を記述し、その差分をChefがうまいこと埋めてくれる感じ。
Chef用語
- Node:Chef Serverに接続するClientの中で、Chefで管理するマシンのこと。
- Client:Chef Serverに接続するもの全て。管理ツール(knife等)もClient
- knife: Chefに付属するためのリポジトリ操作ツールです。このコマンドを使ってCookbookを作ったり、NodeとRecipeを関連付けたりします。
Dockerとは
- Linux上で独立した別のLinuxシステムを起動することができる、コンテナ型の仮想化ソフトウェアの一つ
- コンテナ型の仮想化では仮想的な物理マシンの構築は行わず、元のOS環境上に隔離されたエリアを作り、仮想的に新たなOS実行環境を作り出す。
- OSの設定やアプリケーションソフトの導入の済んだLinux環境を丸ごと実行イメージとして保存する機能があり、別のマシンのDockerに持ち込んでそのまま実行することができる。これをソフトウェアの配布に応用すれば、複雑な導入・設定作業を省略し、元の環境との違いなどを意識しなくても簡単にソフトウェアを導入できるようになる。
Docker特徴
- Dockerの特徴の1つとして、新しい独自技術はほとんど使っていないということがある。コンテナー管理に必要となる既存のOSS(オープンソースソフトウェア)を組み合わせて、コマンドラインおよびREST APIで手軽かつ効率良くコンテナー管理ができるようになっている
- AWS(Amazon Web Services)やGCE(Google Compute Engine)などのクラウド環境で動作するのも大きな特徴。
- Dockerは、Go言語で開発されている。また、Linuxカーネルの機能やLinux向けファイルシステムに依存するため、Linuxでのみ動作する。
Dockerのメリット
- アプリケーションを少ないリソースで効率良く実行できる
=> コンテナー型の仮想化はハイパーバイザー型の仮想化に比べ、CPUなどコンピューターリソースのオーバーヘッド(仮想化のために必要になる余分なリソース)が少ないため、リソースの少ないハードウェアでも実行できる。 - githubで管理できる
=>Dockerはコンテナーの構成を全て「Dockerfile」というテキストファイルに記述できるため、「Infrastructure as Code(インフラ構成をGitHubなどのコードリポジトリで管理)」を実践するツールとしても利用できる。
Ansible
Chefのとおなじく構成管理ツール。
Ansible用語
- モジュール -クライアント内での動きは「モジュール」として定義される。ソフトウェアをインストールしたり、サービスの起動をしたりするモジュールはあらかじめ用意されている。
-自分でモジュールを作成することも可能。
-このモジュールは何で作成してもいいので、Pythonの知識は必要ない。決められた出力形式(key-value形式かJSON)を守ればOK
- Play book -Chefでいうところのレシピ。モジュール処理をまとめたものが「Play book」と呼ばれる。YAML形式で記述。
Google App Engine
App Engineは一般的なWeb技術をフルサポートし、ストレージ、ユーザー認証やメール送信用のGoogle API、自動的なスケーリングや負荷分散などを提供する。利用者はappspot.comドメイン上で自由なドメイン名を使って、あるいはGoogle Appsを使って自分のドメインでアプリケーションを提供できる。アプリケーションは公開することも、社内メンバーだけにアクセスを限定することも可能だ。対応言語は現時点ではPythonのみだが、今後サポートを拡大するという。
AWS
Amazon Web Services(アマゾンウェブサービス)の略称で、 Amazon.com社が行っているサービスの名称。てっとりばやいのはこの動画(http://aws.amazon.com/jp/getting-started/)
急激に成長しているサービスで、アメリカでは政府機関が使っているほど高いセキュリティを保っている。提供されてるサービスがとても多い。
Amazon EC2
- 仮想化されたWebサーバのコンピュータリソースを自由に使え、わずか数分で起動させることができる重量課金制のWEBサービス。
- WEBサーバやDBサーバ、キャッシュサーバーなどなど色々な用途に使えるサーバ。
Auto Scaling
あらかじめ設定をしておくと、突然のサーバ負荷の際に自動的にサーバを増やしたり減らしたりしてくれる。
Amazon S3
データストレージサービスです。 データの格納と取り出しに特化。 コンテンツのストレージや配信する際などに使用される。
Amazon RDS
データベースとして使用される。
AWSの課金について
サーバの利用料は使った分だけお金がかかる従量課金。
他にもディスク利用料、データ転送量などがかかるが、 サーバ利用料が8割を占めることらしいので、 サーバ利用料の仕組みをわかれば怖いものなし。
サーバ課金には以下の3つがある 1.オンデマンドインスタンス:サーバが起動している時間によってお金が増えていく。 2.リザーブドインスタンス:一定額の金額を先に払ってしまうことで、1時間あたりの単価を大幅に下げることができる。 3.ライセンス課金
参考・引用させていただいたサイト
Vagrantって流行ってるらしいけど何が便利なの? アプリ開発者もインフラ管理者も知っておきたいDockerの基礎知識 構成管理ツール Ansibleを使ってみる Webサービス開発に関わるなら知っておきたい「AWS」とは?
インフラの道 1-1
冗長化:
障害が発生しても予備の機材で機能を継続できるようにするもの
Active/Back up構成
コールドスタンバイ:予備機を普段は使わない、危機で使う
ホットスタンバイ:現用機と予備機を常に同じ状態にしておく
フェイルオーバ:危機のさい自動的に処理を予備機に引き継ぐ
サーバをフェイルオーバするとき
現用機であるweb1に自己IPとはべつに仮想IP(VIP)割り当て webサービスはVIPで提供 危機のさい、web2(予備機)にVIP引き継ぎ
ヘルスチェック
現用機に障害がないかチェック * ICMP監視 echoリクエスト * ポート監視 TCP接続 * サービス監視 HTTPリクエストの反応
LANの世界では、IPアドレスではなくMACアドレス(media access control address)を使って通信をしている
他のサーバにパケットを送るさいには、 MACアドレスを取得するため、ARP(Address Resolution Protocol)を使う 取得したMACアドレスは一定のあいだARPテーブルに格納
=>なので、ほかのサーバのARPテーブルを更新してもらわないと、IPアドレス引き継げない。
=>そのため、gratutious ARP(GARP)をつかう。
API作成概要
API作成について
エンドポイントとは:
web APIにおけるエンドポイントは、アクセスするためのURIを指す。
エンドポイントの設計の原則:
覚えやすく、どんな機能をもつURIなのかすぐわかること
URI(エンドポイント)がAPIにおいて操作する対象(リソース)を表す
HTTPメソッドは何をするかを表す
メソッド
get リソース取得
post リソース新規登録
put 既存リソース更新
delete リソース削除
patch リソース一部変更
head リソースのメタ情報の取得
HTMLのフォームの仕様では、getとpostのみがサポートされているため、それ以外のメソッドを使うK十ができない。
そこで、
* X-HTTP-Method-OverrideというHTTPリクエストヘッダを利用
* _methodというパラメータを利用:
application/x-www-from-urlencodedという今テントタイプで表されるデータの一つとしてメソッドを送信する。
railsで利用。Formパラメータのひとつとして、_method=PUTなどとして指定
スペースやエンコードを必要とする文字をエンドポイントとしてつかわない
URIでは利用できない文字があり、そういった文字はパーセントエンコーディングと呼ばれる文字コードを%つきで表した表記法を利用して表すが、よろしくない。
また、ホワイトスペースはURIでは+に変換される、kろえも見づらいからよくない。
検索と取得位置のパラメータ
アイテム数50個/ページ表示するとき、3ページめ(101個めのアイテムから表示)するならURIは
per_page=50&page=3 や limit=50&offset=100
が好ましい
どちらかというと、limit/offsetのほうがユーザの自由度は高い
絞り込み
名前検索
v1/people-search?first-name=Clair
タグ検索
v1/blog/pitchersandpoets.tumblr.com/posts?tag=new+york+yankees
twitter/1.1/search/tweets.json?q=%23freebandnames
OAuth
広く第三者に公開されるAPIにおいて認可を行うために利用される
自分がサービスを公開して、fbと連動させる場合に、
使用者がfacebookに登録している情報を利用していいか自身のサービスに許可を与えられる仕組みがOAuth
OAuthのポイントは、自身のサービスに対してユーザがfacebookのパスワードを入力する必要がないところ。
認可プロセスにおいて、fbの提供するウェブページを経由して認証するから。
データフォーマット
この本から学んだことをまとめました.
SVMチューニングのさい、参考にしたサイトたち
教師あり学習・教師なし学習 概要
教師なし学習
消費インテリジェンスの観点から言うと教師なし学習のほうが大事
クラスタリング
イメージ
新宿や渋谷、早稲田など駅のクラスタリング
使われ方
顧客購買履歴データを用いた、顧客セグメンテーション
マーケティングへの応用、広告配信
顧客のセグメンテーション
・やりくり上手層
・価格志向層
・贅沢ブランド層
・伝統保守層
とか
たとえばfbの日本人の音楽のlikeとかを分析すると、17のセグメンテーションが可能らしい
設計時の論点
各データをどのようにベクトルとして表現するか
教師あり学習
多クラス分類
多次元空間にデータを配置
境界平面を引く
未知データを投入=>自動判定
分類の数だけベクトルがある
アルゴリズムの工夫のほとんどは計算量をおさえるための工夫
どのようにデータを表現するか?:テキストデータ
形態素分析
・形態素にわける
・辞書
・Chasen, Mecab
どのようにわけるか?
選択するアルゴリズムにより分類、回帰制度が異なる
機械学習器構築において、チューニングする箇所は多く存在
まずは手を動かし、自ら組んでみることが大事
始め方の案
1 すべてスクラッチでプログラミング
2 機械学習ライブラリ scikit-learnなどを使いプログラミング
3 統計解析ソフトウェアをつかう
機械学習における7つの基本動作になれることが大事
1.データの入手
2. データ前処理
3. 手法の選択
4. パラメータの選択
5. モデルの学習
6. モデルの評価
7. チューニング 3から6を繰り返す
データの可視化について
データの可視化
なぜ必要か
- 一言でいうと、何が見て取れるか?を示す
- 表現の軸として、以下
比較
こう違う、こうにている、こう変化している
関係性
これとこれはこういう関係がある、ない
構成
これは、こういう要素で構成されている
分布
これこれの中身は偏っている、分散している
良い可視化、悪い可視化を見分ける
- 全ての次元(軸)が意味を持っているか?:色、大きさ、x軸、y軸...
- グラフのどこを見て欲しいか明確か?
例えば、この図.
1. 円グラフはそもそもあまりよくない
面積という情報が%と対応していないし、そもそも曲げているから角度もわかりにくい
2. 色のつけ方がわかりにくすぎる