LoginSignup
5
0

More than 3 years have passed since last update.

Codenize警察のいる生活

Posted at

この記事はくふうカンパニー Advent Calendar 2019の13日目の記事となります。

DaVinciStudioでSREをやっている横山です。
DaVinciStudioのSREは、くふうカンパニー各社のインフラ基盤の管理を行なっております。
そして、インフラ基盤の管理にはTerraformCodenize.toolsCloudFormationを使っています。
今回はこの管理ツールの運用について一筆書きたいと思います。

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_TOKENSLACK_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に以下のように通知され、コードに反映されていない変更が長期間放置されることがなくなりました。
※事情によりアイコン画像はお見せできません。
スクリーンショット_2019-12-13_20_21_16.png

まとめ

こういったちょっとしたくふうの積み重ねで暮らしを便利にしていきたいものですね。
くふうカンパニー Advent Calendar 2019、明日の14日目はmatsuhisa_h さんの「地味な話」です。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0