こんにちは!クラウドインフラの世界へようこそ。
日々、AWSやGCP、AzureなどのリソースをTerraformやPulumiで構築していると、ふとこんな不安に襲われることはありませんか?
- 「うっかり公開設定(Public Access)のS3バケットを作ってしまわないか…」
- 「本番環境なのに、コストの大きなインスタンスタイプがデプロイされないか…」
- 「全ての必須タグ(CostCenterやOwnerなど)が漏れなく付与されているか…」
これらを人の目(プルリクエストのレビュー)だけで防ぐのは、限界があります。ヒューマンエラーは必ず起きるからです。
だからこそ、「コードを書いた時点で、マシンが自動的にセキュリティやコンプライアンスをチェックしてくれる仕組み」が必要になります。それが今回解説する Pulumi CrossGuard(Policy as Code) です。
これをマスターすれば、あなたのチームのインフラ安全性は劇的に向上し、夜も安心して眠れるようになりますよ。さあ、一緒にその扉を開けてみましょう!
—
1. Pulumi CrossGuard とは何か?
一言で言うと、CrossGuardは「インフラストラクチャに対する厳格なガードレール」です。
Pulumiでインフラを定義し、`pulumi up`(デプロイ)を実行する「その瞬間」、あるいはCI/CDパイプライン上で、定義したポリシー(ルール)に違反していないかを自動で検査します。違反があれば、デプロイは即座にブロックされます。
なぜ Terrafrom (Sentinel/OPA) ではなく Pulumi CrossGuard なのか?
多くのIaCツールにはポリシーチェックの仕組みがありますが、Pulumiの強みは「TypeScriptやPythonといった、普段使い慣れた汎用言語でポリシーを書けること」にあります。特別なドメイン固有言語(DSL)を新しく覚える必要はありません。使い慣れたロジックで、柔軟かつ強力なバリデーションを記述できます。
—
2. 開発環境のセットアップと基礎知識
それでは、実際に手を動かしながら学んでいきましょう。今回は、多くのエンジニアにとって馴染み深い TypeScript を使ってポリシー(Policy Pack)を作成します。
前提条件
- Node.js (v16以上推奨)
- Pulumi CLI がインストール済みであること
プロジェクトの初期化
まずは、ポリシー専用のディレクトリを作成し、Policy Packを初期化します。
mkdir my-security-policies
cd my-security-policies
Policy PackのテンプレートをTypeScriptで生成する
pulumi policy new typescript
対話形式でいくつか質問されますが、デフォルトのままで進めて問題ありません。完了すると、以下のようなファイル構造が生成されます。
my-security-policies/
├── package.json
├── index.ts ← ここにポリシーのコードを書きます!
└── tsconfig.json
—
3. 実践:絶対にS3を公開させないカスタムポリシーを書く
「すべてのS3バケットは、パブリックアクセスが完全にブロックされていなければならない」という組織のルールを、コードとして実装してみましょう。
`index.ts` をエディタで開き、以下のように書き換えてみてください。
`index.ts` の実装例
import as policy from “@pulumi/policy”;
import as aws from “@pulumi/aws”;
// Policy Pack(ポリシーの集合体)を定義します
export const policyPack = new policy.PolicyPack(“aws-security-guardrails”, {
policies: [
{
name: “s3-no-public-read”,
description: “S3バケットがパブリック読み取り権限を持っていないか検証します。”,
// ポリシーの適用対象を「AWSリソース」に指定
enforcementLevel: “mandatory”, // 違反時にデプロイを失敗させる (“advisory” なら警告のみ)
validateResource: policy.validateResource(aws.s3.BucketV2, (bucket, args, reportViolation) => {
// パブリックアクセスブロックの設定が明示されているかチェック
// (簡易的な例として、ACLが “public-read” 等になっていないかを見ることもできます)
// ここでは分かりやすく、バケット名に “public” という文字列が含まれていたらNGにするロジックにしてみましょう
if (bucket.bucket && bucket.bucket.includes(“public”)) {
reportViolation(
“セキュリティポリシー違反: S3バケット名に ‘public’ を含めることは禁止されています。”
);
}
}),
},
],
});
たったこれだけです!TypeScriptの型補完が効くため、AWSリソースのプロパティも迷うことなく記述できます。
—
4. 精度高い動作確認(ローカルテスト)
ポリシーを作ったら、それが正しく機能するかテストしたくなりますよね。Pulumi CrossGuardには、ポリシー単体をテストする仕組みが備わっています。
適当なインフラストラクチャプロジェクト(Pulumiの通常のデプロイプロジェクト)を用意し、先ほど作成したポリシーを適用してみましょう。
インフラプロジェクト側で、以下のような「違反するリソース」を定義します。
import as pulumi from “@pulumi/pulumi”;
import as aws from “@pulumi/aws”;
// わざとポリシーに違反する名前でバケットを定義
const badBucket = new aws.s3.BucketV2(“my-public-bucket”, {
bucket: “company-data-public-bucket”, // “public” が含まれているので違反するはず!
});
そして、デプロイ時に先ほどのポリシーパックを読み込ませます(`–policy-pack` オプションを指定します)。
pulumi up –policy-pack ../my-security-policies
実行結果(コンソール出力)
コマンドを実行すると、Pulumiはデプロイ処理を行う前にポリシーチェックを実行し、以下のような美しいエラーを出して処理を中断します。
Previewing update (dev)
Type Name Plan Info
aws:s3/bucketV2:BucketV2 my-public-bucket create
Diagnostics:
aws:s3/bucketV2:BucketV2 (my-public-bucket):
[policy violation] s3-no-public-read: セキュリティポリシー違反: S3バケット名に ‘public’ を含めることは禁止されています。
Policies:
1 violated, 0 evaluated, 0 advisory
Permalink: https://app.pulumi.com/…
お見事です! クラウド上にリソースが作られる前に、コードの段階でしっかりとガードがかかりました。
—
5. 組織全体のガバナンスを高めるベストプラクティス
このCrossGuardをチームや組織全体に導入し、真の「インフラガバナンス」を実現するための極意をいくつか伝授します。
1. ポリシーの独立したリポジトリ管理
インフラを構築するアプリケーションコードのリポジトリとは別に、ガバナンスチームが管理する「Policy Pack専用のリポジトリ」を用意しましょう。npmパッケージとして社内共有したり、Gitサブモジュール等で連携させます。
2. 最初は `advisory` モードから始める
いきなり `enforcementLevel: “mandatory”`(強制エラー)にすると、既存の開発フローが止まってしまい、開発者からブーイングが起きます。最初は `advisory`(警告のみ)でデプロイを流し、徐々にルールを浸透させてから強制モードに切り替えるのが大人のやり方です。
3. CI/CDパイプライン(GitHub Actions等)への組み込み
開発者のローカルだけでなく、Pull Requestを作成した段階のGitHub Actions上で `pulumi preview –policy-pack …` を走らせるようにします。レビューの自動化において、これほど頼もしい相棒はいません。
—
まとめ
Pulumi CrossGuardを使ったPolicy as Codeの実装、いかがでしたでしょうか?
「インフラの安全性は、人間の注意力ではなく、仕組み(コード)で担保する」。
これこそが、モダンなSRE・クラウドエンジニアリングの極みです。
最初は小さなルール(「すべてのリソースにOwnerタグをつける」「特定のリージョン以外へのデプロイを禁止する」など)からで構いません。ぜひ明日の開発から、あなたのプロジェクトにCrossGuardを取り入れてみてください。毎日のインフラ作業の安心感が、劇的に変わることを約束します。