LoginSignup
1
5

More than 3 years have passed since last update.

AWS CDK - Lambda + API Gateway (Python)

Last updated at Posted at 2019-12-27

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-lambdaaws-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

参考

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5