Pulumi Secrets管理完全ガイド:AWS/GCP KMSからHashiCorp Vaultまで、暗号化プロバイダの極意
テックリードの私たちが日々のインフラ開発で最も恐れるもの、それはGitリポジトリへのAPIキーやDBパスワードの誤爆コミットだ。
Terraformで`sensitive = true`を指定しても、Stateファイル(`.tfstate`)のJSONを開けば平文でシークレットが鎮座しているという悪夢を、あなたも一度や二度は経験したことがあるだろう。
次世代のインフラストラクチャ・アズ・コード(IaC)であるPulumiは、この「機密情報の呪縛」に対して最初から極めてエレガントかつ強固な解を用意している。今回は、PulumiのSecrets管理の深淵に飛び込み、AWS KMSやGCP KMS、そしてHashiCorp Vaultをシームレスに統合し、チーム開発の生産性を落とさずにセキュリティを極限まで高める実践知を伝授する。
—
1. IaCにおける機密情報管理のパラダイムシフト
従来のIaCツール、特にTerraformにおけるシークレット管理は常に妥協の連続だった。
- Stateファイルの平文問題: Stateファイル自体を暗号化(S3 + KMSなど)しても、バックエンドにアクセス権を持つ人間やCI/CDパイプラインのログ出力でシークレットが露出するリスクが消えない。
- 環境変数の限界: `TF_VAR_`経由で渡すアプローチは、プロセス一覧(`ps aux`)やコンテナの環境変数インスペクションから容易に覗き見される。
Pulumiの思想は根本的に異なる。「シークレットは、コード上でも、State上でも、暗号化された状態でなければならない」というゼロトラスト・アーキテクチャをデフォルトで実装しているのだ。
Pulumiでは、シークレットは単なる文字列ではなく、`Output
—
2. Pulumi標準Secrets機能のメカニズムと使い方
Pulumiを初期化すると、デフォルトでプロジェクトごとに暗号化プロバイダ(Passphrase方式)が設定される。これがどのように動いているのか、実務的なコードで見ていこう。
基本のシークレット定義(TypeScript)
import as pulumi from “@pulumi/pulumi”;
import as aws from “@pulumi/aws”;
// 設定オブジェクトの取得
const config = new pulumi.Config();
// 設定ファイル(Pulumi.dev.yaml)からシークレットとして読み込む
// 例: pulumi config set –secret dbPassword “SuperSecret123!”
const dbPassword = config.requireSecret(“dbPassword”);
// RDSインスタンスの作成
const db = new aws.rds.Instance(“my-db”, {
engine: “postgres”,
instanceClass: “db.t4g.micro”,
allocatedStorage: 20,
dbName: “appdb”,
username: “dbadmin”,
// ここでSecret型を渡すことで、AWSへの通信時のみ復号され、Stateには暗号化されて保存される
password: dbPassword,
});
// 出力(スタックのエクスポート)
export const dbEndpoint = db.endpoint;
開発スピードを劇的に高めるCLIテクニックとショートカット
毎回 `pulumi config set –secret` を叩くのは苦行だ。以下のワークフローをチームの標準にしよう。
1. 既存の平文設定をシークレットに昇格させる
pulumi config set myApiKey “AIzaSy…” –secret
2. スタック構成ファイルの直接編集(暗号化)
YAMLを直接編集したい場合は、ネイティブの暗号化コマンドを使う。
pulumi config encrypt “my-secret-value”
出力された暗号文字列を `Pulumi.dev.yaml` に貼り付けるだけだ。
—
3. クラウドネイティブな暗号化プロバイダの統合(AWS KMS / GCP KMS)
個人開発や小規模チームであればデフォルトのPassphrase方式で十分だが、企業レベルの本番環境(Production)では、クラウドプロバイダのKMSをバックエンドに指定し、チームメンバー間でパスフレーズを共有するリスクを排除すべきだ。
プロジェクトルートにある `Pulumi.yaml` に暗号化プロバイダの設定を記述する。
ベストプラクティス構成例: AWS KMSを使用する場合
`Pulumi.yaml`:
name: my-infrastructure-prod
runtime: nodejs
description: Production environment with AWS KMS encryption
AWS KMSをシークレットの暗号化/復号に指定
secretsprovider: awskms://arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012
ベストプラクティス構成例: GCP KMSを使用する場合
`Pulumi.yaml`:
name: my-infrastructure-prod
runtime: nodejs
description: Production environment with GCP KMS encryption
GCP Cloud KMSを指定
secretsprovider: gcpkms://projects/my-company-prod/locations/global/keyRings/pulumi/cryptoKeys/stack-secrets
プロプロからの助言:
KMSを使う場合、CI/CD環境(GitHub ActionsやGitLab CIなど)で適切なIAM権限(`kms:Decrypt`, `kms:Encrypt`)を持つロールをAssumeOIDC等で付与しておくだけでよい。コードベースに機密情報を一切置かない、完璧なセキュアパイプラインが完成する。
—
4. エンタープライズ向け:HashiCorp Vaultの統合
金融やヘルスケアなど、厳格なコンプライアンスが求められる現場では、HashiCorp Vaultとの統合がデファクトスタンダードとなる。PulumiはVaultをネイティブのSecretsProviderとしてサポートしている。
`Pulumi.yaml` での指定例:
name: enterprise-app
runtime: nodejs
VaultのTransit Secrets Engineを指定
secretsprovider: hashivault://secret/data/pulumi/stacks
これにより、PulumiのすべてのシークレットはVault側で管理・監査ログに記録され、IaCのライフサイクルと完全に同期する。
—
5. コードレビュー時の漏洩防止とチーム開発のルール化
どれほど優れたツールを導入しても、人間のミスによる漏洩はなくならない。テックリードとしてチームに強制すべき「絶対のルール」と「開発環境の守り方」を共有する。
絶対に入れるべき神プラグインとエディタ設定(VS Code)
1. Checkov / Tfsec (または Pulumi Policy as Code / CrossGuard)
コードレビューを待つ前に、静的解析でシークレットのハードコードや不適切な設定を検知する。
VS Code拡張機能 “Checkov” をインストールし、保存時に自動スキャンするように設定する。
2. GitGuardian Security / TruffleHog (GitHub App)
万が一、`Pulumi.yaml` やコード内に平文のAPIキーや秘密鍵が混入した場合に、コミットの段階でブロックする仕組みをGitHubリポジトリに必ず導入する。
チーム開発のための設定共有化ルール
- `Pulumi..yaml` の扱い
- `Pulumi.yaml` … Git管理する(プロジェクト定義、`secretsprovider`の指定を含む)
- `Pulumi.dev.yaml` … Git管理する(ただし値はすべて暗号化されているか、プレースホルダーのみ)
- `Pulumi.prod.yaml` … Git管理する(同上)
- `Pulumi.stack.yaml`(ローカル秘密情報)… 絶対に `.gitignore` に含める
究極の安全性を生む `.gitignore` テンプレート
Pulumi local files
.pulumi/
.local.yaml
Pulumi..local.yaml
万が一のエクスポートファイルの除外
.json
.pem
.key
—
結びにかえて
PulumiのSecrets管理をマスターすることは、単に「パスワードが漏れないようにする」というレベルの話ではない。「インフラストラクチャのすべてのライフサイクルにおいて、セキュリティとスピードを完全に両立させる」というプロフェッショナルとしてのエンジニアリングそのものだ。
暗号化プロバイダをAWS KMSやVaultに切り替え、コード上の型安全な `Secret
さあ、今すぐ `Pulumi.yaml` を開き、あなたのプロジェクトのセキュリティを次の次元へと引き上げよう。