開発者の自由を奪わずに「事故」をゼロにする:Terraform Policy as Codeの極意
こんにちは。インフラの自動化を愛し、コードで世界を制御することに情熱を燃やすエンジニアです。
Terraformを使ってインフラを構築する日々、皆さんはこんな不安を感じたことはありませんか?
「誰かがうっかり本番環境に巨大なインスタンスを立てたらどうしよう?」
「暗号化されていないS3バケットが公開されてしまったら?」
「開発者の自由」と「システムの堅牢性」はトレードオフではありません。 今日は、Terraform Cloud/Enterpriseの最強の武器であるPolicy as Code (Sentinel / OPA) を使って、人間がレビューしなくても「安全なインフラしか作れない」仕組みを作る方法を伝授します。
—
1. なぜ「ガードレール」が必要なのか?
インフラ構成管理(IaC)において、開発者に権限を渡すのは素晴らしいことです。しかし、人間はミスをする生き物です。
手動のレビューはボトルネックになり、ミスを見逃すリスクも高い。ここで登場するのがPolicy as Codeです。これは「ポリシーをコードとして定義し、CI/CDのパイプラインに埋め込む」技術です。
Terraformが `plan` を実行した直後、私たちが定義した「守り神」がその計画をスキャンし、基準に満たなければ自動的にブロックします。これで、「間違ったインフラはそもそも作成すらできない」という鉄壁の環境が手に入ります。
—
2. 守り神を召喚する:Sentinel と OPA
Terraformで使えるポリシーエンジンには主に2つあります。
- Sentinel: HashiCorpが提供する独自言語。Terraformとの親和性が抜群で、記述が直感的。
- Open Policy Agent (OPA): クラウドネイティブ界の標準。`Rego`という言語で書く汎用的なポリシーエンジン。
今回は、誰でも今日から導入できる OPA (Rego) を例に、「S3バケットは必ず暗号化せよ」というポリシーを作ってみましょう。
最初のステップ:Regoのコードを書いてみる
`s3_encryption.rego` というファイルを作成します。
package terraform.analysis
plan結果から、S3バケットのリソースのみを抽出
import input as tfplan
「暗号化されていない」リソースを探し出すルール
deny[msg] {
resource := tfplan.resource_changes[_]
resource.type == “aws_s3_bucket” # 対象リソース
# サーバーサイド暗号化の設定がないものを検知
not resource.change.after.server_side_encryption_configuration
msg := sprintf(“警告: バケット %s は暗号化されていません!修正してください。”, [resource.address])
}
—
3. 実践:CI/CDパイプラインへの統合
Terraform CloudやEnterpriseでは、このポリシーを「Policy Sets」として登録するだけで準備は完了です。
最も重要なプロセス
1. Planの実行: 開発者が `terraform plan` を実行。
2. ポリシー評価: Terraform Cloudが内部でOPAを実行し、作成された `tfplan.json` をスキャン。
3. ガードレールの発動:
- 違反があれば、Planの終了時に「Policy Check Failed」を返し、Applyを物理的に遮断します。
- 開発者の画面には、先ほど書いた `msg` が表示され、どこを直すべきか一目瞭然になります。
これにより、「なぜダメなのか」を口頭で説明する必要すらなくなります。 コードがすべてを語ってくれるからです。
—
4. 現場で「震えるほど役立つ」運用の知見
初心者の頃は「何でもかんでも制限したくなる」かもしれませんが、それは開発者のモチベーションを殺します。以下の3点を意識してください。
- Soft MandatoryとHard Mandatoryを使い分ける:
- 警告だけで済ませるルール(Soft)と、絶対に許さないルール(Hard)を分けることで、柔軟な運用が可能です。
- ポリシー自体をGitで管理する:
- ポリシーもコードです。テストコードを書き、PRベースでポリシーを更新する運用を徹底してください。
- 最初から完璧を目指さない:
- まずは「タグ付け漏れ」や「パブリック公開」といった致命的なものから始めましょう。
—
最後に:自動化こそが最高のエンジニアリング
ポリシーをコード化するということは、「自分が寝ている間も、チームのコードをクリーンに保つ優秀なレビューアを雇う」のと同じです。
最初は少し難しく感じるかもしれませんが、一度この「ガードレールのある世界」を知ってしまえば、もうポリシーなしのインフラ構築には戻れません。
今日紹介した内容はほんの入り口に過ぎません。まずは小さなルールから始めてみてください。それが、あなたのインフラを「壊れない強固な城」へと変える第一歩になります。
何か分からないことがあれば、いつでも聞いてください。応援していますよ!