🅰️

Lambda と API Gw を連携させ API Key を設定する

2024/06/05に公開

前回、EC2 を起動/停止/状態確認を行う Lambda Function を作成しました。

https://zenn.dev/ndjndj/articles/e323a35115a8f8

今回はこの Lambda Function を API Key が設定された API にし、外部から Lambda Function を起動できるようにします。
また、上記の Lambda ではなくても API 化できるので参考になればと思います。

流れ

  • API を作成する
    • API Gateway から REST API を作成
    • リソースを作成
    • メソッドを作成して Lambda と連携する
    • テストする
    • デプロイする
    • テストする
  • API Key を設定する
    • API Key を作成する
    • 使用量プランを作成する
    • 使用量プランに作成した API Key を関連付ける
    • 使用量プランに作成した API ステージを関連付ける
    • API Key を有効にしたいメソッドの API キーを有効にする
  • 動作確認する

API を作成する

API Gateway から REST API を作成

まずは API Gateway から新規 API を作成していきます。

REST API を選択して「構築」します。

「新しい API」を選択して入力事項を埋めます。

こんな感じでエンドポイントの一覧画面(最初はなにもないけど)が表示されればとりあえず OK です。

リソースを作成

つぎにリソースを作成します。
今回は EC2 を操作する Lambda Function を API 化するので、ec2 としておきます。

「リソースを作成」します。

リソース名を入力します。CORS 設定はとりあえず必要ないです。

メソッドを作成

リソースの作成が完了したら、メソッドを作成します。

詳細を入力する画面に移動するので、入力事項を埋めていきます。
メソッドは GET メソッドとしていますが、用途に合わせて変更してください。
また、注意点として、Lambda プロキシ統合にチェックを入れることと、API 化した Lambda Function をここで指定することです。

Lambda プロキシ統合は APIs Gateway と Lambda の間でリクエストとレスポンスのフォーマットを統合する仕組みで、設定しない場合は細かく設定する必要があるらしい・・・
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html

他に設定項目がいくつかあると思いますがそのままで大丈夫です。API Key を有効にするオプションがあるかもしれませんが、とりあえず動作確認がしやすいようにここでは設定せず、あとで設定します。

テストする

とりあえずデプロイ(公開)せずにテストしてみます。

下部にレスポンスが表示されるので、期待する結果かどうか確認してください。

デプロイする

API を公開していきます。

「API をデプロイ」します。

ステージを選択するダイアログが表示されるのでデプロイするステージを選択してください。
ステージが一つもない場合は「新しいステージ」を選択して 「v1」 とか 「v2」 とか 「dev」 とかステージを作ってください。

API のデプロイに成功したら呼び出せるようになります。

テストする

「URL を呼び出す」から API のエンドポイントをコピーして、API クライアントなり cURL などでテストします。GET メソッドならブラウザのアドレスバーに入力すれば確認できます。

期待する結果が返ってくればデプロイは成功です。

API Key を設定する

続いて、API Key を作成し、先ほどデプロイした API に API Key を設定していきます。
API に API Key を設定するには、API Key が設定された使用量プランを作成し、その使用量プランに API をアタッチするイメージです。

API Key を作成する

API Gateway のナビゲーションペインから 「API キー」を選択し、「API キーを作成」します。

入力事項を埋めます。なお、キーは自動生成しています。

作成できたらこんな感じです。

使用量プランを作成する

続いて使用量プランを作成します。
API Gateway のナビゲーションペインから 「使用量プラン」を選択し、「使用量プランを作成」します。

入力事項を埋めます。
スロットリング(1秒あたりリクエスト回数と同時リクエスト数)とクオータ(期間あたりのリクエスト回数)に関しては自由に入力してください。

使用量プランに作成した API Key を関連付ける

作成すると使用量プランの一覧画面に戻るので、作成した使用量プランを選択してください。

API Key を関連づけます。
「関連付けられた API キー」タブを選択して、API キーを追加します。

先ほど作成したキーを選択します。

使用量プランに作成した API ステージを関連付ける

続いて API ステージを関連付けます。
「関連付けられたステージ」タブを選択して、ステージを追加します。

先ほど作成したステージを選択します。

API Key を有効にしたいメソッドの API キーを有効にする

API のリソース一覧画面に戻り、API キーを有効にしたいエンドポイントのメソッドを選択します。
「編集」から 「API キーは必須です」にチェックを入れます。

保存後、再度 API を先ほど使用量プランで関連付けたステージにデプロイします。

動作確認する

いよいよ動作確認です。
API キーを指定しない場合に、forbidden エラーが返ってきて、指定した場合に期待する結果が返ってくれば成功です。
cURL や API クライアントが必要です。
Windows なら cURL がコマンドプロンプトから利用できるはずです(Mac もあったはず)。

指定しない場合

cURL -X GET https://archl0jl7h.execute-api.ap-northeast-1.amazonaws.com/dev/ec2
# {"message":"Forbidden"}

指定した場合

cURL -X GET https://xxxxxx -H "x-api-key:xxxxxxxxxxxxxxxxxxxxxxx"
# 期待する結果

さいごに

今回は検証用サーバーを ON/OFF する Function でしたが、キーといっても安全とはみなされないのでセキュリティ目的でつかうなら多分オーソライザーとか使うべきです。

https://cloud.google.com/endpoints/docs/openapi/when-why-api-key?hl=ja

参考

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-usage-plans.html
https://apidog.com/jp/blog/api-endpoint-and-its-testing/
https://cloud.google.com/endpoints/docs/openapi/when-why-api-key?hl=ja

Discussion