ホストのプロビジョニングを Chef から mitamae へ移行した

SRE チームの藤原です。Tech KAYAC Advent Calendar 2019 Upgrade/Migration track 6日目の記事です。

今日は長らく EC2 などのホストのプロビジョニングに利用していた Chef を、mitamae に移行したお話です。

Chef とその管理

Chef といえば、Infrastructure as a Code という概念を広めた先駆者ともいえるソフトウェアです。Ruby DSL でホスト上のファイルやパッケージなどの様々なリソースを宣言的にプロビジョニングできる、界隈では大変おなじみの奴ですね。

カヤックでも自分が入社した2011年から Chef によるプロビジョニングを行ってきて、もう8年になります。

多くのプロジェクトではアプリケーションとは切り離した、その名も "chef" という名前の GitHub リポジトリにコードや設定が置かれていて、プロジェクトごとにブランチを切る形で運用していました。(この運用は一旦プロジェクトごとに master から切り出されたが最後、各プロジェクト固有の修正が入るために容易に merge などできなくなる難点がありましたが、主題から逸れるので置いておきます)

そして時は流れて2019年。オンプレミスの時代にはコードで管理するものは Chef でほぼ完結していたのですが、現代においては他にもコードで管理するものがいろいろあります。Terraform や、アプリケーションとは別に利用する AWS Lambada のソースコードや設定などですね。これらについても、扱う人間が Chef とほぼ等しかったため、おなじリポジトリにディレクトリを切って同居するようになりました。

ということで、ある時点でのリポジトリのルートはこんな状態になっていたわけです。

Capfile     Rakefile  cookbooks/  lambda/   nodes/         spec/
Gemfile     bin/      examples/   lib/      roles/         terraform/
README.txt  config/   knife.rb    mitamae/  setup-chef.sh  tools/

もともとChef用だったところに lambda, terraform が増えてよく分からない感じになっていました。

Chef の cookbook は基本的に全部自作していたのですが、だいたい80個ぐらいありました。もう使っていない、今後も使わないであろうものも含めて、歴史が堆積しています。

$ ls cookbooks
alp/                      golang/          mongodb/                 redis-sentinel/
aws-cli/                  gunfish/         mysql/                   ruby-build/
certbot/                  haproxy/         nginx/                   s3cmd/
chef_git_check/           horenso/         nodejs/                  serverspec/
common-packages/          hosts/           nopaste-cli/             snmp/
consul/                   httpd/           nscd/                    sshd/
daemontools/              iptables/        nssh/                    stns/
dnsmasq/                  java/            ntp/                     stretcher/
ec2/                      jenkins/         os-defaults/             sudo/
ecs/                      jq/              packer/                  sysdig/
elasticsearch/            katsubushi/      perl-build/              td-agent/
etckeeper/                kaztools/        php/                     test/
fluent-agent-lite/        keepalived/      pip/                     tinyproxy/
gate/                     kibana/          postfix/                 unbound/
gaurun/                   kyotocabinet/    proteus-monitor-agent/   varnish/
gearmand/                 kyototycoon/     proteus-monitor-server/  xbuild/
ghch/                     local-accounts/  python-build/            yum/
go-nginx-oauth2-adapter/  mackerel-agent/  rbenv/                   zabbix-agent/
go-server-starter/        memcached/       redash/                  zabbix-config/
gocal/                    mirage/          redis/                   zabbix-proxy/

Chef から mitamae へ

最近 SRE チームが扱うサービスは Amazon ECS で運用することがほとんどになり、EC2 をプロビジョニングする必要性がだいぶ薄れてきました。EC2 を立てるにしても VPC 内のリソースにアクセスするためのサーバ1台と、ECS 用のコンテナインスタンスぐらいなわけです。

こうなると、大量の cookbook もほぼ必要なくなります。8年もののリポジトリなので歴史が堆積しているのは当たり前とはいえ、そろそろ整理したい。ということで、必要なものだけを mitamae に移植して作り直すことにしました。

mitamae は、Itamae の mruby 版で、シングルバイナリで軽量に動作するなど、コンテナ環境でも使いやすいものです。Chef と類似した DSL であることから、学習コストも低いことが期待できたため採用しました。

移行はたいして難しくはなく、必要な cookbook を mitamae 用にコピペし、記法を多少調整したぐらいです。すべて自作の cookbook だったため、社内で実際に必要な最低限の記述しかなかったから、というのもありますね。もう(EC2では)使わないであろうミドルウェアの cookbook はバッサリ断捨離です。

ということで、あるプロジェクト向けのブランチに +498 −16,390 の PR が完成しました。

f:id:sfujiwara:20191205171322p:plain

リポジトリ(ブランチ)のルートもすっきり!

README.txt  lambda/  mitamae/  terraform/

cookbook も13個だけになりました。

common-packages/  ctop/     ec2/    ecs/   ecspresso/  local-accounts/  mysql/
os-defaults/      postfix/  redis/  sops/  ssmwrap/    sudo/

Chef、いままでありがとう!