Python Serverless Microframework for AWS(chalice)でAPI Key認証を設定する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Python Serverless Microframework for AWS(chalice)でAPI Key認証を設定してみました。基本的にはチュートリアル通りだったのですが、異なる手順で行った部分もあるので、改めて記事として書いておきたいと思います。

プロジェクト作成

ローカルにフォルダを作成して、まずはchaliceをインストールします。

$ mkdir chalice_auth
$ cd chalice_auth/
$ pyenv local 2.7.11
$ virtualenv venv
$ . venv/bin/activate
$ pip install chalice

次にプロジェクトを作成します(プロジェクト名は「auth_demo」としました)。

$ chalice new-project auth_demo && cd auth_demo

次からAPI Key認証を設定していきますが、AWSのクレデンシャルファイルの設定が済んでいない場合は、予め設定しておく必要があります。

API Key認証

プロジェクトを作成した際に「app.py」というファイルが出来ているので、そこに以下のメソッドを追加します。先ずは認証がないメソッドです。

@app.route('/authenticated', methods=['GET'])
def api_key_authenticated():
    return {"secure": True}

以下のコマンドでデプロイし、curlでGETできるかを試してみます。

$ chalice deploy

(中略)
Deploying to: dev
https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/

$ curl -i -X GET https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/authenticated

HTTP/1.1 200 OK
(中略)
{"secure": true}

無事にGETメソッドで取得できたようです。次にこのメソッドにAPI Key認証を追加します。

@app.route('/authenticated', methods=['GET'], api_key_required=True)
def api_key_authenticated():
    return {"secure": True}

「api_key_required=True」の定義を追加しました。以下のコマンドでデプロイし、先と同じcurlでGETできるかを試してみます。

$ chalice deploy

(中略)
Deploying to: dev
https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/

$ curl -i -X GET https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/authenticated

HTTP/1.1 403 Forbidden
(中略)
{"message":"Forbidden"}

403が返ってきました。API Gatewayをマネージドコンソールからみると、API Keyが必須となっている事が分かります。

chalice-api-key-gateway

curlで渡すためのAPI Keyを作成します。手順は以下のサイトを参考にしてください。

API Gateway で API キーを使用する

この記事を書いている時点では「使用量プラン」とAPI Keyを紐づける必要があるようなので、それも行います。「使用量プラン」画面にて「作成」ボタンを押下し、「スロットリング」「クォータ」を適宜設定します。

「関連付けられた API ステージ」画面で「APIステージの追加」ボタンを押下し、先に作った「auth_domo」APIを追加します。

chalice-api-key-add-api-stage

「使用量プランの API キー」画面で「APIキーを使用量プランに追加」ボタンを押下し、先に作った「auth-demo-key」API Keyを追加します。

chalice-api-key-add-plan

設定したAPI Keyを「x-api-key」ヘッダーで渡し、以下のcurlコマンドを実行します。

$ curl -i -X GET https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/authenticated \
--header 'x-api-key: 設定したAPIキー'

HTTP/1.1 200 OK
(中略)
{"secure": true}

API Keyを設定した上で取得できたようです。

参考サイト

Python Serverless Microframework for AWS
【新機能】Amazon API Gatewayに「使用量プラン」機能が追加。キーごとにスロットリングやリクエストの制限が可能に