CI/CD環境のTerraform versionを 最新に保つと幸せになれる Ops JAWS Meetup#19 勉強会 2021年7月26日(月)
View Slide
おしながき ● 自己紹介 ● Terraform概要 ● TerraformのCI/CDプロセス ● Terraformバージョンアップの必要性と辛み ● tfupdateの活用 ● まとめ
Terraform概要 ● HashiCorp社により開発/提供されているIaCサービス ○ HCLと呼ばれる独自の宣言型言語で記述する ○ 1000以上のプロバイダに対応している ○ Terraformのランタイムや各種プロバイダの利用は無料 ■ 実行環境は利用者側で用意する必要がある ○ Terraform Cloudと呼ばれる実行管理サービスも提供されている
2021/06/08
v1.0.0がリリースされ遂にGA🎉
Terraform実行環境 ● ローカルPC ○ ローカルPCからterraform CLIを実行 ○ 柔軟性は高い ○ 実環境とリポジトリの内容がズレる ● CI/CDサービス(CircleCI, Code Build...) ○ PRの作成/マージでterraform CLIを実行 ○ 実環境とリポジトリの内容が同一で安心 ○ 自動化によるコスト削減 ○ ヒューマンエラーの撲滅 ○ パイプラインの構築が必要
Terraform実行環境 ● ローカルPC ○ ローカルPCからterraform CLIを実行 ○ 柔軟性は高い ○ 実環境とリポジトリの内容がズレる ● CI/CDサービス(CircleCI, Code Build...) ○ PRの作成/マージでterraform CLIを実行 ○ 実環境とリポジトリの内容が同一で安心 ○ 自動化によるコスト削減 ○ ヒューマンエラーの撲滅 ○ パイプラインの構築が必要 本番環境に適用していく場合はこちらを選択していきたい
Terraformの一般的なCI/CDプロセス
Terraformの一般的なCI/CDプロセス tfファイルをgit push
Terraformの一般的なCI/CDプロセス PR作成をトリガーにLinterによる静的解析やplan実行を行う
Terraformの一般的なCI/CDプロセス PRマージをトリガーにapplytfstateを外部ストレージで管理
Terraformの一般的なCI/CDプロセス 本日のメインディッシュCI/CD環境でのTerraform version管理
Terraform version ● 結構な頻度でリリースがあるが、手動でのversion up対応は辛い ○ tfファイルで管理しているrequired_versionの書き換え ○ CI/CD環境で利用するTerraform本体のversion up対応 ○ 既存リソースに影響が無いことをplanで確認 ○ tfstateを複数管理している場合は各ディレクトリに対して対応する必要がある ● 一方、新機能/新サービスをterraform管理したい場合はversion upする必要がある version指定があるコンポーネント概要 例Terraform本体 Terraform自体のコアな処理を担当 -provider 各プロバイダに依存した処理を担当 hashicorp/terraform-provider-awshashicorp/terraform-provider-googlemodule resource定義のテンプレート terraform-aws-modules/terraform-aws-vpcterraform-aws-modules/terraform-aws-iam
自動化したい!!!
tfupdate ● 指定したディレクトリ配下もしくはファイルのversion記載部分を、取得したversionで再帰的に一括更新してくれる ○ tfupdate terraform -v 1.0.0 main.tf で実行すればmain.tf内のversion記載部分を1.0.0に更新してくれる ● CI/CD等のスケジュールジョブ内で利用することで、最新版のリリースがあればversion up用のPRを自動作成することが可能 ○ CircleCIであればexampleのconfig.ymlやOrbが公開されている ■ https://github.com/minamijoyo/tfupdate-circleci-example ■ https://circleci.com/developer/orbs/orb/masutaka/tfupdate ○ exampleはPR作成までだが、plan結果に差分が無ければ自動マージとかもできちゃう! ● 詳細はQiitaに公開されています https://github.com/minamijoyo/tfupdate
tfupdate
朝起きたら最新versionになってる幸せ😍
数ヶ月運用してみて ● 新機能/新サービスをリードタイム無しに積極的に活用できるようになった ● version upによるplan結果差分発生は1ヶ月に1回程度 ○ Terraform本体とproviderでの利用のみ ● plan結果差分無しの時の標準出力が変更になり、自動マージされないことがあった ○ planのoptionに-detailed-exitcodeを付与することでplan結果差分のありなしで終了コードが変わる
まとめ ● Terraform(IaC全般)を活用する場合は極力CI/CDプロセスを導入したい ● CI/CD環境のTerraform version管理から開放されて幸せになれた
Thank you.