MicronautでサーバーレスAPIを動かす
最近はRuby on Railsと格闘しています。やっさんでございます。
本エントリーでは、Amazon Coretto 11 + Micronautによる
サーバーレスAPIを動かしてみます!
なぜMicronautなのか
最近はマイクロサービスによりアプリケーションをより速く
起動することが求められます。
極小のマイクロサービスとしてLambdaを代表されるFaaSがあり、
FaaSにおいては起動速度が重要になります。
しかしながら、プレーンなJavaによるLambdaの開発も少し辛いものがあります。
できれば、Routing, Validation, DIなどが用意された
軽量のフレームワークを利用したいですよね。
そこで、MicronautなどJavaの軽量フレームワークが注目されています。
Micronaut + API Gatewayを動かす
さくっとWeb APIを作っていきます!
筆者の開発環境
MacBook
必要なもの
- AWSアカウント
- Docker for Mac
- Amazon Coretto 11
- AWS SAM CLI
- お好きなIDE
1. サンプルファイルのダウンロード
以下のURLのzipファイルを取得したあと、
適当な場所に api-gateway-example
ディレクトリをコピーします。
micronaut-project/micronaut-aws - api-gateway-example
2. ビルド実行
ビルドを実行し、LambdaにアップロードするためのJarファイルを作成します。
api-gateway-example
配下で以下のコマンドを実行します。
./gradlew assemble
3. sam.yamlファイルの一部修正
今回はAmazon Coretto 11で動作させたいので、
sam.yamlとsam-local.yamlファイルのRuntimeの記述をJava11に変更します。
Runtime: java11
4. ローカルでの動作確認
以下のコマンドを実行し、ローカルでAPI Gatewayを起動します。
sam local start-api --template sam-local.yaml
以下のログが出力され、起動しました。
* Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
CurlコマンドでAPIを叩いてみましょう。
curl http://127.0.0.1:3000/ping
{"pong":true}
"pong"のレスポンスが返ってきました!動いていますね!
5. AWSへのデプロイ
今回はAWS SAMを利用します。
AWS SAMを利用するにはIAMユーザーの作成や
クレデンシャルの設定を事前に行う必要があります。
スクリプトファイルを作成します。
スクリプトファイルに記述したS3バケットも事前に作成しておきます。
今回は誤ったAWSアカウントにデプロイしないよう、
プロファイルを指定しています。
./scripts/deploy.shの内容:
#!/usr/bin/env bash
sam package
--template-file ./sam.yaml
--s3-bucket "micronaut-example-packages"
--output-template-file ./output-sam.yaml
--profile xxxx &&
sam deploy
--template-file ./output-sam.yaml
--stack-name "micronaut-example-api"
--capabilities CAPABILITY_IAM
--profile xxxx
用意したスクリプトを実行します。
sh ./scripts/deploy.sh
実行結果:
Successfully created/updated stack - micronaut-example-api in None
デプロイに成功しました!
6. APIの動作確認
CurlコマンドでAPIを叩いてみましょう。
curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/ping
{"pong":true}
"pong"のレスポンスが返ってきました!動いてますね!
コールドスタート時間の確認
CloudWatch Logsのログを確認し、コールドスタートの時間を確認してみます。
Duration: 2716.63 ms
Billed Duration: 2800 ms
Memory Size: 320 MB
Max Memory Used: 172 MB
Init Duration: 3726.95 ms
... コールドスタートで 約4秒 かかっていることが分かりますかね ...
これは ... ちょっと遅い ですかね。
Java + Lambdaをより速くするには?
いくつかのアプローチがあります。
- 言語側のアプローチ:Graal VM Native Imageの利用
- AWS側のアプローチ:Provisioned Concurrencyを利用したウォームスタンバイ
Lambdaを利用する時はもっぱらGoで開発していましたが、
引き続きJavaの動向にも注視していきたいと思います!!
以上です!
MMMは、会社としてもAWS Lambdaに注力しています。ぜひ以下ページをご覧ください。