🤖
生成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. 導入手順
- Trivyのインストール
brew install trivy # macOS
# または
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
- pre-commitの設定
pip install pre-commit
pre-commit install
- 初回実行
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