CDKをどちらもTypeScriptで書いてみました。Lambda関数のコードをTypeScriptで書いてCDKでデプロイするまでは思ったよりも色々と考慮すべきポイントがあったので、今回はデプロイまでの手順とポイントについてまとめたいと思います。最終的なディレクトリ構造この記事の通りに進めると、最終的には以下のようなディレクトリ構造が出来上がります。CDKプロジェクトを作成します。aws-cdkがインストールされていない場合はこちらを参考にインストールしておきましょう。typescriptLambda関数のコンストラクタを作成lib/constructors/lambda.tsを作成し、以下のようにLambdaの定義を記述します。この定義によって、以下のリソースが作成されます。}}上記のコードの中では、Lambdaレイヤーの定義前後でnpmパッケージのインストールを行なっています。そのため、パッケージをインストールする処理(process/setup.ts)、インストールしたパッケージを削除する処理(process/cleanup.ts)も以下のようにそれぞれ追加します。fs.removeSync(NODE_LAMBDA_LAYER_DIR);};さらに、setup.tsとcleanup.tsでは追加のパッケージが必要になるので、CDKプロジェクトのルートディレクトリで、以下のようにパッケージをインストールします。@types/fs-extraLambda構築時のポイントここでのポイントは以下の点になるかと考えています。NodejsFunctionを使用するレイヤーに含まれるライブラリはLambda関数にバンドルしないようにするnode_modulesはレイヤー化するnpmパッケージを使用しているLambda関数をCDKでデプロイすると、node_modulesもそのままLambdaに入ってしまいます。パッケージの量によっては、Lambdaのブラウザ上のエディタからコードが見れなくなってしまうこともあります。これを避けるために、node_modules内にインストールされているパッケージはLambdaレイヤー化し、Lambda関数にバンドルしない(後述)ようにしておきます。レイヤーはデプロイするとき毎回最新の状態にしておきたいので、CDKでレイヤーを定義する前に、Lambda用のpackage.jsonからnode_modulesにインストールする処理を入れています。(process/setup.ts)ちなみに、node_modulesをレイヤー化する際には{レイヤーに指定するディレクトリ}/nodejs/node_modulesというようなディレクトリ構造にしなければいけないので、ご注意ください。node_modulesのレイヤー化にあたっては、以下の記事を参考にしました。Package」エラーを解決するLambda関数の作成にはNodejsFunctionを使用するTypeScriptでLambda関数のコードを記述したときには、NodejsFunctionを使用するとLambda関数を楽に定義することができます。Lambda関数を作成できるクラスには@aws-cdk-lib/aws_lambdaのFunctionもありますが、こちらはTypeScriptをトランスパイルする処理を自前で用意したりする必要があります。レイヤーに含まれるライブラリはLambdaにバンドルしないようにするNodejsFunctionの定義で、レイヤーに含まれるパッケージはLambda関数にバンドルされる対象から除外するように定義することができます。以下のように書くことで除外することが可能です。},Lambda関数のコードを作成ルートからlambdaディレクトリを作成し、lambda/index.tsにデプロイするLambda関数の処理を書いていきます。今回はTypeScriptで作っており、サンプルのコードは以下のようにします。内容としては、Lambdaで受け取ったイベントをDynamoDBに保存するというシンプルなものです。client.send(command);};注意点としては、handlerという名前の関数をexportしておく必要があります。こちらの関数名は先ほどCDKで宣言していた、Lambda関数のハンドラー名と同じ名前になります。Lambdaディレクトリ内でnpmパッケージをインストールLambda関数のみで必要とするnpmパッケージをまとめるため、ルートディレクトリにあるpackage.jsonとは別に、lambdaディレクトリ内でもpackage.jsonを作っておきます。initをして、パッケージ名などを適当に入力します。initLambda関数のコードではDynamoDBのSDKを使っているので、以下のパッケージをlambdaディレクトリ配下でインストールしておきましょう。必須ではないですが、devDependenciesで以下の型を追加で入れておくとNode.js用の型定義などを補完することができます。@types/nodeDynamoDBテーブルのコンストラクタ作成テスト用のDynamoDBテーブルもlib/constructors/dynamodb.tsに以下のように定義をしておきます。}}スタックの作成Lambda関数とDynamoDBのコンストラクタを使用して、lib/lambda-typescript-cdk-stack.tsに以下のようにスタックを定義します。bootstrapを実行しておきます。bootstrapそれでは、CDKプロジェクトのルートディレクトリに移動し、デプロイを実施してみます。実際にLambdaを動かして動作を確認してみます。対象のLambda関数でテストイベントを作成し、(Idはパーティションキーに指定しているため)Idのフィールドを含む適当なJSONを入力します。テストイベントを実行して、処理が成功していることを確認します。CDKでデプロイすることができました。CDKもLambdaも全てTypeScriptで書いてみたいと思い軽い気持ちでやってみたところ、想像よりも考慮する事項が多かったため、今回記事として要点をまとめてみました。ウェブサービス株式会社(DWS)公式ブログ記事URLをコピーしました。