API GatewayでIAM認証を有効にすると、リクエストに署名が必要になる。
ローカル環境からTypeScriptでIAM認証付きリクエストを送る実装をまとめる。
環境
- ローカル環境から実行
- Node.js(またはBun)で動作
実装
AWS SDK for JavaScriptのSignatureV4を使って、リクエストに署名を追加する。
import { fromIni } from "@aws-sdk/credential-providers";import { SignatureV4 } from "@aws-sdk/signature-v4";import { Sha256 } from "@aws-crypto/sha256-js";import { HttpRequest } from "@aws-sdk/protocol-http";
const credentials = fromIni({ profile: "profile-name" });
const serviceName = "execute-api";
const options = { url: "https://{id}.execute-api.ap-northeast-1.amazonaws.com/", headers: {} as Record<string, string>,};
const url = new URL(options.url);const host = url.hostname;const path = url.pathname;
const req = new HttpRequest({ headers: { Host: host, }, hostname: host, method: "GET", path: path,});
const signer = new SignatureV4({ credentials, region: "ap-northeast-1", service: serviceName, sha256: Sha256,});
const signed = await signer.sign(req);
const response = await fetch(options.url, { headers: { ...signed.headers, Host: host, },});ポイント
fromIniで認証情報をAWSプロファイルから読み込むHttpRequestでリクエストオブジェクトを作成SignatureV4でリクエストに署名fetchで署名付きヘッダーを含めてリクエスト
まとめ
AWS SDK for JavaScriptのSignatureV4を使えば、IAM認証付きAPI Gatewayへのリクエストをローカル環境から簡単に送れる。
認証情報はAWSプロファイルから読み込むため、コードにクレデンシャルを埋め込む必要がない。
hsb.horse