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 というファイルを作成します。
VS Code だとファイル名にディレクトリ名含めて作成できるので便利!
作成したファイルを開き、下記のコードを入力します。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
テストする
テストイベントを設定しテストを実行してみると無事 API Gateway へ返却用の JSON 文字列が出力されました。
👏
まとめ
AWS CDK を用いて Lambda 関数をデプロイすることができました。
ここでは Lambda 関数だけのデプロイに留めましたが、Workshop の続きには API Gateway との繋ぎ込みがあります。後日やります👍
Lambda 関数にデプロイするコードが JavaScript なので、このままでは TypeScript と仲良くなることは難しそうです。でも大丈夫。aws-lambda-nodejs module を使うことで、Lambda 関数も TypeScript で記述することができます。これも後日試してみます👍👍
AWS CDK は単体テスト環境もプロジェクト生成時に構築されます。今回のやつのテストもどこかで書いてみようと思います。CDK で TDD は CloudFormation に慣れてないとめっちゃ手間取りそうな印象。
😉