hakoに機能追加
ECSを本格利用し始め、デプロイの管理にhakoを使うことにしました。最近ECSに機能追加があり、hako未対応のものを使いたくなったこともあり、hakoに追加してみることにしました。
作った機能
いくつか機能を追加して、プルリク投げてマージされたもの、プルリク中のもの、まだ確認中のものと4つ作っています。必要に応じて順次追加していて、投げれそうなものはPRにしています。主に、internalなmicro serviceを動かすユースケースでECSを使っているので、それに応じたものがあります。
health check grace periodサポート
ECS導入する時に使いたかったので、追加してプルリクしました。さすがにこれは単純な設定値の追加なのですぐマージされました。
この変更で初めてhakoいじったんですが、Rubocopのエラーに悩まされて、自分で変更した部分がルールに合っていなかったものと、Rubocop自体のアップデートのせいなのかエラーになっていたものとありました。
NLBサポート
gRPCをコンテナにして、ECSで動かす予定で、NLB(Network Load Balancer)をサポートしました。PR反応がないので、とりあえず置いたままです。
一つのALBに複数のECSサービスを紐付ける
hakoはデフォルトで、設定を書いたymlファイル名のALBを作ります。ただ、開発環境などで、hakoファイルごと(サービスごとに)ALBできるとお金かかるので、ポートを変えて、ALBを指定して同一のALBを使うようにしたものです。ポートが変わるので、internal ALB前提です。
GitHub - reiki4040/hako at feature/add-service-to-exists-elbv2
NLBサポートを先にPR出してるのは、これをNLBにも適用したいためですが、これは方針が本家の人が考えるのと合うのかという点があります。一応自分の環境でもしばらく使ってみてからにしようかなという状態です。
ECSのcontainer health checkのサポート
2018/03にECSに追加されたばかりの機能で、とりあえず使ってみようとのことで実装しました。設定値は反映されることを確認しました。AWS SDKのバージョン上がってます。
GitHub - reiki4040/hako at feature/container_healthcheck
機能追加したhakoを使うためのブランチ
上記をまとめて動作確認する用に、featuresと言うブランチを作って、そこに上記未マージ分をまとめて、バージョン番号変えてgemを作って試しています。自分の変更を入れたgemを作る方法は後述しています。
hakoをいじるにあたってのメモ
Rubyは普段使っていない言語なので、とりあえず自分でhakoのコードいじったときのメモです。
まず、変更したコードの実行について。exe/hakoがあったので、lib/hako/version.rbを変えてとりあえずexe/hako --version
してみましたが、変更したバージョンは出てきませんでした。
調べてみるとbundlerを使って関連ライブラリを入れて、bundle exec hako
といった形でやる必要があったようで、それをやったらローカルの変更が反映されて実行することができました。
- bundlerのインストール
gem install bundler
- 関連ライブラリをローカルの環境(プロジェクト?以下に)インストール
bundle install --path=vendor/bundle --binstubs=bundle_bin
—binstubs=bundle_bin
はrbenv用っぽいので使わなければ不要かも。
- bundle execで実行するとローカルの変更分が実行されます。
bundle exec hako —version
これでとりあえず自分でhakoのコードを変更したものをhakoコマンドとして実行できます。 また、hakoはrspecでのテストとrubocopでのコードスタイルチェックが実行できます。
bundle exec rake
最初これやってなくて、テスト未実行状態でした。
自分でgemを作って使う
hakoは、bundle exec rake install
でpkg/以下にgemファイルが作られます。
それを対象サーバでgem install --local <gem>
とすれば、インストールでき、使用することができます。
これで、自分の環境で変更を入れたhakoを使うことができます。
RubyのAWS SDKのリファレンス
Ruby SDKのdocumentがよくわからなくても、aws cliで同様の機能(API)の調べて動かすと、項目とか、実際の値も見れてわかりやすかったです。Rubyに限らず、分からなかったらwas cliで動かしてみるのわかりやすいです。
所感など
普段はGoを書くことが多く、Rubyはツール使ってるぐらいで、作法がよくわからない感じでコード書きましたが、とりあえず欲しい機能は実現はできています。rakeで足回りのことができるようになっていたので、実現したいことのコードを書くぐらいで済んだのかなと思います。
一応本家に取り込んでもらいたいなーとは考えつつ*1自分の環境で使って、使い勝手を確認中です。個人的には、Goでワンバイナリで配布できるようなものを作りたくはありますが、まずhakoを使って運用してみて、どうあるのが自分としては好みなのか(使いやすいのか)考えていこうかなと思ってます。
参考など
- GitHub - eagletmt/hako: Deploy Docker container
- Amazon ECS に ELB ヘルスチェックの猶予期間を追加
- Amazon ECS Supports Container Health Checks and Task Health Management
- Ruby の gem をプロジェクト毎に Bundler で管理する - fugafuga.write
- AWS SDK for Ruby のドキュメント | AWS
*1:あまり環境固有の機能実装はしない