LINEで送る
Pocket

このブログサーバーはDigitalOceanで運用しております。(以下より)もちろんTerraformでインフラコード化をしているのですが、今まではローカル環境で terraform plan,apply をしていく中で、 terraform fmt,validate し忘れたり漏れが発生したことがあったので、今回CircleCIを使って、CI/CD環境を実装してみました。まずは構成と流れを説明していきましょう!


■構成

  • Repository

  • CI/CDフロー

  • 流れ
  1. プルリクを出す
  2. terraform init , terraform fmt , terraform validate, terraform plan
  3. master マージ
  4. terraform init , terraform fmt , terraform validate,terraform plan ,terraform apply

■.circleci/config.yml

  • Environment Variables

DigitalOceanのTerraformはAWSのクレデンシャルで制御するのではなくAPI経由でkeyを取得して環境変数に指定します。(下記より)  まずは簡単に設定ファイルの説明をしていきます。

3行目references は関数のようなもので、それを Jobs から呼び出しています。コマンドなどを重複することなくキレイに書けるのがメリットですね。
13行目restore_repo は異なるコンテナで発生するジョブを実行しているため、リポジトリをキャッシュからコンテナに復元するため指定しています。

34行目Terraform Cloudにtfstateファイルを管理しているためトークンを発行し、CircleCIの環境変数に指定して terraform initを実行しています。

あとは各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!!!!!!!!


■まとめ

実装してみましたが、手元でテストする必要がなくなりCircleCIによるCI/CDで、よりTerraformを安全にリリースすることができました。今後はスケジュール機能を使って1週間に1回は実行するようにすればTerraformのバージョンアップによる動かない問題もすぐに検知できそうなのでやってみようと思います。

AWSも構成は基本同じだと思うので、試したらブログします!

参考:https://learn.hashicorp.com/terraform/development/circle

LINEで送る
Pocket


adachin

1989年生まれのLancers SRE。 ホスティングから大規模なアドテクなどのインフラエンジニアとして携わり、AnsibleやTerraformでのインフラコード化を推進。副業では数社サーバー保守、未経験によるエンジニアのメンターなども実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。現在はサービスの信頼性向上、可用性、レイテンシ、パフォーマンス、モニタリング、緊急対応、インフラコード化、リファクタリング、セキュリティ強化、新技術の検証、Docker開発環境の提供、AWSでのインフラ構築、グループ会社のインフラをECS/Fargateへ移行、CakePHP4での管理画面作成、メンター、分析基盤の運用を担当している。

0件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください