皆さんAWSのOpsWorksはご存知でしょうか?
僕が現場で開発しているサービスではアプリケーションのデプロイやサーバー構築の自動化としてOpsWorksを使用しています。
OpsWorksを使用している理由としては、サーバー構成管理ツールChefによりEC2インスタンスの設定、デプロイ、および管理を自動化が可能であること、つまり環境一式を自動構築できることにあります。
要件に応じて柔軟に環境構成を変更できる、Elastic BeanstalkとCloudFormationの中間の特性を持った新たなサービスとなっています。
またローカル環境も同じChefクックブックによりVagrantを利用して構築出来ることも利点の一つです。
しかし・・!OpsWorksを長く利用している内に、「ここが辛いなあ・・」というストレスフルな点が少しずつ出てきたので、その辛みをこの記事にまとめることにしました。
どこがツラいか
デプロイがツラい
デプロイ時間は3〜4分で不満はあるものの工夫次第で改善出来る余地はありますが、一番嫌なのは本番環境と検証環境のデプロイで結果の差異が出ることです。
検証環境ではデプロイが普通に成功するけど、本番環境だと失敗した!なんてことがたまにありました。
理由はDBマイグレーションやフロントエンドビルド等様々です。
もちろん開発者により出来る限り差異を無くすことは出来ますが、検証環境と本番環境を完全に同じ状態することは保証されません。
更にアプリケーションを配置後に何らかの理由で失敗すると、そのリリースディレクトリは削除されず残ったままとなります。
すると何度もデプロイ失敗し続けた後に何が起こるか?
inodeが枯渇します(涙)
そうなってしまうとOpsWorksデプロイがいつまで経っても完了せず、1時間経ったくらいにようやく失敗というステータスになります(涙)
ちなみにデプロイも含めてOpsWorksのコマンド実行は強制終了させることは出来ません。
AWSサポートセンターに過去に質問をしたところ以下の回答から分かるように強制終了の機能は無いとのことです。
恐れ入りますが、現在のところ OpsWorks では setup/configure/deploy などレシピの適用中に、強制的に適用を終了させる機能は提供してございません。
また、AWS CLI におきましても、強制停止などのオプションはございません。
従ってこのエンドレスフォーエバーモードに入ると、あと1時間待たなきゃいけないのかという絶望を味わうことになります(_ _)
嗚呼、哀しきかな。
インスタンス立ち上げや構成変更がツラい
OpsWorks上でインスタンスを起動すると、必ずSetupというライフサイクルイベントに登録されたChefレシピが実行されます。
http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/workingcookbook-events.html
そしてこのSetupがとにかく時間がかかる。
完了まで約20分は待たなければなりません。
実行時間はレシピの内容とボリュームにもよりますが、僕が開発しているサービスでは主に以下を実行しています。
- ロードバランサーへのインスタンスの解除・紐付け
- ユーザー設定
- PHP・Nginxインストール
- その他諸々パッケージインストール
- logrotate設定
- アプリケーションデプロイ
インスタンス立ち上げならまだ良いのですが、セキュリティパッチを当てたい時などのちょっとしたサーバーの構成変更もこのSetupコマンドを実行しなければならず、立ち上げと同じ様に時間が掛かってしまいます。うーん、ストレスフル。
ローカル環境構築がツラい
OpsWorksを使用している以上必然的にローカル環境もChefを使って仮想マシンで環境を構築することになります。
これも数十分時間が掛かります。Chefを使っている以上実行時間の遅さは切り離せません。
更に辛いのがプロビジョニングの成功がホストOSやChef実行関連の各ライブラリ・ツールのバージョンにかなり依存します。
Macで成功してもWindowsだと失敗する。またVagrantのバージョンが~ならBerkshelfのバージョンは~でそしてさらにこのライブラリのバージョンは~でないと失敗するということがざらにあります。
本来はそんなことは気にせずPCでも同じ様に気軽に環境を構築したいんですよ。
でもそれは叶いません。
Chefがツラい
個人的にChefは既に廃れており、これから更に技術の市場価値は低くなっていくだろうと予測しています。
市場価値の低い技術を継続して利用してもエンジニアとしての成長は望めません。
どこかで転換を図らなければいけません。
まとめ
OpsWorksは単純で小規模なアプリケーションならまだ良いですが、複雑で大規模なアプリケーションを構築しようとするとChefクックブックのボリュームが必然的に大きくなり、実行時間も長くなる上に運用の手間が増えます。
少なくとも僕の現場のサービスはもうOpsWorksでは耐えきれなくなっているので、Dockerへの移行を検討しています。
もしOpsWorksを利用しようという方はこの辛みに注意して下さい。