Python Serverless Microframework for AWS(chalice)でAPI Key認証を設定する
はじめに
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が必須となっている事が分かります。
curlで渡すためのAPI Keyを作成します。手順は以下のサイトを参考にしてください。
この記事を書いている時点では「使用量プラン」とAPI Keyを紐づける必要があるようなので、それも行います。「使用量プラン」画面にて「作成」ボタンを押下し、「スロットリング」「クォータ」を適宜設定します。
「関連付けられた API ステージ」画面で「APIステージの追加」ボタンを押下し、先に作った「auth_domo」APIを追加します。
「使用量プランの API キー」画面で「APIキーを使用量プランに追加」ボタンを押下し、先に作った「auth-demo-key」API Keyを追加します。
設定した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に「使用量プラン」機能が追加。キーごとにスロットリングやリクエストの制限が可能に