TL;DR
- Terraform + GitHub + CircleCI + Atlas を用いてAWSの操作を自動化した
- 各ツールの役割は下記のような感じ
- Terraform => インフラへの変更ツール
- GitHub =>
.tfファイルのバージョン管理 - CircleCI => CI、Terraformをawsに対して実行
- Atlas => インフラの状態を記録する
terraform.tfstateの管理
- インフラの継続的デリバリー - naoyaのはてなダイアリーにて、言及されていた範囲(Route53の変更、Chefの適用)をAWSの操作全体に拡大した
背景
今までの問題点
- AWSの各種操作がブラウザからポチポチ業…
- 手作業なので誤操作に気づきにくい。事故りやすい
- インフラの実構成がバージョン管理出来ていない
- ちなみにRoute53に関してはroadworkerを用いてコードで管理済みなので、今回はRoute53以外の話です。
Terraform + GitHub + CircleCI + Atlas でインフラを管理するメリット
- ブラウザからのポチポチ業から解放される
- インフラ構成をコードで管理出来る。バージョン管理が出来る
- インスタンス追加、EIPの設定などAWSの操作、インフラ構成の変更をGitHubのPR、レビュー、Mergeのプロセスに載せることが出来る
- 自動化が可能になる
- CircleCI上にインフラ変更のログを保持することが出来る
- インフラの変更をGitHubのMergeボタンに集約出来る

実装概要
2015年2月18日現在最新のTerraform v0.3.6を用いて実現している

- EC2、EIPなどAWSの変更をコードに書いてGitHubにPush。(Atlasで
terraform.tfstateを管理している場合はterraform pullして最新のterraform.tfstateもPush) - Pushを契機にCircleCI上で
terraform plan --refresh=falseを実行してtest。testが通ればPull Requestを作成 - Pull RequestをmasterにMerge
- masterへのMergeを契機にCircleCI上からterraformを実行
terraform applyを実行して、awsに設定を反映- Atlasに
terraform pushして、terraform.tfstateファイルを管理 - 鮨を食べる
CircleCI上からterraformを実行しているキャプチャ

設定ミスやエラーが発生するとFailしてSlackに通知される

実際のtfファイルの感じ
クレデンシャル情報はCircleCI上で暗号化した環境変数を管理していて、Gitリポジトリ内では管理せず、 CI実行時に生成している。
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 | |
などTerraformは同じディレクトリ内にある.tfファイルを見てくれるので、
用途毎で.tfファイルを分けて運用してます。
その他
- 2014年8月にTerraformがリリース直後にチャレンジしたが、機能が足りずに実現出来なかったが、半年経過して必要機能が揃い実現出来た。
- 今日現在(2015年2月18日)TerraformにはAWS上の既存設定をファイルに落とし込む機能がないので、一から作る必要がある。
- 今回はインスタンスの一斉リプレイスがあったので、そのタイミングを利用して導入した。
- AtlasとGitHubの連携機能がリリース予定なので、それがリリースされるとさらに便利になるかもしれない(1月リリース予定だったけど)
- 今回はAtlasとTerraformだけを組み合わせたが、AtlasはVagrant、Packer、Consulとも連携が出来るので引き続き検証中
