Glide Note

glidenote's blog

Terraform + GitHub + CircleCI + Atlasを利用してAWSの操作を自動化した

TL;DR

  • Terraform + GitHub + CircleCI + Atlas を用いてAWSの操作を自動化した
  • 各ツールの役割は下記のような感じ
    • Terraform => インフラへの変更ツール
    • GitHub => .tfファイルのバージョン管理
    • CircleCI => CI、Terraformをawsに対して実行
    • Atlas => インフラの状態を記録するterraform.tfstateの管理
  • インフラの継続的デリバリー - naoyaのはてなダイアリーにて、言及されていた範囲(Route53の変更、Chefの適用)をAWSの操作全体に拡大した

背景

今までの問題点

Terraform + GitHub + CircleCI + Atlas でインフラを管理するメリット

  • ブラウザからのポチポチ業から解放される
  • インフラ構成をコードで管理出来る。バージョン管理が出来る
  • インスタンス追加、EIPの設定などAWSの操作、インフラ構成の変更をGitHubのPR、レビュー、Mergeのプロセスに載せることが出来る
  • 自動化が可能になる
  • CircleCI上にインフラ変更のログを保持することが出来る
  • インフラの変更をGitHubのMergeボタンに集約出来る

実装概要

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

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

CircleCI上からterraformを実行しているキャプチャ

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

実際のtfファイルの感じ

クレデンシャル情報はCircleCI上で暗号化した環境変数を管理していて、Gitリポジトリ内では管理せず、 CI実行時に生成している。

1
2
3
4
5
6
7
8
9
10
# credential
provider "aws" {
    access_key    = "XXXXXXXXXXXXXXXXXXXX"
    secret_key    = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    region        = "us-west-1"
}

provider "atlas" {
    token         = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# instance
resource "aws_instance" "dev001_foobar_net" {
    ami             = "ami-xxxxxxxx"
    instance_type   = "t2.micro"
    key_name        = "xxxxxxxxxxxxxxxx"
    security_groups = ["sg-xxxxxxxx"]
    subnet_id       = "subnet-xxxxxxxx"
    tags {
        Name    = "dev001.foobar.net"
        Role    = "common"
        Service = "operator"
        Env     = "dev"
    }
}
1
2
3
4
5
# eip
resource "aws_eip" "dev001_foobar_net_eip" {
    instance = "i-xxxxxxxx"
    vpc      = true
}

などTerraformは同じディレクトリ内にある.tfファイルを見てくれるので、 用途毎で.tfファイルを分けて運用してます。

その他

  • 2014年8月にTerraformがリリース直後にチャレンジしたが、機能が足りずに実現出来なかったが、半年経過して必要機能が揃い実現出来た。
  • 今日現在(2015年2月18日)TerraformにはAWS上の既存設定をファイルに落とし込む機能がないので、一から作る必要がある。
  • 今回はインスタンスの一斉リプレイスがあったので、そのタイミングを利用して導入した。
  • AtlasとGitHubの連携機能がリリース予定なので、それがリリースされるとさらに便利になるかもしれない(1月リリース予定だったけど)
  • 今回はAtlasとTerraformだけを組み合わせたが、AtlasはVagrant、Packer、Consulとも連携が出来るので引き続き検証中

参考

Comments