EC2のRHELにKnife-Zeroインストール
EC2上の多数のインスタンスを管理する目的でChefを導入検討。
どのChefを選ぶべきかは以下が参考になる。
http://www.creationline.com/lab/9970
以下からEC2上にchef-dkをインストールします。
https://downloads.chef.io/chef-dk/redhat/Chef Development Kit | Chef Downloads | Chef
待ちます...
ダウンロードが完了したら、実行してください。
ツールのインストールが始まります。
インストールが完了すればターミナルに戻ってknife-zeroを入れます。
$ chef gem install knife-zero $ chef generate repo chef $ chef exec knife cookbook create apache -o cookbooks
試しにレシピを作成する
vi cookbooks/apache/recipes/default.rb
package "httpd" do action :install end service "httpd" do action [ :enable, :start ] end
対象ノードを用意する(sgにknife-zeroのipを追加する必要)
新規ノードを追加、Chefクライアントインストールのみ→--nameでNameタグのvalueを追加
knife zero bootstrap 54.169.166.107 -x root -i ~/.ssh/aws_ap-southeast-1.pem --node-name Chef-node1 knife zero bootstrap 54.179.160.36 -x root -i ~/.ssh/aws_ap-southeast-1.pem --node-name Chef-node2
ロールリストを追加&レシピ実行
今回はnodeを2台追加する。
knife zero bootstrap 54.169.166.107 -x root -i ~/.ssh/aws_ap-southeast-1.pem --node-name Chef-node1 -r 'role[chef-sample]' knife zero bootstrap 54.179.160.36 -x root -i ~/.ssh/aws_ap-southeast-1.pem --node-name Chef-node2 -r 'role[chef-sample]'
追加したノードにChef-Clientを再実行
これを実行すると更新したレシピをnodeに送信してChef-Clientを実行してレシピの内容を反映してくれる。
./nodeディレクトリのある場所で実行する
knife zero converge "name:*" -a knife_zero.host -x root -i ~/.ssh/aws_ap-southeast-1.pem -o 'role[chef-sample]' -C 2
- -C 並列度
- -o ランリストを上書きする
これで複数台のnodeを管理するknife-zero環境が出来上がった。
次はレシピとテンプレートを作成する。
CodeDeploy agentを既存EC2インスタンス(CentOS6)に入れてみた
CodeDeployとは
- CodeDeployはEC2/AutoScalingのみに特化したデプロイ系サービス
- 似たものではElasticBeanstalk、OpsWorksなどがある
- ローテーションやCIツールとの連携などの細やかなデプロイが可能なサービス
- 費用はかからずEC2インスタンス利用料のみ
東京、オレゴン、シンガポールの3リージョンで実行したかったがシンガポールが未対応。
今後の対応に期待してシンガポールではなくアイルランドかフランクフルトを選択することにする。
Supported Regions
米国東部 (バージニア北部) 米国西部 (オレゴン) EU (アイルランド) EU (フランクフルト) アジアパシフィック (シドニー) アジアパシフィック (東京)
既存のインスタンスで使うにはCodeDeploy Agentを入れる必要がある。
環境としてはCentOS6に色々入っている状態のAMIを使用する。
CentOSにagentインストール
sudo yum update sudo yum install ruby → 1.8.7インストール済み sudo yum install aws-cli → インストール済み cd ~ aws s3 cp s3://aws-codedeploy-eu-central-1/latest/install . --region eu-central-1 sudo ./install auto
インストールしようとしたらソースの置いてあるS3にアクセスができずにエラーが出た。
どうやら事前にIAMロールでCodeDeployServiceRoleを付与する必要があるらしい。
個別でIAMを作ってみたがEC2作成画面でIAMを選択出来ない。
調べてみるとインスタンスプロファイルを作成して登録していないと選択出来ないようだ。
この辺りはよくわかっていないので後ほど調べる。
インスタンスプロファイル作成
aws iam create-instance-profile --instance-profile-name CodeDeployServiceRole
インスタンスプロファイル登録
aws iam add-role-to-instance-profile --role-name CodeDeployServiceRole --instance-profile-name CodeDeployServiceRole
さらにcredentialsも設定できていなかったので設定。
# aws configure AWS Access Key ID [None]: AKIAJTDHWNRQ64IKDGBQ AWS Secret Access Key [None]: **************************** Default region name [None]: Default output format [None]:
再度
# aws s3 cp s3://aws-codedeploy-eu-central-1/latest/install . --region eu-central-1
やっと進んだ、と思ったら
# sudo ./install auto I, [2015-11-17T12:34:04.863059 #3583] INFO -- : Starting Ruby version check. E, [2015-11-17T12:34:04.863244 #3583] ERROR -- : Current running Ruby version for root is 1.8.7, but Ruby version 2.0.x needs to be installed. E, [2015-11-17T12:34:04.863280 #3583] ERROR -- : If you have Ruby version 2.0.x installed for other users, please create a symlink to /usr/bin/ruby2.0. E, [2015-11-17T12:34:04.863309 #3583] ERROR -- : Otherwise please install Ruby 2.0.x for root user.
今度はRubyのバージョンでエラー。
# ruby -v ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
現状1.8.7なのでこれを2.0以上に上げる必要がある。
rubyをremoveして安定版をインストール
yum remove ruby cd /opt git clone git://github.com/sstephenson/rbenv.git mkdir /opt/rbenv/plugins cd /opt/rbenv/plugins git clone git://github.com/sstephenson/ruby-build.git vi /etc/profilevi export RBENV_ROOT="/opt/rbenv" export PATH="${RBENV_ROOT}/bin:${PATH}" eval "$(rbenv init -)"
再ログインするとか、シェルを再起動して環境設定を反映。
# yum install gcc make openssl-devel libffi-devel readline-devel
2015/11/17現在で2.2.3が最新安定バージョンのようなのでそちらを適用。
# rbenv install 2.2.3
# rbenv global 2.2.3
# ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
再度やってみる
[root@khkstg-RMQ-uw2b ~]# ./install auto I, [2015-11-17T14:47:36.808461 #30200] INFO -- : Starting Ruby version check. E, [2015-11-17T14:47:36.808562 #30200] ERROR -- : Current running Ruby version for root is 2.2.3, but Ruby version 2.0.x needs to be installed. E, [2015-11-17T14:47:36.808586 #30200] ERROR -- : If you have Ruby version 2.0.x installed for other users, please create a symlink to /usr/bin/ruby2.0. E, [2015-11-17T14:47:36.808603 #30200] ERROR -- : Otherwise please install Ruby 2.0.x for root user.
あれ、、、?、、、あっ。
2.0.x以上じゃなくて。2.0.x系じゃないとダメなんだね。英語が読めないつらみ。
ruby2.0.0を入れる
rbenvだとglobalでデフォルトのバージョンを指定できるので削除する必要はなく指定するだけでOKっぽい。
# rbenv install 2.0.0-p647 # rbenv global 2.0.0-p647 # ruby -v
agentインストール実行
# ./install auto インストールしています : codedeploy-agent-1.0-1.825.noarch 1/1 Starting codedeploy-agent:Installing codedeploy-agent auto-update cron in '/etc/cron.d/codedeploy-agent-update'... Installing codedeploy-agent auto-update cron in '/etc/cron.d/codedeploy-agent-update'...Complete Verifying : codedeploy-agent-1.0-1.825.noarch 1/1 インストール: codedeploy-agent.noarch 0:1.0-1.825 完了しました!
無事に成功しました!
最後に自動起動を設定して完了。
chkconfig --level 3 codedeploy-agent
次はCodeDeployを実際に使ってみます。
ロードバランサとDNSラウンドロビン
「Webエンジニアが知っておきたいインフラの基礎」を読んでいて気になった部分をメモ。
ネットワークに弱いのでこの辺りも必修。
DNSラウンドロビン
L7 HTTP SMTPまで
L7のロードバランサはリバースプロキシともいう
- メリット:追加の設備が必要なく障害点が増えない、一人からの大量アクセスが分散できない
- デメリット:切り替えが遅い
基本はロードバランサを利用しつつ、適宜DNSラウンドロビンを併用していくのが良いらしい。ロードバランサにはヘルスチェックと言って振り分け先の応答を確認して応答なければ切り離したりも出来る。
高機能なロードバランサだと振り分け先がダメだとエラーを返さずに別の振り分け先に振り分け直す機能もある。nginxはOSSだか同じ機能があるらしい。nginxはapacheと似たようなものだけど高機能、というイメージがあったがやはり細かい部分で違いがあるようだ。