🦔

Terraformのキャッチアップ(2022年以降)

に公開

Terraform にしばらく触れられていなかったが、新しい案件では必要そうな見込み。よって 2022 年以降の重要なアップデートなどをキャッチアップする。AI 君にリサーチさせた文章をベースに検討メモなどを追記。

企業戦略の大きな変化

ライセンス変更と IBM 買収

2023 年 8 月、HashiCorp は全製品のライセンスを Mozilla Public License 2.0 から Business Source License v1.1 に変更しました。この変更により、HashiCorp と競合するサービスでの商用利用が制限されています。

2024 年 4 月には IBM による 64 億ドルでの買収が発表され、2025 年 2 月に完了しました。これにより、Terraform は IBM のハイブリッドクラウド戦略の中核要素として位置づけられています。

OpenTofu プロジェクトの登場

ライセンス変更を受けて、Linux Foundation 配下で OpenTofu プロジェクトが開始されました。このプロジェクトは Terraform 1.5.x をベースとし、Mozilla Public License 2.0 で開発が継続されています。

主要バージョンの新機能

Terraform 1.3(2022 年 9 月)

Optional Object Type Attributes

オブジェクト型変数内の属性を任意項目として定義し、デフォルト値を設定できる機能が追加されました。

variable "server_config" {
  type = object({
    name     = string
    port     = optional(number, 80)
    ssl      = optional(bool, false)
    protocol = optional(string, "tcp")
  })
}

この機能により、モジュールの利用者は必要な設定のみを指定すればよくなり、モジュールの使いやすさが向上しています。

Terraform 1.5(2023 年 6 月)

Configuration-driven Import

既存のインフラストラクチャを Terraform 管理下に移行する際の宣言的なインポート機能が導入されました。

import {
  id = "i-abcd1234"
  to = aws_instance.web
}

従来のterraform importコマンドと異なり、設定ファイル内で宣言的にインポート対象を定義できるため、CI/CD パイプラインでの自動化が容易になりました。

Terraform 1.6(2023 年 10 月)

Testing Framework

Terraform の設定をテストするための統合フレームワークが正式にリリースされました。

# tests/example.tftest.hcl
run "validate_bucket_creation" {
  command = apply

  assert {
    condition     = aws_s3_bucket.example.bucket != ""
    error_message = "S3バケットが作成されていません"
  }
}

HCL 構文でテストケースを記述でき、terraform testコマンドで実行できます。

Terraform 1.7(2024 年 1 月)

Test Mocking

実際のリソースを作成することなくテストを実行できるモック機能が追加されました。

mock_provider "aws" {
  mock_resource "aws_s3_bucket" {
    defaults = {
      arn = "arn:aws:s3:::mock-bucket"
    }
  }
}

Config-driven Remove

設定ファイル内でリソースの削除を宣言的に定義できる機能も追加されています。

Terraform 1.8(2024 年 4 月)

Provider-defined Functions

プロバイダーが独自の関数を定義できる機能が導入されました。

# AWS Providerの例
output "account_id" {
  value = provider::aws::arn_parse(aws_s3_bucket.example.arn).account_id
}

HCL 言語機能の拡張

条件分岐とエラーハンドリング

try()および can()関数の機能拡張により、より堅牢なエラーハンドリングが可能になっています。

locals {
  config = try(jsondecode(var.json_config), {})
  port   = try(local.config.port, 80)
}

for_each 構文の改善

import blocks でも for_each 構文が使用可能になり、複数リソースの一括インポートに対応しました。

import {
  for_each = toset(["bucket-1", "bucket-2", "bucket-3"])
  to       = aws_s3_bucket.example[each.key]
  id       = each.value
}

主要プロバイダーのアップデート

AWS Provider 6.0

2024 年にリリースされた AWS Provider 6.0 では、以下の重要な変更が行われました。

リソースレベルでのリージョン指定

provider "aws" {
  region = "us-east-1"
}

resource "aws_vpc" "west" {
  region     = "us-west-2"
  cidr_block = "10.0.0.0/16"
}

単一のプロバイダーインスタンスで複数リージョンのリソースを管理できるようになり、設定の簡素化とメモリ使用量の削減が実現されています。

その他のプロバイダー

Oracle Cloud Platform の新しい Terraform プロバイダーなど、主要クラウドプロバイダーからの公式サポートが継続的に追加されています。

Terraform Cloud/Enterprise の新機能

Dynamic Provider Credentials

OIDC ベースの動的認証機能が一般提供され、以下のクラウドプロバイダーに対応しています:

  • AWS
  • Azure
  • Google Cloud Platform
  • HashiCorp Vault

この機能により、静的な認証情報を保存する必要がなくなり、セキュリティが大幅に向上しました。

価格体系の変更

2023 年 6 月に Terraform Cloud の価格体系が Resources Under Management(RUM)モデルに変更されました。

  • 500 リソースまで無料
  • 501 リソース以上:$0.00014/リソース/時間

Policy Enforcement

Sentinel、Open Policy Agent(OPA)によるポリシー管理機能が強化され、組織レベルでのガバナンスが向上しています。

パフォーマンスと運用面の改善

実行効率の向上

並列処理機能の改善により、大規模な設定ファイルでの実行時間短縮が実現されています。

状態管理の最適化

S3 バックエンドでの native locking サポートにより、DynamoDB テーブルを使用せずに状態ファイルのロック機能を利用できるようになりました。

terraform {
  backend "s3" {
    bucket = "terraform-state"
    key    = "prod/terraform.tfstate"
    region = "ap-northeast-1"
    use_lockfile = true
  }
}

エコシステムツールの動向

テストとバリデーション

  • Terratest: Go 言語でのテストフレームワーク
  • Checkov: 静的解析ツール
  • TFSec: セキュリティスキャナー

運用管理ツール

  • Terragrunt: 複数プロジェクトの管理
  • Atlantis: Pull Request ベースのワークフロー
  • Spacelift/env0: Terraform Cloud 代替ソリューション

まとめ

2022 年以降の Terraform エコシステムは、技術的な成熟度向上と企業戦略の変化により、大きな転換点を迎えています。新機能の多くは開発効率とコード品質の向上に寄与しており、特に import blocks、testing framework、provider-defined functions は実用的価値が高い機能です。

一方で、ライセンス変更と IBM 買収により、長期的な技術選択において慎重な検討が必要となっています。OpenTofu の登場により、オープンソース継続の選択肢も提供されており、組織の要件に応じた適切な選択が重要です。

開発者は新機能を積極的に活用しつつ、組織のポリシーに応じて Terraform または OpenTofu の選択を検討することが推奨されます。

GitHubで編集を提案

Discussion