MMMブログ

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 配下で以下のコマンドを実行します。

1
./gradlew assemble

3. sam.yamlファイルの一部修正

今回はAmazon Coretto 11で動作させたいので、
sam.yamlとsam-local.yamlファイルのRuntimeの記述をJava11に変更します。

1
Runtime: java11

4. ローカルでの動作確認

以下のコマンドを実行し、ローカルでAPI Gatewayを起動します。

1
sam local start-api --template sam-local.yaml

以下のログが出力され、起動しました。

1
* Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)

CurlコマンドでAPIを叩いてみましょう。

1
2
curl http://127.0.0.1:3000/ping
{"pong":true}

“pong”のレスポンスが返ってきました!動いていますね!

5. AWSへのデプロイ

今回はAWS SAMを利用します。
AWS SAMを利用するにはIAMユーザーの作成や
クレデンシャルの設定を事前に行う必要があります。

スクリプトファイルを作成します。
スクリプトファイルに記述したS3バケットも事前に作成しておきます。
今回は誤ったAWSアカウントにデプロイしないよう、
プロファイルを指定しています。

./scripts/deploy.shの内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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

用意したスクリプトを実行します。

1
sh ./scripts/deploy.sh

実行結果:

1
Successfully created/updated stack - micronaut-example-api in None

デプロイに成功しました!

6. APIの動作確認

CurlコマンドでAPIを叩いてみましょう。

1
2
curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/ping
{"pong":true}

“pong”のレスポンスが返ってきました!動いてますね!

コールドスタート時間の確認

CloudWatch Logsのログを確認し、コールドスタートの時間を確認してみます。

1
2
3
4
5
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の動向にも注視していきたいと思います!!

以上です!

このエントリーをはてなブックマークに追加

お問い合わせ

見積もり依頼や詳しいご相談など、クラウド・AWSに関する困りごとをお気軽にご相談ください。
以下のお問い合わせ先から受け付けています。

お問合わせはこちら

※通常1営業日内にご回答いたします。