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!"
できた! ٩(๑❛ᴗ❛๑)۶ わーぃ