はじめに
Chaliceで作成したAPI Gatewayへのアクセスを、API Keyで制限する方法を紹介します。
今回、制限の設定はWebコンソールにて実施しましたが、Terraformなどと連携させることでCLIのみで完結させることができるかもしれません。
なお、Chaliceとは、LambdaとAPI Gatewayを手軽にdeployするためのPythonライブラリです。
主に以下の特徴があります。
- アプリの作成、デプロイ、管理のためのコマンドツール
- Pythonプログラマに馴染みのあるMicroframework
- 自動的にIAM policyを生成
動作環境
OS: Windows10
python: 3.7.9 (pyenv)
AWS CLIおよび認証情報~/.aws
は設定済み
プロジェクト作成
Chalice用環境の構築
- Pythonの設定
$ mkdir sample
$ cd sample
$ python -m venv .venv37
$ ./.venv37/Scripts/activate
$ python -V
Python 3.7.9
(.venv37)
- Chaliceのインストール
pip install chalice
$ chalice --help
Usage: chalice [OPTIONS] COMMAND [ARGS]...
Chaliceプロジェクト作成
$ chalice new-project sample-api-key-test
$ cd sample-api-key-test
$ ls ./
__pycache__/ app.py requirements.txt
プロジェクトを作成すると以下のようなapp.py
が生成されます。
今回はこのデフォルトのコードに/sample
リソースを追加します。
from chalice import Chalice
app = Chalice(app_name='sample-api-key-test')
@app.route('/')
def index():
return {'hello': 'world'}
@app.route('/sample', methods=['GET'], api_key_required=True) # add
def sample():
return {'API-KEY': True}
/
リソースはAPIキーなど認証不要、/sample
リソースはAPI Keyを必須としてみます。
プロジェクトのデプロイ
$ chalice deploy
Creating deployment package.
Updating policy for IAM role: sample-api-key-test-dev
Updating lambda function: sample-api-key-test-dev
Updating rest API
Resources deployed:
- Lambda ARN: arn:aws:lambda:us-east-1:<account_id>:function:sample-api-key-test-dev
- Rest API URL: https://o18652381e.execute-api.us-east-1.amazonaws.com/api/
デプロイが完了すると作成されたLambdaのArnとAPIのエンドポイントが出力されます。
このエンドポイントに対してAPIを実行してみます。
# / へのアクセスはフリーなので結果が返ってくる
$ curl https://o18652381e.execute-api.us-east-1.amazonaws.com/api/
{"hello":"world"}
# /sample はAPI Keyを必須としているので403 Forbiddenとなり、APIの実行を拒否される
$ curl https://o18652381e.execute-api.us-east-1.amazonaws.com/api/sample/
{"message":"Forbidden"}
Pythonコード内のapi_key_required=True
を指定したリソースは実行拒否されることが確認できます。
そのため、別途API Keyを作成します。
API Keyの設定
API Keyを必須にしたリソースへキーなしでアクセスすると当然ながら実行拒否されます。
そこで、API Keyを作成します。なお、ここではAWS Webコンソールにて作成します。
API Gatewayにて作成したAPI(ここでは、sample-api-key-test
)を選択します。
サイドバーから「使用量プラン」を選択します。
プランの作成から任意の名前で使用量プランを作成します。その際、スロットリングやクォータの制限等はここでは設けません。
作成後にAPIとの紐づけを行います。「APIステージの追加」から先ほど作成したAPIとステージを追加します。
次にAPIキーを作成し、使用量プランとの紐づけを行います。
「アクション→APIキーの作成」を選択し、任意の名前で作成します。その後、「使用量プランに追加」から作成した使用量プランを追加します。
APIキーの設定は以上になります。
APIキーを控えて、APIを実行してみます。
$ curl -H 'x-api-key:mzv5dpDGWn1m8(snip)' https://o18652381e.execute-api.us-east-1.amazonaws.com/api/sample/
{"API-KEY":true}
Pythonコード内で返り値として指定した値が返ってくることが確認できます。
これでAPI Keyによる実行制限をかけることが出来そうです :laughing: