
Amazon API GatewayでAPIキー認証を設定する
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ども、大瀧です。
AWS Summit NewYorkで発表&リリースされたAmazon API Gatewayをいろいろ触っています。API Gatewayの機能の一つとして、認証機構の追加があります。今回はAPI Gatewayがサポートする認証の一つとして、APIキー認証を紹介してみます。
APIキー認証とは
API GatewayのAPIキー認証は非常にシンプルで、所定のキー(文字列)を所定HTTPヘッダ(x-api-keyヘッダ)に含めたリクエストであればアクセス許可、無ければアクセス拒否とする機能です。
APIキーは、API Gatewayで生成・管理されるようになっており、セキュアな運用が可能です。
前提の構成
以下の記事のセットアップが完了している状態です。
greetリソースのGETメソッドにLambdaバックエンドで{"message":"Hello from AWS Lambda!"}レスポンスが返ってくる、シンプルな構成です。MyTestStageステージでデプロイしているので、以下のエンドポイントにアクセスします。
https://XXXXXXXXX.execute-api.us-east-1.amazonaws.com/MyTestStage/greet

では、このエンドポイントにAPIキー認証を追加してみます。
APIキーの生成
API GatewayではAPIキーを生成して管理する機能があります。API Gatewayの管理画面のメニューから[APIs] - [API Keys]をクリックします。

[Create API Key]をクリックし、任意のキー名(今回は「My api key」)を入力、[Enabled]のチェックをオンにして[Save]ボタンをクリックします。

これでAPIキーが生成され、[API key]で確認できます。まだこの状態では、ステージ(API Gatewayのエンドポイントに紐付く単位)に関連付けされていないため、[API Stage Association]でAPI(今回は「HelloApiGateway」)とStage(今回は「MyTestStage」)を選択し、[Add]ボタンをクリックします。

以下のようになっていればOKです。

APIキー認証の有効化
では、APIキー認証を有効化しましょう。APIキー認証は、メソッド毎の実行設定(Method Execution)のMethod Requestのオプションで設定します。メニューの[APIs]からAPI「HelloApiGateway」を選択、画面左のResourcesから/-/greet-GETをクリックし、[Method Request]リンクをクリックします。

[API Key Required]は既定でfalseなので、右にある鉛筆アイコンをクリックしてtrueに変更、チェックのアイコンをクリックして決定します。

Method Executionの設定は、ステージを更新(Deploy)してエンドポイントに反映します。左上の[Deploy API]ボタンをクリックし、ステージを選択、[Deploy]ボタンで実行します。

これで反映されました。
動作確認
では、実際にエンドポイントにアクセスして動作を確認してみましょう。今回はコマンドラインツールのcurlコマンドを利用します。まずは、APIキーなしでアクセスしてみます。
$ curl https://XXXXXXXXX.execute-api.us-east-1.amazonaws.com/MyTestStage/greet
{"message": "Not able to access resource."}
$
エラーメッセージが返ってきていますね。では、APIキーを付与したリクエストで再度アクセスしてみましょう。API GatewayのAPIキーは、リクエストヘッダx-api-keyでkey:<キー文字列>の形式で指定します。
$ curl https://XXXXXXXXX.execute-api.us-east-1.amazonaws.com/MyTestStage/greet \
--header 'x-api-key:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
{"message":"Hello from AWS Lambda!"}
$
レスポンスが返ってきました!
まとめ
API GatewayでのAPIキー認証を試してみました。認証機構のないAPIサービスに後付けでセキュア認証を取り入れる、有効な利用方法だと思います。







