Back
Featured image of post Chaliceを使ったAPI Gateway開発 - API Key(使用量プラン)による実行制限

Chaliceを使ったAPI Gateway開発 - API Key(使用量プラン)による実行制限

AWSが提供するPythonライブラリChaliceを利用したAPI開発

はじめに

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:

参考

comments powered by Disqus
yuu999
Built with Hugo
Theme Stack designed by Jimmy