API Gateway で API キーを設定する
API Gateway の REST API では API キーを設定できます。今回は Serverless Framework を使って API キーを設定する方法を説明します。
前提
以下の前提で説明を進めます。
- Serverless Framework インストール済み
- バージョン 2.29.0、AWS のアカウント設定済み、Lambda で使用する言語は Python 3.8
API キーの設定
API Gateway の REST API で API キーを使用できるように設定していきます。
ちなみに、HTTP API では API キーは使用できませんので、API キーを使用したい場合は REST API を使用することになります。
Serverless Framework の serverless.yml の provider
に以下のような設定を追加してください。
provider:
# 他の設定は省略
apiGateway:
shouldStartNameWithService: true
apiKeys:
- myFirstKey
provider.apiGateway.shouldStartNameWithService
は、Serverless Framework の deprecations への対応です(参考)。API キーの設定とは関係ないので、無視していいです。
API キーに関する設定はprovider.apiGateway.apiKeys
になります。ここでは、myFirstKey
というキーを設定しています。
次に functions
に以下のような設定を追加してください。
functions:
hello:
handler: handler.hello
events:
- http:
path: /hello
method: get
private: true
今回は API Gateway の REST API を使用するため、events
にはhttp
を指定します。
private: true
という設定をすることで、この API で API キーを使用できるようになります。
また、API のコードは、{"message": "Hello"}
という JSON を返す簡易的なものです。
この状態でデプロイします。
$ sls deploy
デプロイ完了した際に、以下のようにapi keys
が出力されます。
api keys:
myFirstKey: <ランダムな英数字>
myFirstKey
は severless.yml の provider
で指定した API キーの名称で、値は自動生成されます。
API キーの動作確認
API キーが有効になっているか検証していきます。
デプロイした API に、まずは API キーをセットせずにリクエストします。
$ curl -XGET 'https://[YOUR-APIGATEWAY-ID].execute-api.ap-northeast-1.amazonaws.com/dev/hello'
{"message":"Forbidden"}
Forbidden が返って来たので、想定通りアクセスが拒否されました。
次に、API キーをセットしてリクエストします。
API Gateway で API キーをセットする場合は、x-api-key
ヘッダーにセットします。
x-api-key
をセットして、リクエストします。
$ curl -XGET -H 'x-api-key: [YOUR-API-KEY]' 'https://[YOUR-APIGATEWAY-ID].execute-api.ap-northeast-1.amazonaws.com/dev/hello'
{"message": "Hello"}
今度はアクセス拒否されず、正常にレスポンスが返ってきました。
API キーの値を固定する設定
Serverless Framework を使って、API キーを設定できました。しかし、デプロイしないと値がわからないのは使い勝手が悪いケースもあります。
そのため、事前に API キーの値も含めて設定する方法が以下になります。
provider:
# 他の設定は省略
apiGateway:
shouldStartNameWithService: true
apiKeys:
- name: myAPIKey
value: apikey1234abcdefghij0123456789
value を指定することで、実際に API キーの値を固定できます。注意点として、API キーは 30〜128 文字の英数字の文字列で指定してください(AWS のマニュアル参照)。
API キーの使用について
API Gateway の REST API であれば、API キーが簡単に設定でき、簡易的なアクセス制限に使えます。今回は割愛してますが、usagePlan
を設定することで API の使用量の制限もできます。
ただし、API キーはセキュリティの関係上、API 認証の唯一の手段にはしないでください。認証をしたい場合は、Lambda オーソライザーなど別の認証も使用するようにしてください。
おまけ
今回使用したコードは以下の Github リポジトリにアップしているので、全体のコードを確認したい方はそちらを見てください(http フォルダ配下が今回のコードです)。
Discussion