久々にAWSのサービスを触ってみました。というのもデプロイの仕組みをカイゼンしたいなーと考えていて、社内でもどうしよか?と話をしていました。 現状はfabricというPython製のツールを使っているのですが、fabricを動かす為に環境を整えてあげる必要があったり、依存しているライブラリのバグが影響して、デプロイができない時があったりと、深刻な状況です。 AWS CodeDeployであればマネジメントコンソールから実行もできるので、環境構築の手間が省けるので、良いのではと思い軽く触ってみました。 触ってみた感想と、CodeDeployを簡単に説明したいと思います。 ※5分は釣りです^^;
AWS CodeDeployとは
AWS CodeDeployはEC2,AutoScaling,オンプレミスに特化したデプロイサービスです。 たしか2014年11月ぐらいに登場しました。ただ、サービスを提供しているリージョンがオレゴン、ヴァージニアのみ(2015/04/19時点)ですので、 東京リージョンはまだ使えないです。残念。はやく対応してほしいです。
リポジトリとして、S3、Githubが対応しています。今後はAWS CodeCommitと連携もするようです。 うちの会社ではリポジトリをStashで管理している為、対応していません。今後に期待!?
CodeDeploy用語
codedeploy-agent デプロイ対象となるサーバには必須になる。 S3からコピーしてインストールする必要がある。
$ sudo yum update $ sudo yum install aws-cli $ cd /home/ec2-user $ aws s3 cp s3://aws-codedeploy-us-east-1/latest/install . --region us-east-1 $ chmod +x ./install $ sudo ./install auto
appspec.yml アプリケーションのソースコードをどのディレクトリに配置するか、どのような権限で付与するかを決めるファイル。 またCodeDeployのライフサイクルに応じた処理をどうするかとかも記載する。必須
Application Name アプリケーション名。そのまんまだけど、実際につけるとするとプロジェクト名_環境名って感じになるのかな? hoge_productionとか。
Deployment Group Name
デプロイ対象のグループ。グループの選び方はEC2のタグのKey,Value、AutoScalingGroup名、オンプレミス。
Deployment Configuration デプロイ方法。デフォルトでは、
- CodeDeployDefault.AllAtOnce
一度にすべてのインスタンスにデプロイする。最低1つのインスタンスにデプロイが成功した場合、全体のデプロイが成功したものとする。すべてのインスタンスへのデプロイが失敗した場合、全体のデプロイが失敗したものとする。- CodeDeployDefault.OneAtTime
インスタンス1つずつにデプロイする。全てのインスタンスにデプロイが成功した場合、全体のデプロイが成功したものとする。デプロイが失敗した時点で失敗と扱われるが、既にデプロイが成功したインスタンスはそのまま。- CodeDeployDefault.HalfAtTime
一度に総インスタンス数の半分までデプロイする。総インスタンス数の半分までデプロイが成功した場合、全体のデプロイが成功したものとする。全体のデプロイが失敗した場合でも、既にデプロイが成功したインスタンスはそのまま。
Service Role
CodeDeployがEC2インスタンスにアクセスするロール。
デプロイの流れ
他のブログを参考にデプロイするリポジトリ作りました。 1.Applicationの作成 実は上の画像がほぼApplicationの設定の流れになります。ここではアプリの名前とデプロイ対象のグループを作る感じ。その枠を決めたイメージです。
2.デプロイするリビジョンの選択
1でCreate Applicationしたら遷移する画面。
右のオレンジ枠がデプロイされたリビジョンの履歴が記載される所。ここから前のリビジョンをデプロイしたりする。つまりロールバックに使う感じ。
左の赤枠が、Deploy Group。ここからデプロイするソースを選択する。
S3,Githubを選択する画面。
実はデプロイを実行する度にこの画面の入力はしないといけない。 リポジトリ名、コミットIDをいちいち入力するのがすごく面倒くさい。 自動化必須
Deploy結果とNGパターン
デプロイに成功するとこうなります。
デプロイ対象のインスタンスは2台あったので成功してますね。
次にNGパターン
Deployment ConfigurationをCodeDeployDefault.OneAtTimeに設定していたので、一台ずつデプロイしています。
まず一台にデプロイしてFailedとなったので、残りのもう一台にはSkippedとなってデプロイ実行されてないです。
View All Instancesをクリック。
実際にどこで失敗したのかは赤枠を見ると分かります。
BeforeInstallで失敗したようです。
次に青枠のView Eventsを見てみましょう。
View Logsをクリック。
エラーメッセージが出てますね。よくわかりませんが。。。
この時どこに問題があったかというとappspec.ymlです。
appspec修正。
appspecのosの書き方が違ったので、修正
ほんとしょうもないミスなのですが、先ほどのメッセージからでは分かりにくいですよね。
まとめ
かなり雑になってしまいましたが、触ってみた感想を。
- 自動化しないとツライ。コミットIDとかいちいち入力するのツライ
- ロールバックするときにどのリビジョンがどういう修正だったかわからない。UIにタグが付けれて、デプロイする時に追加できると良いと思う。
- codedeploy-agentの死活監視必須
参考
GitHubリポジトリと連携してAWS CodeDeployを使う(準備編) GitHubリポジトリと連携してAWS CodeDeployを使う(デプロイ編) AWS CodeDeploy を使って Rails アプリケーションをデプロイしてみた [新サービス] AWS CodeDeployを触ってみた #reinvent