Amazon API Gateway で作成した Web API には、独自の API キーによるアクセス制限 をかけることができます。
これにより、x-api-key ヘッダーが含まれていない HTTP リクエストを拒否することができます。
例えば、AWS 外の特定のバックエンドサービスからのアクセスのみを許可して連携させたいときに便利です。
ここでは、簡単な Hello World API を作成して、API キーによるアクセス制限をかけてみます。
Lambda 関数を作成する
最初に、API 実装として Lambda 関数を作成しておきます。
- AWS マネジメントコンソール にサインインして、Lambda サービスを開きます。
- 関数の作成をクリックして、- 一から作成 (Author from scratch)で次のように作成します。- 関数名 (Function name): hello
- ランタイム (Runtime): Node.js 22.x
- アーキテクチャ (Architecture): arm64(intel アーキテクチャより少し安い)
 
- 関数名 (Function name): 
次のような Lambda 関数のコードが生成されたら成功です。
export const handler = async (event) => {
  // TODO implement
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};API Gateway で Web API を作成する
次に、API Gateway で API を作成して、上記の Lambda 関数を HTTP 経由で呼び出せるようにします。
- AWS マネジメントコンソール にサインインして、API Gateway サービスを開きます。
- API の作成をクリックして、次のように作成します。- API タイプ: REST API(HTTP APIだと API キーが設定できないっぽい)
- API の詳細: 新しい API
- API 名: hello-api
 
- API タイプ: 
- API: hello-api のリソースのページから、- メソッドの作成をクリックして、次のように作成します。- メソッドタイプ: GET
- 統合タイプ: Lambda 関数
- Lambda プロキシ統合: ON
- Lambda 関数: 先ほど作成した hello関数を選択
 
- メソッドタイプ: 
- API のデプロイボタンをクリックして API をデプロイします。- 初回は新しいステージ名を入力して作成します(ここでは prodとします)。
 
- 初回は新しいステージ名を入力して作成します(ここでは 
以下のような URL が発行されるので、Web ブラウザや curl コマンドでアクセスして、"Hello from Lambda!" と表示されればデプロイ成功です。
https://abcde12345.execute-api.ap-northeast-1.amazonaws.com/prod/URL の先頭の 10 文字は、作成した API の ID に読み替えてください。
API キーによるアクセス制限をかける
API Gateway で API キーによるアクセス制限をかけるには、次のような構成を作成する必要があります。 はっきりいって分かりにくいです(^^;
- 各 API リソースの設定で API キーの必須設定 を ON にする
- API Gateway 上で 使用量プラン を作成し、API ステージ(hello-apiのprodなど)を関連づける
- API Gateway 上で API キー を作成し、「使用量プラン」に関連づける
図にすると下記のような感じ。 カッコの中は、今回設定する値を示しています。
(HELLO_API_KEY)"] --- B["使用量プラン
(HELLO_API_PLAN)"] B-->C["API ステージ
(hello-api/prod)"]
まず、次のように設定して、API 呼び出し時の API キー(x-api-key ヘッダー)の指定を必須にします。
- API Gateway の APIメニューから、作成したhello-apiを選択します。
- 各リソースのメソッド(GETなど)を選択し、メソッドリクエストの設定の編集をクリックします。
- API キー必須を ON にして- 保存します。
- API をデプロイボタンを押して、再度 API をデプロイします。
これで、単純な HTTP リクエストが次のように弾かれるようになります。
$ curl https://abcde12345.execute-api.ap-northeast-1.amazonaws.com/prod/
{"message":"Forbidden"}
次に、API キーを作成して、使用量プラン(API ステージ)と関連づけます。
- API Gateway の 使用量プランメニューで、使用量プランを作成をクリックし、次のように作成します。- 名前: HELLO_API_PLAN
- スロットリング: OFF にするか適当に設定
- クォータ: OFF にするか適当に設定
 
- 名前: 
- 使用量プラン HELLO_API_PLANのページで、API ステージを追加をクリックし、次のように設定します。- API: hello-apiを選択
- ステージ: prodを選択
 
- API: 
- API Gateway の API キーメニューで、API キーの作成をクリックし、次のように作成します。- 名前: HELLO_API_KEY
- APIキー: 自動生成
 
- 名前: 
- API キー HELLO_API_KEYのページで、使用量プランに追加をクリックし、次のように設定します。- 使用量プラン: HELLO_API_PLAN
 
- 使用量プラン: 
これで、API キーを使って API を呼び出せるようになります。
$ API_KEY=jQjvIkSylW.......(省略).......Py6WFBxJMa
$ curl https://abcde12345.execute-api.ap-northeast-1.amazonaws.com/prod/ -H "X-API-KEY:$API_KEY"
"Hello from Lambda!"
できた! ٩(๑❛ᴗ❛๑)۶ わーぃ