KotlinのローカルAWS Lambdaをデバッグ実行しました。


お疲れ様です。@naokiurです。
最近の業務中は、AWS Lambdaを構築しております。

業務中はPythonで書いているのですが、
前々から興味のあるKotlinでもやりたいなあと思い、
AWS Toolkit for Intellijを用いて、
ローカルでデバッグ実行できるように、
準備しました。

AWS Toolkitプラグインを導入している場合、
AWS Serverless Applicationプロジェクトを作ることができるのですが、
どんなKotlinプロジェクトの場合でもLambdaを作成することができるようになるために、
なんの変哲もないKotlinプロジェクト上で、
準備しました。

環境

  • MacBook Pro (Retina 13-inch、Early 2015)
  • Java 1.8.0_191
  • IntelliJ IDEA CE 2019.1.3
  • SAM CLI 0.14.2

実施したこと

  • なんの変哲もないKotlinプロジェクトを用意する
  • AWS SUM CLIで雛形を生成する
  • Kotlin・Lambdaの構成を整える
  • Runnerを作成する
  • 実行!

なんの変哲もないKotlinプロジェクトを用意する

なんの変哲もないKotlinプロジェクトを作成します。

なんの変哲もないですね。

AWS SUM CLIで雛形を生成する

AWS Toolkitプラグインは、 AWS SAM CLIを前提としているので、
インストールされていると思います。

せっかくなので、AWS SAM CLIに雛形を作成してもらいます。

sam init -r java8 -d gradle

Kotlin・Lambdaの構成を整える

ソース移動

作成してもらった雛形の以下ファイルを、
任意のパッケージに移動します。

  • App.java
  • GatewayResponse.java

依存性追加

ライブラリの依存関係をgradleファイルに追加します。

gradle.build
dependencies {
    implementation "com.amazonaws:aws-lambda-java-core:1.2.0" // 追加
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

ありがたいことにIntellijが教えてくれるので、
import changeをします。

Kotlin変換

移動したファイルをKotlinコードに変換します。
こちらもありがたいことにIntellijがやってくれます。

自分が試した際、App.ktでコンパイルエラーが発生しまっていたので、こちらを修正しました。
* return br.lines().collect<String, *>(Collectors.joining(System.lineSeparator()))
* return br.lines().collect(Collectors.joining(System.lineSeparator()))

Runnerを作成する

Lambda実行用のRunnerを作成します。

Handlerには変換したAppクラスを指定します。

実行!

デバッグ実行します。

ブレークポイントで止まりました!!

これでKotlinでも、
ローカルでLambda開発ができますね!

結果

  • Kotlinで書かれたLambdaを、ローカルでデバッグ実行することができました。

今後

  • デプロイできるかをまだ試せてないので、試していきたいと思います。
  • テストコードを書けるようになっていきたいと思います。