Terraformのデプロイパイプラインに使用できるツールをまとめてみた
「Terraformデプロイパイプラインを作るなら、どのツールが自分の組織にあっているのだろう?」
Terraformのデプロイパイプラインの実装方法は、選択肢が多くて迷ってしまいます。
この記事では、デプロイに使用できるツールをまとめてみました。
デプロイパイプラインのツール選定の参考になれば幸いです。
前提
Terraformは様々なリソースを管理することができますが、今回はAWSリソースをTerraformで管理する想定としています。
所々AWS固有の単語がでてきますが、ご了承ください。
なぜTerraformのデプロイパイプラインは必要なのか?
デプロイフローをおさらいして、デプロイパイプラインなしの運用の課題を考えてみます。
Terraformのデプロイフロー
Terraformで構成管理している場合、リソースの設定変更時は以下のようなフローで行うことが多いです。
- コードの編集
- Pull Requestの作成
- Pull Requestのレビュー・マージ
- 変更差分の確認(
terraform plan
) - 変更の適用(
terraform apply
)
ローカルで手動で行う場合を図にしてみると、こんな感じです。
手動デプロイの課題とデプロイパイプラインの必要性
デプロイパイプラインが無く、ローカルで手動デプロイする運用は何が困るのでしょうか?
手動デプロイも選択肢の一つではあります。検証時や小規模な環境では、特に困ることも無いかもしれません。
しかし、Terraformの利用規模が大きくなると、手動デプロイは以下の課題があります。
- 手作業による作業ミス(デプロイ忘れ/デプロイ先の環境間違い)
- シークレットの管理(AWS IAMアクセスキー等)
手作業による作業ミス
手動作業である限り、作業ミスは発生します。
コードを修正したが環境に適用するのを忘れたり、デプロイ時の引数や認証情報を間違い環境に意図しない変更を行ってしまうこともあります。
適用漏れが発生しても、すぐに問題は起きないこともあるかもしれません。しかし、次の変更時に編集範囲外の差分が発生します。
こういった差分は実行するユーザーに「何かが壊れるのでは?」という不安を与えます。
結果、「1.例外的に手作業を行う」->「2. インフラの状態がカオスになる」->「3.何かが壊れそうで心配」->「1.」に戻るという負のサイクルが発生します。(オートメーション恐怖症)
この状態は、IaC管理自体が破綻する要因にもなるため避けたいところです。
シークレットの管理
シークレット管理も悩ましいです。Terraformを実行するユーザーには、対象リソースに対する強い権限が必要です。
ローカルで手動実行する場合は、認証情報をローカルに保存する必要があります。
強い権限を持った永続的なシークレットをローカルに保存しているのは、セキュリティリスクが高いです。
また共有ユーザーは好ましくないため、認証情報はTerraformを実行するユーザー分用意すると思います。
認証情報の数が多いと管理の手間もかかります。(IAMアクセスキーのローテーション、ユーザー増減によるIAMユーザーの棚卸し)
デプロイパイプラインを導入したTerraformデプロイフロー
デプロイパイプラインを導入することで課題を解決できます。
- 手作業による作業ミス->Gitの変更をトリガーに自動で、Terraformを適用。手作業でTerraformを実行する必要がなくなる。
- シークレットの管理-> デプロイパイプライン上で管理、ローカルにSecretsを渡す必要がなくなる
Terraformのデプロイパイプラインに使えるツールは色々あります。各ツールを確認してみましょう。
Terraformのデプロイパイプラインに使用できるツール
よく使われるツールとしては、以下があると思います。
- Terraform Cloud
- Atlantis
- Codeシリーズ
- CIツール(Github Actions,GitLab CI/CD,Circle CI等)
- GitOpsツール(Flux、PipeCD)
それぞれ説明していきます。
ざっくりした比較は以下になります。
項目 | Terraform Cloud | Atlantis | CIツール(Github Actions等) | CIツール(Codeシリーズ) | GitOpsツール(Flux、PipeCD) |
---|---|---|---|---|---|
インフラ管理 | 不要 | 必要 | 不要 | 不要 | 必要 |
料金 | Resource数 Plusプランは要問い合わせ |
ホスティングするインフラ料金 | 実行時間 | 実行時間 | ホスティングするインフラ料金 |
AWS認証情報の取得方法 | IAMロール(OIDC) | IAMロール(ホストするインフラ) | IAMロール(OIDC) | IAMロール | IAMロール(ホストするインフラ) |
デプロイ設定の管理方法 | GUI or Terraform(tfe provider) | yaml | yaml | yaml | GUI or yaml(k8s マニフェストファイル) |
対応しているVCS | GitHub GitLab Bitbucket Azure DevOps (※1) |
GitHub GitLab Bitbucket Azure DevOps |
製品による | GitHub CodeCommit Bitbucket |
GitHub GitLab Bitbucket (ここから下はPipeCDはサポートしていない) CodeCommit Azure DevOps Google Cloud Source Repositories |
ドリフト検出 ※1 | ◯ | △ | △ | △ | ◯ |
Stateロック | ◯ | ◯ | - | - | - |
Stateファイル管理 | ◯ | - | - | - | - |
※1 機能としてサポートしているものは◯
にしています。以下の記事のように作り込めば、どのツールでもドリフト検出が可能です。
AtlantisでTerraformのドリフト検出 - クラウドワークス エンジニアブログ
Terraform Cloud
HashiCorpが提供しているTerraformの運用管理プラットフォームサービスです。
今回紹介するデプロイパイプライン以外にも、Private Registoryやガバナンス系の機能を提供しており多機能です。
Saas型で提供しているTerraform Cloudの他にも、ユーザー管理のサーバ上にインストールできるTerraform Enterpriseがあります。
機能的にはほぼ同一ですが、新しい機能はTerraform Cloudの方が先にサポートされることが多いです。
HashiCorp Terraform - Provision & Manage any Infrastructure
Pros
- Terraformのデプロイに最適化されたツールのため、少ない工数でTerraform用のデプロイパイプラインを作成できる
- Saasのため、パイプライン用のリソースを自前で管理する必要がない
- Stateファイルの管理やPolicy機能、Drift検出等、その他機能も充実している
Cons
- デフォルト設定では、VCS(GitHub、GitLab)上ではPlanの結果が見れない
- その他の方法より料金が高い(※)
※ 見積もりをすると割高に見えるかもしれませんが、作り込みをする工数やホスティングするインフラの管理が不要であることを考えると妥当な金額と個人的には思います。
HashiCorp Terraform: Enterprise Pricing, Packages & Features
参考
- Terraform Cloudを使って複数環境(本番/STG)にAWSリソースをデプロイしてみる | DevelopersIO
- Terraform Cloud の記事一覧 | DevelopersIO
Atlantis
OSSのツールで、VCS(GitHub/GitLab等)のPull Request上のコマンドでTerraformのワークフロー(terraform plan
やterraform apply
)を実行するツールです。
独自のStateロック機能があり、Pull Requestがマージされるまで他の変更が加えられないようにすることができます。
Atlantisは自前でサーバーの用意して運用する必要があります。AWS上であれば、EKSやECSにホスティングすることが可能です。
ECS Fargateでデプロイする場合は、AtlantisのTerraformモジュールを使用することができます。
Terraform Pull Request Automation | Atlantis
Pros
- VCS(GitHubやGitLab)と同じUIを使用して、Terraformの操作(
plan
やapply
)が可能- Pull Requestのコメントベース
- Terraformのデプロイに最適化されたツールのため、少ない工数でTerraform用のデプロイパイプラインを作成できる
- OSS製品のため、Atlantisの利用自体には料金がかからない
Cons
- 動作させるためにインフラ(EKS、ECS等)を自前で用意する必要がある
- ホスティングするインフラの費用がかかる
- 可用性やセキュリティは自分たちで担保する必要がある
参考
- TerraformをPull Request上のコマンドで実行!Atlantisを試してみた | DevelopersIO
- atlantisでterraformを実行する際のセキュリティ - decadence
- Atlantis の記事一覧 | DevelopersIO
CIツール(Github Actions、GitLab CI/CD、Circle CI等)
Github ActionsやCircle CIなど、CIツール上でTerraformのデプロイを行う方法です。
アプリケーションのCI/CDに使用できるツールのため、すでに使用しているパターンも多く導入ハードルが低いと思います。
先にあげた「Terraform Cloud」や「Atlantis」と違って、Terraformデプロイに最適化されたツールではないためユーザー側でデプロイ設定の作り込みは必要です。
Pros
- アプリケーションのデプロイとツールを統一できる
- Saas製品の場合、自前でインフラを用意する必要がない
Cons
- Terraformのデプロイに最適化されたツールではないため、パイプラインの処理の作り込みが必要
- 環境の数が増えるとデプロイ設定用のyamlファイルが増えて管理が大変
CIツール(Codeシリーズ)
AWSが提供しているCI/CDツールであるCodeシリーズを使用して、Terraformのデプロイを行うパターンです。
長所や短所は基本的にはCIツール(Github Actions、GitLab CI/CD、Circle CI)とほとんど同様です。
優れている点としてはAWS上で完結するため、サードパーティのツールを導入が難しい環境でも導入することができます。
逆に特定ディレクトリへの変更をトリガーにすることはできないなど、トリガーの柔軟性が低い等短所もあります。
CodePipelineはGitLabには対応していないため、GitLab環境で使う場合はGitLabとCodeCommitをミラーリングさせて、CodePipelineのソースにCodeCommitを使用するといった工夫が必要です。
Pros
- アプリケーションのデプロイとツールを統一できる
- AWS認証情報を外部に保存する必要がない
- 自前でインフラを用意する必要がない
- AWSの製品であるため、導入ハードルが低い
Cons
- Terraformのデプロイに最適化されたツールではないため、パイプラインの処理の作り込みが必要
- デプロイトリガーの柔軟性が低い
- 特定ディレクトリの変更をトリガーにすることはできない
- 環境の数が増えるとデプロイ設定用のyamlファイルが増えて管理が大変
- GitLabには対応していない
参考
GitOpsツール(Flux、PipeCD)
GitOpsツールである、FluxやPipeCDを使用するパターンです。
どちらもKubernetes上にインストールして使用します。
FluxはKubernetesのCDツールという印象が強いかもしれませんが、Terraform Controllerを使用することでTerraformのCDにも使用できます。
PipeCDに関しては、KubernetesとTerraformの他にも、CloudRunやLambdaもサポート対象になっています。
今回紹介した他の方法はリポジトリの変更をトリガーに処理を実行するPush型(CIOps)のツールです。
それに対して、FluxやPipeCDはGitリポジトリの変更をポーリングして、変更を検知して処理を実行します。そのため、Pull型(GitOps)のツールと言われています。
Drift検出機能があり、Drift時に自動でGitリポジトリの状態に戻すといった設定も可能です。
Drift Detection | Weave GitOps
すでにKubernetesクラスターを運用している環境であれば、導入し易いかと思います。
Pros
- Pull型のGitOpsを実現できる
- Kubernetesのデプロイとツールを統一できる
- AWS認証情報を外部に保存する必要がない
Cons
- 動作させるためにインフラ(EKS等)を自前で用意する必要がある
- ホスティングするインフラの費用がかかる
- 可用性やセキュリティは自分たちで担保する必要がある
- Kubernetes環境が必要なため、Kubernetesの知識も必要
個人的おすすめなツール
個人的には、まずはTerraform Cloudを検討するのが良いと思います。
SaaS製品でありTerraformのデプロイパイプラインの機能があるため、簡単にパイプラインを作成することができます。
その他、組織でTerraformを利用するための機能も充実しています。
予算的に合わない場合は、既存で使用している技術スタックやツールを考慮して決めるのが良いかと思います。(FluxでKubernetesデプロイやっているから、TerraformもFluxでやってみる等)
小さく始めるなら、CIツール(Github Actions、GitLab CI/CD、Circle CI等)を使用するのがおすすめです。
インフラの用意不要で、すでに利用中であれば学習コストもほぼ掛かりません。
GitHub Actionsであれば、Hashicorpやユーザーが提供している便利なActionも多いです。