🌟

API Gateway で API キーを設定する

2021/05/08に公開

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 に以下のような設定を追加してください。

serverless.yml
provider:
  # 他の設定は省略
  apiGateway:
    shouldStartNameWithService: true
    apiKeys:
      - myFirstKey

provider.apiGateway.shouldStartNameWithServiceは、Serverless Framework の deprecations への対応です(参考)。API キーの設定とは関係ないので、無視していいです。

API キーに関する設定はprovider.apiGateway.apiKeysになります。ここでは、myFirstKey というキーを設定しています。

次に functions に以下のような設定を追加してください。

serverless.yml
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 フォルダ配下が今回のコードです)。
https://github.com/ombran/serverless-sample/tree/main/http

Discussion