「AWS Black Belt Online Seminar Dive Deep into AWS Chalice」の自分向けメモ
AWS Chaliceって何?......レベルの人向け
Chaliceとは
- Python製OSSサーバーレスアプリケーションフレームワーク
- API GatewayとLambdaを使用するアプリケーションを迅速に作成、デプロイすることが可能
使い方
スケルトンプロジェクトを作成
- chaliceをインストールする
- プロジェクトのひな型を作成
- .chalice:設定ファイルを配置
- requirements.txt:依存ライブラリを記述
- app.py:処理を記載
アプリケーション
- Chalicelibraryをインポート
- 起点となるアプリケーションオブジェクト生成
- ルートデコレータ:@app.route('/')でエンドポイントを設定
- デコレータへ渡した情報が呼び出し元のAPI Gatewayに渡される
- returnでレスポンスボディを返却する
デプロイ
コマンドを実行すると以下が自動実行される
- デプロイパッケージ作成
- IAMロールを設定
- Lambadaをデプロイ
- API Gateway作成
構成
- app.pyのコードはそのままLambadaコードになる
- デコレータのAPI Gatewayがトリガーとして設定される
- デコレータの設定が反映されてAPI Gatewayが作成される
- IAMポリシーの自動生成
- LambdaとCloudWatch Logsがデフォルトで付与されている
- 仮にDynamoDBを記述した場合はポリシーにDynamoDBの操作権限が付与される
- boto3.resource()は非対応
- サードパーティの定義も非対応
- 現状では試験的な機能
まとめ
- シンプルな実装でAPI Gateway + LambdaのAPIを定義可能
- 2つの関連性を別途管理する必要がなくなる
基本機能
リクエストハンドリング
URL Parameters
- 可変的なURLパスを定義可能
- パスによって、引数で処理分岐
HTTP Methods
- HTTPメソッドを明示してエンドポイントを定義可能
- メソッドごとに異なる関数を同一URLパスで定義可能
- 1つのURLに複数のメソッドを定義できない
Request Metadata
- app.current_request.~に文字列として、データが入っている
- ~.method
- HTTPメソッドを取得
- ~.headers
- HTTPヘッダーを取得
- dict互換
- 独自拡張クラスで大文字小文字区別なしにアクセス可能
- リードオンリー
- ~.query_params
- クエリストリングを取得
- dictとして格納
- 同じキー名の場合は、後勝ち
- ~.uri_params
- urlパスを取得
- dictとして格納
- 仮引数と同じ値
- ~.raw_body
- リクエストボディを取得
- byte型で格納
- ~.json_body
- リクエストボディをJSON形式で取得
- JSON型文字列で格納
- ~.method
レスポンスハンドリング
Custom HTTP Response
- 暗黙的には200 OKで返却
- Response()で定義した内容でレスポンスを返却できる
- エラーを返却することも可能
- 任意のメッセージを生成できる
Error HTTP Response
- 任意のエラーを返す例外クラスをraiseする
他機能
認証認可
- IAM、Cognitoと容易に連携
- 独自認証実装とも連携可能
- CORSサポート
- GZIP圧縮によるレスポンス可能
- Blueprints ← インタフェースが変わる可能性がある
他サービスとの連携
- デコレータに以下を設定することが可能
- CloudWatch Events
- S3
- SQS
- SNS
Local Modeローカルモード
- デプロイせずともローカルで起動可能
実践的開発プロセス
ユニットテスト
テストプロジェクトを作成
- pytestのchaliceプラグインを使って記述する
- 任意のプロジェクトを引数にtestsディレクトリを作成
- test_app.py:テストを記述
- pytestchaliceをインストール
記述
- pytest -vv コマンドを実行
- テスト用のclientでリクエストを投げる
- assertでresponse.status_codeを確認
CI/CD
Source
- ロジック実装
- テスト実装
- ブランチ管理
- プルリク
- ピアレビュー
Test
- py.testでユニットテスト
- Flake8でLintチェック
- mypyで静的型チェック
Packgae
- デプロイパッケージ作成
- S3にアップロード
deploy
- CloudFormation
- chalice deployをチーム開発で利用は非推奨
- chalice package を利用する
CI/CDテンプレート
- generate-pipelineでCloudFormation templateを生成可能(builldspec.yml)
- -bオプションでymlを出力し、構成を管理できる
- ymlをコードコミットにpullするとパイプラインが流れてデプロイ