しょーもない Lambda を 1 つだけ含むスタックを CDK でデプロイしてみたい。
$CDK_PROJ/lambda/hello/index.py
を作って以下のような内容にでもしてみる:
def lambda_handler(event, context): if 'message' in event: print(f'Hello, {event["message"]}') else: print(f'Hello, wo...') return { 'statusCode': 200, }
我ながらなかなか酷い。今んとこ TypeScript を使うのは CDK 用の DSL 部分だけという中途半端さ。
次にスタックの定義として $CDK_PROJ/lib/lambda_test-stack.ts
を
import { Stack, StackProps, Duration, aws_lambda as lambda } from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class LambdaTestStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new lambda.Function(this, 'HelloLambda', { functionName: 'Hello', runtime: lambda.Runtime.PYTHON_3_9, architecture: lambda.Architecture.X86_64, handler: 'index.lambda_handler', code: lambda.Code.fromAsset('./lambda/hello'), timeout: Duration.seconds(30) }); } }
としてみる。CDK v2 対応の記事を探すのも面倒くさいので、公式の API ドキュメント aws-cdk-lib.aws_lambda module · AWS CDK を参考に実装する。ランタイムやアーキテクチャはもっとさぼれるかもしれないが、一応明示的に指定してみた。これでスタックの定義は完成。
$ cdklocal deploy
...
✅ LambdaTestStack
✨ Deployment time: 5.83s
成功。$CDK_PROJ/cdk.out/LambdaTestStack.template.json
に CloudFormation としてのテンプレートが出力されているが、こういうのを見ると心が折れるし、CDK でゆるく IaC したいだけなので見ないことにする・・・。*1
$ awslocal lambda list-functions { "Functions": [ { "FunctionName": "Hello", "FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:Hello", ... "Architectures": [ "x86_64" ] } ] }
でちゃんとそれっぽい ARN が見えてるし、デプロイできたっぽい。bootstrap してない状態だったから不安だったが一応できたみたい。AWS Lambda Layers を使うと話は変わってきそうだが、そんな大それたものをこんなモック環境でやるものじゃないので気にしない。
*1:ちょっと見たら 300 行を超えていて心臓に悪かった。Vue や React の minify する前の邪悪な世界を見るかのようだ・・・。