TypeScriptの事例が多いため、Pythonで試してみた際の備忘録。
概要
- Python実装のLambda処理をAPI Gateway経由で公開するサンプル。
感想
- TypeScript比較
- 依存ライブラリは
setup.py
に追記する(npm install --save
と異なり、直接ファイルに記述)。 - ビルドのステップがないため、基本操作はサクサク進む(一方で型チェックの弱さはデメリット)。
-
cdk init
で生成されるリポジトリに.gitignore
が含まれない現象に遭遇。以下をベースに別途ファイルを追加(language=typescript
の場合には発生しない模様)。
- 依存ライブラリは
- 全般
- TypeScriptの型情報に基づくコード補完機能が強力なため、これを失ってでもPythonで書きたいほどの強い理由は感じない。一方、Lambdaなどの実装コードもPythonで実装した上で、Infra(CDK)も合わせて言語統一的にソース管理するのであればメリットがあるかもしれない。
手順
動作確認に用いた手順。
前提
$ npm install -g aws-cdk
$ cdk --version
1.19.0 (build 5597bbe)
cdk-init
でアプリケーションを初期化。また、source
コマンドでvirtualenv
を有効化しておく。
$ mkdir lambda-sample && cd $_
$ cdk init --language=python
$ source .env/bin/activate
setup.py
依存ライブラリの定義(デフォルトでは、aws-cdk.core
しか存在しないため、aws-lambda
とaws-apigateway
を追加)。
...
install_requires=[
"aws-cdk.core",
"aws-cdk.aws-lambda",
"aws-cdk.aws-apigateway",
],
...
定義に基づいて依存ライブラリをインストール。
$ pip install -r requirements.txt
実装
スクリプトの実装。
$ mkdir lambda
$ touch lambda/handler.py
lambdahandler.py
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def main(event, context):
logger.info(json.dumps(event))
return {
'statusCode': 200,
'body': 'Hello World'
}
lamba_sample/lambda_sample.py
LambdaとAPI Gatewayのデプロイ定義をStackに追加。
from aws_cdk import (
aws_lambda,
aws_apigateway,
core
)
class LambdaSampleStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
handler = aws_lambda.Function(
self, "backend",
runtime=aws_lambda.Runtime.PYTHON_3_7,
handler="handler.main",
code=aws_lambda.AssetCode(path="./lambda"))
api = aws_apigateway.LambdaRestApi(self, "SampleLambda", handler=handler)
定義したスタックをデプロイ。Outputs
の欄に出力されるAPI GatewayのEndpointを呼ぶとLambaの出力結果が返却される。
$ cdk deploy
...
Outputs:
lambda-sample.SampleLambdaEndpoint9FAA5D96 = https://4rtjc3pjfh.execute-api.ap-northeast-1.amazonaws.com/prod/
$ curl https://4rtjc3pjfh.execute-api.ap-northeast-1.amazonaws.com/prod/
Hello World