はじめに
久しぶりの技術記事です。今回はタイトルにもあるとおりJavaのディファクトスタンダードでもあるフレームワークSpringBootのアプリケーションをAPI Gateway+Lambdaに構築する方法をご紹介します。
昔はLambdaのランタイムとしてJavaを利用することは、JVM起動時間が遅いため避けられてきましたが、「Lambda SnapStart」機能の追加により起動速度が向上し、実用的に利用できるようになりました。このアップデートによりアーキテクチャの選択肢としてJavaも実用的なものとなっています。
※今回はSnapStartの設定は行いません。
事前準備
- AWSアカウントを持っていること
- Administrator権限のIAMユーザが作成されていて、アクセスキー、シークレットキーを発行していること
環境
手順
JDKのセットアップ
こちらのページよりインストーラーをダウンロードします。
ダウンロードが完了したらインストーラーを実行し、インストールを行います。
インストールが完了したら、コマンドプロンプトを起動し、以下のコマンドを実行します。
> java -version
openjdk version "21.0.5" 2024-10-15 LTS
OpenJDK Runtime Environment Corretto-21.0.5.11.1 (build 21.0.5+11-LTS)
OpenJDK 64-Bit Server VM Corretto-21.0.5.11.1 (build 21.0.5+11-LTS, mixed mode, sharing)
上記の結果が表示されればセットアップ完了です。
※JDKのディストリビューションをAmazon Correttoにしているのは、LambdaのJavaランタイムが使用しており、ローカルとの環境の差分をなくすためです。
Mavenのセットアップ
こちらのページよりバイナリをダウンロードします。
ダウンロードしたファイルを解凍し、C:\Program Filesに移動します。
環境変数Pathに C:\Program Files\apache-maven-3.9.9\bin 追加します。
コマンドプロンプトを起動し、以下のコマンドを実行する。
> mvn -v
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: C:\Program Files\apache-maven-3.9.9
Java version: 21.0.5, vendor: Amazon.com Inc., runtime: C:\Program Files\Amazon Corretto\jdk21.0.5_11
Default locale: ja_JP, platform encoding: UTF-8
OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"
上記の結果が表示されればセットアップ完了です。
AWS CLIのセットアップ
こちらのページを参考にインストールを行います。
コマンドプロンプトを起動し、以下のコマンドを実行します。
> aws --version
aws-cli/2.22.34 Python/3.12.6 Windows/11 exe/AMD64
上記の結果が表示されればセットアップ完了です。
AWS SAMのCLIのセットアップ
こちらのページを参考にインストールを行います。
コマンドプロンプトを起動し、以下のコマンドを実行します。
> sam --version
SAM CLI, version 1.132.0
上記の結果が表示されればセットアップ完了です。
AWSプロファイル設定
コマンドプロンプトを起動し、以下のコマンドを実行します。
> aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]:
AWS Access KeyとAWS Secret Access KeyにIAMで作成したユーザのものを設定します。
プロジェクト作成
コマンドプロンプトを起動し、以下のコマンドを実行します。
> mkdir C:\workspace
> cd C:\workspace
> mvn archetype:generate -DgroupId=my.service -DartifactId=my-service -Dversion=1.0-SNAPSHOT -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-springboot3-archetype -DarchetypeVersion=2.1.1
作成したプロジェクト内にあるbuild.gradleファイルを削除します。
デプロイ
コマンドプロンプトを起動し、以下のコマンドを実行します。
> sam build
Building codeuri: C:\workspace\my-service runtime: java21 architecture: x86_64 functions: MyServiceFunction
Running JavaMavenWorkflow:CopySource
Running JavaMavenWorkflow:MavenBuild
Running JavaMavenWorkflow:MavenCopyDependency
Running JavaMavenWorkflow:MavenCopyArtifacts
Build Succeeded
Built Artifacts : .aws-sam\build
Built Template : .aws-sam\build\template.yaml
Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch
[*] Deploy: sam deploy --guided
上記の結果が出力されれば、ビルド完了です。
次に以下のコマンドを実行し、デプロイします。
> sam deploy --guided
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Not found
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]:
AWS Region [ap-northeast-1]:
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [y/N]: N
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: Y
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]: N
MyServiceFunction has no authentication. Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]:
SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:
以下の結果が出力されたらデプロイ完了です。
CloudFormation outputs from deployed stack
---------------------------------------------------------------------------------------------------------------------
Outputs
---------------------------------------------------------------------------------------------------------------------
Key MyServiceApi
Description URL for application
Value https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/ping
---------------------------------------------------------------------------------------------------------------------
Successfully created/updated stack - sam-app in ap-northeast-1
動作確認
コマンドプロンプトを起動し、以下のコマンドを実行します。
> curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/ping
{"pong":"Hello, World!"}
レスポンスが返ってくることを確認してください。
アプリケーション更新
src\main\java\my\service\controller\PingController.javaを以下のように変更します。
package my.service.controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import java.util.HashMap;
import java.util.Map;
@RestController
@EnableWebMvc
public class PingController {
@RequestMapping(path = "/ping", method = RequestMethod.GET)
public Map<String, String> ping() {
Map<String, String> pong = new HashMap<>();
pong.put("pong", "Hello, Serverless!");
return pong;
}
}
保存したら、以下のコマンドを実行してください。
> sam build
> sam deploy
※sam deplyのオプション「guided」が不要なのは、1回目に実行した際に作成されたsamconfig.tomlに選択した内容が保存されており、2回目以降はこちらのファイルが参照されるためです。
デプロイが完了したら、以下のコマンドを実行し変更されたか確認してください。
> curl https:
メッセージが変更されていれば更新成功です。
今回はソースの変更を行いましたが、template.yamlファイルでAWS環境の構築や変更を行うことも可能です。(RDS作成など)
最後に
今回作成したプロジェクトを土台として、開発を進めることが可能になりました。実際のアプリケーションではDBを利用することになると思います。今後、別のブログでアップしていきたいと思います。
参考記事