PostmanでAWS IAM認証の壁を突破する:SigV4署名を自動化する極意
こんにちは。APIアーキテクトとして、これまで数多の認証プロトコルと格闘してきました。
AWS API Gatewayで「IAM認証」を採用している皆さん、Postmanでのテストに苦労していませんか?「AWS CLIなら通るのに、Postmanだと `403 Forbidden` になる……」という経験、一度はあるはずです。
実は、AWSのIAM認証(SigV4署名)は、リクエストのヘッダーに「誰が、いつ、何を」送ったかの暗号化された署名を埋め込む必要があります。Postmanは標準でこれを行ってくれないため、Pre-request Scriptを駆使して、リクエスト直前に署名を動的に生成してあげるのが「現場の正解」です。
今日は、この泥臭い作業をコードでスマートに自動化し、開発効率を爆上げする方法を伝授します。
—
1. なぜ「署名」が必要なのか?(本質を理解する)
AWSのIAM認証は、単純なトークン方式とは異なります。
- リクエスト内容をハッシュ化
- シークレットキーで署名
- 日時(タイムスタンプ)をヘッダーに含める
これら全てを、リクエストのたびに計算しなければなりません。手動でやれば数分かかる作業を、Postmanの強力なサンドボックス環境(JavaScript)で一瞬で終わらせましょう。
—
2. 準備:PostmanでIAM認証を突破するセットアップ
外部ライブラリ `aws4` を利用します。PostmanのPre-request Script内ではNode.jsのモジュールを直接 `require` できないため、ライブラリのコード全体を環境変数に保存するか、スクリプト内に組み込む手法をとります。
手順1:変数の準備
Postmanの「Collection Variables」に、以下の項目を追加してください。
- `aws_access_key`: あなたのIAMアクセスキー
- `aws_secret_key`: あなたのIAMシークレットキー
- `aws_region`: `ap-northeast-1` など
- `aws_service`: `execute-api` (API Gatewayの場合)
—
3. 実践:Pre-request Scriptの構築
Postmanの対象リクエストを開き、「Pre-request Script」タブに以下のコードを貼り付けてください。
※このコードは、リクエスト直前に実行され、必要なヘッダー(`Authorization`, `X-Amz-Date`, `X-Amz-Security-Token`)を動的に注入します。
// 注意: aws4ライブラリを直接CDNから読み込めないため、
// 実際にはライブラリのコードをここに貼るか、
// Postmanの「Library」機能で読み込ませるのがベストです。
// 以下は署名生成のロジックを簡略化したテンプレートです。
const aws4 = require(‘aws4’); // ※ライブラリのインポート
const request = {
host: pm.request.url.getHost(),
method: pm.request.method,
path: pm.request.url.getPath(),
headers: {
‘host’: pm.request.url.getHost(),
‘x-amz-date’: new Date().toISOString().replace(/[:\-]|\.\d{3}/g, ”)
}
};
// 署名の生成
aws4.sign(request, {
accessKeyId: pm.collectionVariables.get(“aws_access_key”),
secretAccessKey: pm.collectionVariables.get(“aws_secret_key”)
});
// 生成されたヘッダーをリクエストに付与
pm.request.headers.add({key: ‘Authorization’, value: request.headers[‘Authorization’]});
pm.request.headers.add({key: ‘X-Amz-Date’, value: request.headers[‘X-Amz-Date’]});
pm.request.headers.add({key: ‘X-Amz-Security-Token’, value: pm.collectionVariables.get(“aws_session_token”) || ”});
—
4. 精度高い「HelloWorld」的動作確認
ここまで設定したら、一度リクエストを送ってみてください。
1. コンソールを開く: 画面左下の「Console」ボタンをクリックします。
2. リクエストを送る: Sendボタンを押します。
3. 確認: コンソール上に「Authorization」ヘッダーが正しく生成されているか確認してください。`AWS4-HMAC-SHA256 …` で始まる文字列が表示されていれば成功です。
もし `403 Forbidden` が返る場合は、以下の3点を確認してください。
- IAMポリシー: 対象のAPI Gatewayに対して `execute-api:Invoke` 権限が付与されているか?
- 時刻: PCの時計がズレていないか?(AWSは5分以上のズレを拒否します)
- リージョン: `aws_region` がAPI Gatewayのデプロイ先と一致しているか?
—
5. 最後に:なぜこれが「最強」なのか
この方法をマスターすると、PostmanのGUI操作だけで、本番環境と全く同じセキュリティレベルのAPIテストが可能になります。
「IAM認証だからローカルでテストできない」という言い訳はもう終わりです。このスクリプトをコレクションに仕込んでおけば、チーム全員がワンクリックでAWS API Gatewayを叩けるようになります。
開発とは、こうした「面倒な認証の壁」を、いかにエレガントに自動化するかの積み重ねです。ぜひ、今日からあなたのPostmanを「AWSネイティブ」な環境に進化させてください。
何か詰まったら、いつでも聞いてくださいね。応援しています!