Terraform x CircleCI
ほぼ実装できた— adachin👾SRE (@adachin0817) May 28, 2020
このブログサーバーはDigitalOceanで運用しております。(以下より)もちろんTerraformでインフラコード化をしているのですが、今まではローカル環境で terraform plan,apply
をしていく中で、 terraform fmt,validate
し忘れたり漏れが発生したことがあったので、今回CircleCIを使って、CI/CD環境を実装してみました。まずは構成と流れを説明していきましょう!
■構成
- Repository
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ tree terraform .circleci └── config.yml terraform ├── README.md └── env └── prd ├── do_backend.tf ├── do_db.tf ├── do_dns.tf ├── do_droplets.tf ├── do_firewall.tf ├── do_kubernetes.tf └── variables.tf |
- CI/CDフロー
- 流れ
- プルリクを出す
terraform init
,terraform fmt
,terraform validate
,terraform plan
- master マージ
terraform init
,terraform fmt
,terraform validate
,terraform plan
,terraform apply
■.circleci/config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
version: 2.1 references: default_config: &default_config docker: - image: hashicorp/terraform:light working_directory: ~/project environment: TERRAFORM_ENV: ~/project/ terraform_init: &terraform_init run: name: terraform init command: | cd ~/project/terraform/env/prd terraform init -backend-config="token=${TF_API_TOKEN}" jobs: terraform_fmt_validate: <<: *default_config steps: - checkout - *set_terraform_environment - *terraform_init - run: name: terraform fmt validate command: | cd ~/project/terraform/env/prd terraform fmt -diff=true -check=true terraform validate - *save_repo terraform_plan: <<: *default_config steps: - checkout - *set_terraform_environment - *terraform_init - run: name: terraform plan command: | cd ~/project/terraform/env/prd terraform plan terraform_apply: <<: *default_config steps: - checkout - *set_terraform_environment - *terraform_init - run: name: terraform apply command: | cd ~/project/terraform/env/prd terraform apply -auto-approve workflows: version: 2 deploy: jobs: - terraform_fmt_validate - terraform_plan: requires: - terraform_fmt_validate - terraform_apply: filters: branches: only: master requires: - terraform_plan |
- Environment Variables
TFC_API_TOKEN
DigitalOceanのTerraformはAWSのクレデンシャルで制御するのではなくTerraform Cloudを利用しているため、API経由でkeyを取得して環境変数に指定します。(下記より) まずは簡単に設定ファイルの説明をしていきます。
3行目の references
は関数のようなもので、それを Jobs
から呼び出しています。コマンドなどを重複することなくキレイに書けるのがメリットですね。
あとは各Jobsに対して terraform_fmt_validate
, terraform_plan
, terraform_apply
の3つを制御しています。最後にworkflowsでmasterマージのみ terraform apply
するように指定します。次はテストをしてみましょう。
[DigitalOcean][Terraform]Droplet,Floating IP,Firewall,DNSを設定してみた
■Test
- Pull Request
テストは適当にインバウンドルール(ポート)指定してリリースできるかやってみました。
- terraform_fmt_validate
- terraform validate error
validateに失敗すると次のjobである terraform plan
ができないようになっています。
- terraform_plan
- master merge
- terraform_apply
Good!!!!!!!!
■まとめ
Terraform x CircleCI めちゃくちゃいい!
最高か!!— adachin👾SRE (@adachin0817) May 28, 2020
実装してみましたが、手元でテストする必要がなくなりCircleCIによるCI/CDで、よりTerraformを安全にリリースすることができました。今後はスケジュール機能を使って1週間に1回は実行するようにすればTerraformのバージョンアップによる動かない問題もすぐに検知できそうなのでやってみようと思います。
AWSも構成は基本同じだと思うので、試したらブログします!(以下より)
参考:https://learn.hashicorp.com/terraform/development/circle
0件のコメント