AWSのインフラ環境を構築するためにTerraformを勉強しようと思いました。
プロジェクトで使うことも想定し、折角なのでCI/CDも整えたメモです。
今回は、Github上でPull- Requestを出した際にバリデーションチェックをして、masterブランチにマージした時に
AWSへデプロイするようにしてみます。
環境構築に使ったもの
Github
ブランチ戦略は Github Flowを用いることにしてmasterブランチを保護しておきます。
(Settings -> Branches)
S3
Terraformの状態を管理するterraform.tfstate
を永続化する必要がある。
デプロイにはCircleCIを使うのでS3に保存しておくといいです。
幸いにもTerraformにはterraform.tfstate
をS3で管理する設定があるのでそれを使います。
terraform {
backend "s3" {
bucket = "studyed-terraform-state1" # 作ったバケット名
region = "ap-northeast-1"
key = "terraform.tfstate"
encrypt = true
}
}
tflint
tflintは構文チェックするためのツールです。
0.12にも対応しています。
基本的に、ローカルの環境でつかうと思いますが、CIでもチェックするようにします。
今回は tflint の Docker イメージを使いました。
Circle CI
環境変数
AWSに接続するため、以下の環境変数にを設定します。
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
config.yml
tflintでバリデーションをして、masterブランチにマージしたときに
terraform apply
コマンドでデプロイするようにします。
version: 2.1
executors:
validater:
docker:
- image: wata727/tflint
deployer:
docker:
- image: hashicorp/terraform:light
jobs:
validate:
executor:
name: validater
steps:
- checkout
- run:
name: Validation check by tflint
command : tflint
deploy:
executor:
name: deployer
steps:
- checkout
- run:
name: Inittialize
command: terraform init
- run:
name: Deploy
command: terraform apply -auto-approve # デプロイ確認不要になる
workflows:
test:
jobs:
- validate
- deploy:
requires:
- validate
filters:
branches:
only: master
どうなったか
バリデーションチェック
たとえば、modlue
をmodue
と間違えて書いて、リポジトリにPush
Pull Request作ると、Circle CIに怒られていました
デプロイ
終わりに
今回は、TerraformのCI/CD環境を整えてみました。
もう少し詰めるところもありそうですが(デプロイ前に人がApploveするとか)
最低限、勉強用としてはいいのかなと。