🤖

生成AI × pre-commit × TrivyでTerraformセキュリティを守る方法

に公開

本記事では、pre-commit × Trivy を組み合わせることで、AIが生成したコードでも自動でフォーマット・静的解析・セキュリティチェックを行える仕組みを紹介します。特に、Trivyのバージョン固定による .trivyignore.yaml 非対応の問題と、それを解決する手法にフォーカスします。

なぜpre-commitが必要か

一般的な課題

Terraformプロジェクトでよくある問題

  • フォーマットの不統一(terraform fmtの実行忘れ)
  • セキュリティチェックの漏れ
  • レビューで同じ指摘の繰り返し

AI時代の新たな課題

Claude Code など、AI支援ツールの普及により発生する新たな問題

  • AIは機能的なコードは生成するが、フォーマットを無視することがある
  • 「Lintをかけて」と指示しても実行しないケースがある
  • セキュリティベストプラクティスが考慮されていない

pre-commitなら、コミット時に強制的にこれらのチェックを実行でき、AIがエラーを理解して自動修正する好循環が生まれます。

セキュリティスキャンツールの選択

tfsecからTrivyへの移行

tfsecは現在以下のような状況です。

  • tfsecの新機能開発は停止
  • 新ルールはTrivyに追加される
  • 新規導入ならTrivy一択

pre-commit-terraformの制約

terraformプロジェクトでよく利用されるpre-commit-terraformがありますが、terraform_trivyフックには以下の制約があります

  • Trivyのバージョンが古い
  • .trivyignore.yamlが使えないのでファイル単位の調整ができない
  • 最新のセキュリティルールが利用できない

解決策:pre-commit-trivyの導入

terraform_trivy vs pre-commit-trivy

項目 terraform_trivy pre-commit-trivy
Trivyバージョン 固定(古い) 最新版を使用可能
.trivyignore.yaml ❌ 非対応 ✅ 対応
導入の手軽さ ◎ 簡単 △ 設定が必要
柔軟性 △ 限定的 ◎ 高い

実装手順

1. 基本設定

# .pre-commit-config.yaml
repos:
  # フォーマットとバリデーション
  - repo: https://github.com/antonbabenko/pre-commit-terraform
    rev: v1.99.4
    hooks:
      - id: terraform_fmt
      - id: terraform_validate
      - id: terraform_tflint

  # Trivyによるセキュリティスキャン(最新版)
  - repo: https://github.com/mxab/pre-commit-trivy.git
    rev: v0.15.0
    hooks:
      - id: trivyconfig-docker
        name: Trivy config scanner
        description: Scan for misconfigurations using Trivy
        args:
          - --severity=CRITICAL,HIGH
          - --exit-code=1
          - --ignorefile=.trivyignore.yaml
          - .

2. .trivyignore.yamlの活用

# 開発環境の例外設定
- id: AVD-AWS-0089
  paths:
    - "environments/dev/**/*.tf"
  expired_at: 2024-12-31
  statement: "開発環境では緩い設定を許可"

# 外部モジュール
- id: AVD-AWS-0124
  paths:
    - ".terraform/modules/**"
  statement: "外部モジュールは対象外"

3. 導入手順

  1. Trivyのインストール
brew install trivy  # macOS
# または
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
  1. pre-commitの設定
pip install pre-commit
pre-commit install
  1. 初回実行
pre-commit run --all-files

AIとpre-commitの相乗効果

AIでの開発フロー

1. AIにコード生成を依頼

> AWS RDSインスタンスを作成するTerraformコードを書いて

2. AIが生成したコード(フォーマット未整形)

resource "aws_db_instance" "main" {
  identifier = "mydb"
    engine = "postgres"
  instance_class = "db.t3.micro"
}

3. AIがコミット時にpre-commitが自動修正

⏺ Bash(git commit -m "Add RDS instance")
terraform fmt.............................................Passed
terraform validate........................................Passed
terraform_tflint..........................................Passed
Trivy security scan.......................................Failed

4. pre-commitでセキュリティ問題を検出

HIGH: Database instance is not encrypted
  → encryption_at_rest_enabled = true を追加する必要あり

AIがpre-commit結果を見て自動修正

さらに便利なのは、AIがpre-commitの結果を読み取って自動修正してくれる点です:

pre-commitでエラーが出た場合

⏺ Bash(git commit -m "Add S3 bucket")
terraform fmt.............................................Failed
- Files were modified by this hook.
Trivy security scan.......................................Failed
- HIGH: Bucket does not have encryption enabled

AIがエラー内容を理解して自動修正

⏺ Bash(git commit -m "Add S3 bucket")
terraform fmt.............................................Failed
- Files were modified by this hook.
Trivy security scan.......................................Failed
- HIGH: Bucket does not have encryption enabled

⏺ pre-commitの指摘を修正します:

修正後のコード(AIが自動生成)

resource "aws_s3_bucket" "example" {
  bucket = "my-bucket"

  tags = {
    Environment = "production"
  }
}

resource "aws_s3_bucket_server_side_encryption_configuration" "example" {
  bucket = aws_s3_bucket.example.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

このように、pre-commitとAIが協調して動作することで、手動での修正作業が大幅に削減されます。

まとめ

AIが生成したTerraformコードに対しても、pre-commitを使えばフォーマットやセキュリティのチェックを強制的に実行できるため、品質を担保するうえで非常に有効です。さらに、エラー内容をAIが理解して自動修正してくれることで、人手を介さずに問題を解消する好循環も生まれます。

AI支援による開発が当たり前になった今こそ、pre-commitによる自動チェックとAIによる自動修正の組み合わせは、高品質なコードを効率よく生み出すための開発フローだと言えるでしょう。

Discussion