見出し画像

AWS CDK + TypeScript で Lambda 関数をデプロイしてみた

 今までは TypeScript のボイラーテンプレートを生成できる Serverless Framework を使ってきましたが、AWS CDK とも仲良くなっていた方が TypeScript とも CloudFormation とも AWSそのものとも仲良くなれると思ったのでやってみることにしました💪

 Route 53 で触った時以来の CDK!

 ありがたいことに、公式の CDK Workshop にやりたいことが用意されていたので、それに沿ってやっていきます。

プロジェクトの作成

 (AWS CDK のインストールや使うための準備は終わっている前提です)

 上記 Workshop の Hello, CDK! セクションでは前セクションのプロジェクトを引き継いで行っていきますので、Hello,CDK! だけをやるための新規プロジェクトを作成します。

 任意のディレクトリで以下のコマンドを叩きプロジェクトを作成します。

cdk init -a example-cdk-hello-lambda -l typescript

 では VS Code で開きましょう。

code ./example-cdk-hello-lambda

Lambda 関数の準備

 言われるがまま lambda/hello.js というファイルを作成します。

画像1

 VS Code だとファイル名にディレクトリ名含めて作成できるので便利!

画像2

 作成したファイルを開き、下記のコードを入力します。API Gateway から来たリクエストに Hello と返す関数ですね。

exports.handler = async function (event) {
   console.log("request:", JSON.stringify(event, undefined, 2));
   return {
       statusCode: 200,
       headers: { "Content-Type": "text/plain" },
       body: `Hello, CDK! You've hit ${event.path}\n`
   };
};

 これにて Lambda にデプロイしたいコードの準備が完了しました。

CDKスタックにLambda 関数を追加する

 まずは依存パッケージをインストールします。
(これは -S か -D どっちが適切なんでしょうか? CDK だし -D? むしろ CDK だから -S ? 🤔)

npm install @aws-cdk/aws-lambda

 そしてプロジェクト作成時に自動生成されている lib/example-cdk-hello-lambda-stack.ts を以下のコードに書き換えます。

import * as cdk from "@aws-cdk/core";
import * as lambda from "@aws-cdk/aws-lambda";

export class ExampleCdkHelloLambdaStack extends cdk.Stack {
 constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
   super(scope, id, props);

   const hello = new lambda.Function(this, "HelloHandler", {
     runtime: lambda.Runtime.NODEJS_12_X,
     code: lambda.Code.fromAsset("lambda"),
     handler: "hello.handler",
   });
 }
}

 Workshop では NODEJS_10_X ですが、NODEJS_12_X にしています。

CloudFormation テンプレートを確認する

 以下のコマンドで CloudFormation テンプレートが標準出力されます。

cdk synth

 出力結果(一部抜粋)

HelloHandler:
   Type: AWS::Lambda::Function
   Properties:
     Code:
       S3Bucket:
          Ref: AssetParameters
      Handler: hello.handler
     Role:
       Fn::GetAtt:
         - HelloHandlerServiceRole
         - Arn
     Runtime: nodejs12.x

 用意したコードが zip 化され、S3にアップロードされて Lambda 関数としてデプロイされていることが分かりますね。さすがに zipfile にインラインで記述されることは無かった。

デプロイする

 それでは Lambda にデプロイしてみましょう。

cdk deploy

 コンソールなり CLI なりで確認すると Lambda 関数がデプロイされていることが確認できるはずです。

aws lambda list-functions

画像4

テストする

 テストイベントを設定しテストを実行してみると無事 API Gateway へ返却用の JSON 文字列が出力されました。

画像3

👏

まとめ

 AWS CDK を用いて Lambda 関数をデプロイすることができました。

 ここでは Lambda 関数だけのデプロイに留めましたが、Workshop の続きには API Gateway との繋ぎ込みがあります。後日やります👍

 Lambda 関数にデプロイするコードが JavaScript なので、このままでは TypeScript と仲良くなることは難しそうです。でも大丈夫。aws-lambda-nodejs module を使うことで、Lambda 関数も TypeScript で記述することができます。これも後日試してみます👍👍

 AWS CDK は単体テスト環境もプロジェクト生成時に構築されます。今回のやつのテストもどこかで書いてみようと思います。CDK で TDD は CloudFormation に慣れてないとめっちゃ手間取りそうな印象。


😉