AWS Toolkit for JetBrains(IntelliJ)を使ってJava8(Gradle)のサーバーレスアプリケーション開発を始める

事業開発部の野村です。令和の時代、楽しみですね。

はじめに

AWS ToolkitとSAM(AWS Serverless Application Model)を使うと、IDE上で効率的にAWSのサーバーレスアプリケーション開発・デプロイが実行できます。

AWS Toolkit for JetBrainsのバージョン1.2アップデートに伴い、Java8のMaven, GradleプロジェクトによるLambda関数の実装が可能となりました。以下の公式ブログではMavenを使った開発方法を紹介しています。

私からは Gradle を使った開発方法についてお伝えします。

事前準備

開発環境に必要なもの

以下を事前に開発環境にインストールします。

AWS Toolkit のインストールや基本的な使い方

下記の弊社ブログで、AWS Toolkit for JetBrainsのインストールやIntelliJでの使い方がまとまっています。ぜひ参考にしてください。

AWS Toolkit for JetBrainsをインストールしてIDEからサーバレスアプリケーションをデプロイしてみる #reinvent

上記参考に、Preferences -> Plugins から AWS Toolkit のプラグインをインストールします。

Java8 + Gradleプロジェクト開発

AWS ToolkitプラグインをIntelliJにインストールしたら、いよいよ開発スタートです。

プロジェクト作成

File -> New -> Project から、AWS Serverless Application を選択します。

  • Runtime : java8
  • SAM Template : AWS SAM Hello World (Gradle)
  • Project SDK : 開発環境にインストールしたJava8のSDKを選択

プロジェクト作成後、以下のファイルが確認できます。(主なものを紹介)

  • HelloWorldFunction/template.yaml
    • SAMテンプレート
  • HelloWorldFunction/build.gradle
    • Gradleビルド定義
  • HelloWorldFunction/src/main/java/helloworld/App.java
    • Lambda関数のプログラム
  • HelloWorldFunction/src/test/java/helloworld/AppTest.java
    • Lambda関数のユニットテスト(JUnitベース)

Gradle設定

HelloWorldFunction/build.gradle を右クリックして Import Gradle project を選択します。

Gradleの設定画面が開くので、お好みの設定に変更して[OK]をクリックします。(デフォルトのままでもOK)

AWS profileとregionを選択

サンプルアプリケーションをデプロイするAWS profileとregionを、IntelliJの画面右下から選択できます。

Lambda関数のローカル実行

Lambda関数をローカル上で、AWS環境にデプロイした場合の動きと同じようにシミュレーションをすることができます。

AWS Toolkit v1.3以降のローカル実行方法のやり方がより直感的でわかりやすいかと思うので、別途 AWS Toolkit for JetBrains(IntelliJ) v1.3でJavaのLambda関数がより簡単に確認できるようになりました の記事にまとめました。こちらも合わせてご参照ください。

template.yaml を開き、 Resources.HelloWorldFunctionにあるRunアイコンをクリックします。

Run '[Local] HelloWorldFunction'を選択します。

Input - Textに、Lambda関数を呼び出すイベントのテンプレートを選択します。API GatewayやS3のファイルPut/Delete、SNSなどイベントの種類がほぼ揃っているのがありがたい。

今回のサンプルアプリケーションではAPI Gatewayを使うので、API Gateway AWS Proxy を選択。

[Run]を実行すると、ローカル上でLambda関数を実行し結果を確認できます。

AWS環境へデプロイ

AWS環境へのデプロイは、SAMテンプレートを元にCloudFormationのスタックを新規作成 または 更新することで実現できます。

template.yamlを右クリックして Deploy Serverless Application を選択します。

今回は新規で作るので Create Stack を選択します。

デプロイ先のS3 Bucketも合わせて選択します。無い場合は[Create]をクリックして新規でS3 Bucketを作成。

[Deploy]を押すと、CloudFormationのスタック作成が走ります。全て[CREATE_COMPLETE]となることを確認します。

デプロイしたLambda関数の実行

IntelliJの View -> Tool Windows -> AWS Explorerを開いて、Lambda下にあるLambda関数を右クリック、 Run [Remote]... を選択します。

ローカル実行時と同様、Input - Textに、Lambda関数を呼び出すイベントを選択します。

[Run]を実行すると、AWS環境にデプロイしたLambda関数を実行し結果を確認できます。

デプロイしたアプリケーションの確認

CloudFormationのスタック確認

aws-cliを開発環境にインストールしている場合は、以下のawsコマンドでデプロイしたCloudFormationのスタックを確認できます。

$ aws cloudformation describe-stacks --stack-name Hello-World-Test-Stack --region us-east-2 --profile cm-nomura
  • --stack-name は、デプロイ時に Create Stack で指定したスタック名
  • --region , --profile は、IntelliJで設定したAWS profile と region

今回デプロイしたサンプルアプリケーションは、API Gatewayを利用したWeb APIです。 以下の Output の中にある OutPutValue でエンドポイントとなるURLを確認します。

{
    "Description": "API Gateway endpoint URL for Prod stage for Hello World function", 
    "OutputKey": "HelloWorldApi", 
    "OutputValue": "https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/Prod/hello/"
}

サンプルアプリケーションのAPI呼び出し

curlコマンドでAPIを呼び出します。messagelocation を含むjsonオブジェクトが返ってきたら成功です。

curl -S https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/Prod/hello/
{ "message": "hello world", "location": "X.X.X.X" }

後片付け

確認ができたら、サンプルアプリケーションは今後運用する必要がないのでスタック削除しておきましょう。

AWS ExplorerからCloudFormation Stackを右クリックし、Delete CloudFormation Stackをクリック。

スタック名を入力し、OKを押して削除実行しましょう。

さいごに

IntelliJを使ってJava8のLambda実装やデバッグ、AWS環境へのデプロイを簡単に実行することができました。Java+Gradleのプロジェクト開発をずっとやってきた私にとっては、慣れ親しんだ開発環境でサーバーレス開発を行えるのがありがたいです。

今回はデフォルトのサンプルアプリケーションを利用しましたが、Lambdaの新規関数追加も容易に実行できます。今度は自分でなにかサーバーレスアプリケーションを作ってみたいですね。

それでは今回はこれにて。