「AWS無料相談会」をオンラインで開催中

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に注力しています。ぜひ以下ページをご覧ください。

サーバーレスアーキテクチャ(AWS Lambda)