この記事はくふうカンパニー Advent Calendar 2019の13日目の記事となります。
DaVinciStudioでSREをやっている横山です。
DaVinciStudioのSREは、くふうカンパニー各社のインフラ基盤の管理を行なっております。
そして、インフラ基盤の管理にはTerraformやCodenize.tools、CloudFormationを使っています。
今回はこの管理ツールの運用について一筆書きたいと思います。
TerraformとCodenize.toolsとCloudFormationについて
インフラのコード管理というと、概ねこれらの3ツールを利用されている方が多いのではないでしょうか?
雑に比較すると以下のような感じになります。
名称 | いいところ |
---|---|
Terraform | 対応するリソースが豊富(AWS,GCP,datadog,Azure,GitHub、ドミノピザ(嘘)などなど) |
Codenize.tools | Ruby DSL, Rubyでプログラマブルにリソース定義できる |
CloudFormation | 公式ツールという安心感。 |
弊社では基本的にterraformを使い、新規で構築するものにはCloudFormationが使われることが多いです。
これはCloudFormataionでは既存のリソースのインポートができないという問題があったためです。
しかし、この問題は以下の通り、最近のアップデートで解消されました。今後は積極的に使っていこうと思っています。
https://aws.amazon.com/jp/blogs/news/new-import-existing-resources-into-a-cloudformation-stack/
コード管理の辛さ
さて本題です。コード管理はこれらのツールを導入して終わりではありません。日々、運用していかなければなりません。
こんなこと、心当たりがありませんか??
うーん、、この検証のためのIAMロール、いちいちプルリク作ってコード変更するのめんどいな、とりあえず手動で作るか。うまく行ったら明日ちゃんとコード化しよ。
明日なんて永遠にこないのです。そのまま忘れ去られ時が過ぎ、、
次にIAMロールに変更を加えようとした人がdry-run
した時に意図しない差分に気づくのです。。
これはとても悲しい。
手動作成を禁止して、厳格に運用すべきというツッコミはおっしゃる通りだと思います。
しかし、手動で作成できるゆるい運用もこれはこれでメリットがあると思っています。
ということで、このようなゆるさを保ちつつ、悲しい思いをする人が減るようにCodenize警察を作りました。
Codenize警察
Codenize警察の中身はShellスクリプトです。
たとえばhogehoge/hogehoge
レポジトリにコードがある場合、以下のようになります。
GITHUB_TOKEN
、SLACK_WEBHOOK_URL
は環境変数として渡します。
#!/bin/bash
set -x
function slack_notify_change_of () {
payload="payload={'attachments':[{'color': '#e73613', 'text': '${1}の差分を検知しました。'}]}"
curl -X POST --data-urlencode "$payload" $SLACK_WEBHOOK_URL
}
export AWS_REGION=ap-northeast-1
git clone --depth 1 https://$GITHUB_TOKEN@github.com/hogehoge/hogehoge.git
cd /opt/hogehoge
bundle install
cd /opt/hogehoge/codenize-tools
services=(roadwork)
for service in ${services[@]}; do
bundle exec ${service} -a --dry-run | grep -e Create -e Delete -e Update
if [ ${?} = 0 ]; then
slack_notify_change_of ${service}
fi
done
cd /opt/hogehoge/terraform
services=(cloudfront codebuild codecommit codepipeline datadog eip github iam kms lb s3 security_group vpc)
for service in ${services[@]}; do
cd /opt/hogehoge/terraform/${service}
terraform init
terraform plan -detailed-exitcode -parallelism 50
if [ ${?} = 2 ]; then
slack_notify_change_of ${service}
fi
done
あとはこのShellスクリプトを任意の環境で動かすだけです。
弊社ではECSやEKSを導入しているため、このスクリプトを配置したDockerコンテナをECS上で1日に1回実行(巡回)させています。
こうすることで差分がある時にSlackに以下のように通知され、コードに反映されていない変更が長期間放置されることがなくなりました。
※事情によりアイコン画像はお見せできません。
まとめ
こういったちょっとしたくふうの積み重ねで暮らしを便利にしていきたいものですね。
くふうカンパニー Advent Calendar 2019、明日の14日目はmatsuhisa_h さんの「地味な話」です。