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とも連携が出来るので引き続き検証中