【入門編】PostmanでAWS API Gateway + Lambdaの認証(IAM Auth)を突破するPre-request Script実装術 – データベース・API管理活用バイブル

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ネイティブ」な環境に進化させてください。

何か詰まったら、いつでも聞いてくださいね。応援しています!

タイトルとURLをコピーしました