logo hsb.horse
← ブログ一覧に戻る

ブログ

IAM認証有効なAPI GatewayにTypeScriptでリクエストする実装

AWS SDK for JavaScriptのSigV4を使って、IAM認証が有効なAPI Gatewayにローカル環境からTypeScriptでリクエストする実装手順。

公開日:

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,
},
});

ポイント

  1. fromIniで認証情報をAWSプロファイルから読み込む
  2. HttpRequestでリクエストオブジェクトを作成
  3. SignatureV4でリクエストに署名
  4. fetchで署名付きヘッダーを含めてリクエスト

まとめ

AWS SDK for JavaScriptのSignatureV4を使えば、IAM認証付きAPI Gatewayへのリクエストをローカル環境から簡単に送れる。

認証情報はAWSプロファイルから読み込むため、コードにクレデンシャルを埋め込む必要がない。