APIキーを「隠す」技術:Postmanでシークレットを動的ロードする極意
API開発をしていると、誰もが一度は通る道があります。それは「認証情報をどこに置くか問題」です。
環境変数に直書きしてGitにプッシュしてしまい、冷や汗をかいた経験はありませんか?あるいは、PCを買い替えるたびに何十ものシークレットを再設定していませんか?
今日は、そんな泥臭い運用から卒業し、AWS Secrets ManagerやHashiCorp Vaultから、APIリクエストの直前にシークレットを自動取得して注入する「大人のAPI管理術」を伝授します。これをマスターすれば、あなたの開発環境は鉄壁の要塞に生まれ変わります。
—
なぜ「ハードコード」は悪なのか?
結論から言えば、Postman内にシークレットを保存するのは「暗号化されていないメモ帳」にパスワードを書くのと同じです。
- 共有の危険: チームメンバーとコレクションを共有した際、意図せず機密情報まで渡してしまう。
- 有効期限の問題: ローテーション(定期更新)のたびに各エンジニアが手動でPostmanの設定を書き換えるのは非効率。
「外部の専門ツール(Vault/AWS SM)に管理させ、Postmanは必要な時だけ鍵を借りる」。これがプロのアーキテクチャです。
—
ステップ1:Postmanの「Pre-request Script」という魔法
Postmanには、リクエストを送る直前にコードを実行できる「Pre-request Script」という機能があります。ここに「シークレットを取得して変数にセットする」処理を記述します。
AWS Secrets Managerを例にした実装
まず、AWS SDK (JavaScript) を利用してシークレットを取得する流れを作ります。
// PostmanのPre-request Script欄に記述します
const sdk = require(‘aws-sdk’); // PostmanはNode.js環境をシミュレートできます
// 1. AWSの認証情報を設定(※IAMロールや一時的な認証情報を使用するのがベスト)
const secretsManager = new sdk.SecretsManager({
region: ‘ap-northeast-1’,
accessKeyId: pm.environment.get(“AWS_ACCESS_KEY”), // AWSの一時クレデンシャル
secretAccessKey: pm.environment.get(“AWS_SECRET_KEY”)
});
// 2. シークレットを取得
secretsManager.getSecretValue({ SecretId: ‘prod/api/my-service-key’ }, (err, data) => {
if (err) {
console.error(“シークレット取得失敗:”, err);
} else {
const secret = JSON.parse(data.SecretString);
// 3. 取得した値をPostmanの変数に格納(これでリクエスト内で利用可能)
pm.environment.set(“API_KEY”, secret.apiKey);
console.log(“シークレットを動的にロードしました!”);
}
});
—
ステップ2:APIリクエストで「借りた鍵」を使う
取得したシークレットは、`pm.environment.set` によってPostmanの環境変数に一時的にセットされました。あとは、ヘッダーに埋め込むだけです。
1. APIリクエストの「Headers」タブを開く。
2. `Authorization` キーの値に `{{API_KEY}}` と入力する。
これだけで、リクエストを送信するたびに、最新のシークレットが外部からフェッチされ、認証が完了します。あなたのPCのローカルストレージには、機密情報は一切残りません。
—
ステップ3:HashiCorp Vaultの場合(アーキテクトの推奨)
もしVaultを使っているなら、API経由でトークンを取得するシンプルな `pm.sendRequest` を使うのが最もスマートです。
// Vaultからシークレットを叩く例
pm.sendRequest({
url: ‘https://vault.example.com/v1/secret/data/my-app’,
method: ‘GET’,
header: {
‘X-Vault-Token’: pm.environment.get(“VAULT_TOKEN”)
}
}, function (err, res) {
const data = res.json().data.data;
pm.environment.set(“DYNAMIC_TOKEN”, data.token);
});
—
現場で震えるほど役立つ「運用の極意」
この仕組みを導入する際、以下の3点を意識してください。
- スコープの最小化: 取得したシークレットは、可能であれば「Global変数」ではなく「Collection変数」にセットしてください。意図しない他のコレクションへの影響を防ぎます。
- 永続化させない: `pm.environment.set` は便利ですが、Postmanを閉じても変数が残ります。機密情報はスクリプトの最後でクリアする処理を入れると、よりセキュアです。
- IAMポリシーの絞り込み: AWSを使用する場合、Postman用に発行するIAMユーザーには `secretsmanager:GetSecretValue` 以外の権限を与えないこと。これが「最小権限の原則」です。
—
まとめ:あなたはもう、鍵の管理に追われない
最初は少し難しく感じるかもしれませんが、この仕組みを一度構築してしまえば、環境切り替えも、シークレットのローテーションも、すべて自動化されます。
「ツールに振り回されるエンジニア」から「ツールを支配するエンジニア」へ。
この小さな一歩が、あなたの開発スピードとセキュリティレベルを劇的に向上させるはずです。
もし途中で詰まったら、遠慮なく聞いてくださいね。現場の壁を突破するための知恵は、まだまだたくさんありますから。頑張ってください!