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 を使った開発方法についてお伝えします。
事前準備
開発環境に必要なもの
以下を事前に開発環境にインストールします。
- IntelliJ IDEA(Community または Ultimate 2018.3以上)
- AWS SAM CLI(バージョン0.14.1以上)
- Installing the AWS SAM CLI
- ローカルの動作確認にDockerも必要なので、まだインストールしてない場合は上記ドキュメント参考に準備してください。
- Java8が実行可能であること
- Java8環境がない場合はJava SE Development Kit 8 - Downloadsを参考にSDKをダウンロードしインストールしてください。
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を呼び出します。message
と location
を含む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の新規関数追加も容易に実行できます。今度は自分でなにかサーバーレスアプリケーションを作ってみたいですね。
それでは今回はこれにて。