この記事は公開されてから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が必須となっている事が分かります。
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に「使用量プラン」機能が追加。キーごとにスロットリングやリクエストの制限が可能に