code Recipes

PythonでCDKを使ってLambda・APIGatewayスタックの作成Tip

Introduction

PythonでAWS CDKでLambda,APIGatewayのスタックを作成

TL;DR

  • CDKでLambda・APIGatewayのスタックを作成しデプロイ・検証
  • Python
  • CloudFormationテンプレートを作成しSAM CLIでローカルで検証

github repo

'https://github.com/sintaro/CDKLambdaAPIGateway'

前提

事前にcdkをインストール済み

cdkのインストール
$ npm install -g aws-cdk

CDKでPython環境を構築しLambdaとAPIGatewayをインストール

空フォルダで作成する必要があるので作成しCDK cliでpython環境を構築

cdk
$ mkdir LambdaAPIGatewaySample
$ cd LambdaAPIGatewaySample
$ cdk init --language=python

今回LambdaとAPIGatewayをcdkからインストールするので,setup.pyに追記

setup.py
...
install_requires=[
"aws-cdk.core==1.32.1",
"aws-cdk.aws-lambda", #追加
"aws-cdk.aws-apigateway", #追記
],
...

CDK initで作成された仮想環境で下記を実行

$ source .venv/bin/activate
$ pip install -r requirements.txt

Lambda関数作成

$ mkdir lambda
$ touch lambda/api.py

作成したapi.pyを実装

api.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'
}

Stackを追加

CDKでスタックを指定している/lambda_api_gateway_sample/lambda_api_gateway_sample_stack.pyを下記に編集

lambda_api_gateway_sample_stack.py
from aws_cdk import (
aws_lambda,
aws_apigateway,
core
)
class LambdaApiGatewaySampleStack(core.Stack): #このClass名は各自の環境で変わるので注意
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
handler = aws_lambda.Function(
self, "cdk-lambda-apigateway",
runtime=aws_lambda.Runtime.PYTHON_3_7,
handler="api.main",
code=aws_lambda.AssetCode(path="./lambda"))
api = aws_apigateway.LambdaRestApi(self, "LambdawithAPIGateway", handler=handler) #第二引数のAPIGatewayの命名は

保存したらDeployしてみましょう.cdk deploy成功するとこんな感じ

✅ lambda-api-gateway-sample
Outputs:
lambda-api-gateway-sample.LambdawithAPIGatewayEndpoint84F1A697 = https://xxxxxxx.execute-api.us-east-1.amazonaws.com/prod/
Stack ARN:
arn:aws:cloudformation:us-east-1:xxxxxxxxxxxx:stack/lambda-api-gateway-sample/xxxxxxxxxxxxxxxxxx

検証

curlでdeploy後のEndpointにリクエストをしHello worldで検証完了です。

$ curl https://xxxxxxxx.execute-api.us-east-1.amazonaws.com/prod
Hello World

気になるのが、CFnで書いた時の比較ですが、テンプレートファイルは下記で作成できます。400行近くのymlファイルが20行程のPythonファイルで生成されるので便利ですね。

$ cdk synth --no-staging > template.yml

また、生成されたCFnのテンプレートファイルとSAM CLIで作成した環境をローカルで検証することができます。

$ sam local start-api -t template.yml
Edit this page on GitHub