🍆

Terragrunt + SOPS でシークレットを安全に Git 管理する

に公開

IaC でシークレット(DB パスワード、API キーなど)をどう管理していますか?

この記事では、SOPS で暗号化したシークレットを Git 管理し、Terragrunt でシームレスに復号して使う方法を紹介します。

よくある課題

方法 問題点
.tfvars に平文で記載 Git に機密情報が残る
環境変数で渡す CI/CD の設定が複雑になる
Secrets Manager 等を直接参照 Terraform 外で事前設定が必要

解決策:SOPS + Terragrunt

SOPS(Secrets OPerationS)は暗号化ツールです。YAML/JSON のキー名は平文のまま、値だけを暗号化できるため、Git の差分が見やすいのが特徴です。

Terragrunt は sops_decrypt_file() 関数をネイティブサポートしており、追加ツールなしで復号できます。

secrets.yaml(暗号化済み)
        ↓
    Terragrunt: sops_decrypt_file()
        ↓
    AWS KMS で自動復号
        ↓
    Terraform の inputs に渡す

前提条件

  • Terragrunt / Terraform がインストール済み
  • AWS KMS キーが作成済み(暗号化・復号に使用)
  • 実行環境に KMS の kms:Decrypt 権限がある

ディレクトリ構成例

live/
├── .sops.yaml              # SOPS 設定(どの KMS キーで暗号化するか)
└── dev/
    └── app/
        ├── terragrunt.hcl
        └── secrets.yaml    # 暗号化済みシークレット

セットアップ手順

1. SOPS のインストール

brew install sops

2. .sops.yaml の作成

リポジトリルートに配置します。パスのパターンごとに使用する KMS キーを指定できます。

creation_rules:
  - path_regex: secrets\.yaml$
    kms: arn:aws:kms:ap-northeast-1:123456789012:alias/my-key

3. シークレットファイルの作成と暗号化

まず平文で作成します。

# secrets.yaml
db_password: my-secret-password
api_key: sk-1234567890abcdef

暗号化を実行します。

sops --encrypt --in-place secrets.yaml

暗号化後のファイルは以下のようになります(キー名は平文のまま)。

db_password: ENC[AES256_GCM,data:xxx,iv:xxx,tag:xxx]
api_key: ENC[AES256_GCM,data:yyy,iv:yyy,tag:yyy]
sops:
    kms:
        - arn: arn:aws:kms:ap-northeast-1:123456789012:alias/my-key
          ...

4. Terragrunt での利用

# terragrunt.hcl
locals {
  secrets = yamldecode(sops_decrypt_file("${get_terragrunt_dir()}/secrets.yaml"))
}

inputs = {
  db_password = local.secrets.db_password
  api_key     = local.secrets.api_key
}

terragrunt plan や terragrunt apply 実行時に自動で復号されます。

日常の操作

# 編集(エディタで開き、保存時に自動で再暗号化)
sops secrets.yaml

# 復号して内容を確認
sops --decrypt secrets.yaml

メリットまとめ

特徴 説明
Git で履歴管理 暗号化されているので安全にコミット可能
差分が見やすい キー名が平文なので、どの値が変わったか分かる
権限分離 環境ごとに異なる KMS キーを使い、アクセス制御
シンプル Terragrunt ネイティブ対応で追加ツール不要

参考リンク

Discussion