Javaで実装したプログラムをAWS Lambdaにデプロイして実行する方法

AWS
この記事はこんな人にオススメ
  • AWS Lambdaに興味のある人
  • AWSを使用したサーバーレスコンピューティングに興味のある人
  • Javaで開発したプログラムをAWS Lambdaで運用したい人

どうも、Shinyaです。

この記事では、Javaで開発したプログラムをAWS Lambdaにデプロイして実行する方法について書いていきます。

AWS Lambdaは、AWS(Amazon Web Services)から提供されているコンピューティングサービスの一つで、簡単にサーバーレスコンピューティングを実現することができます。そのため、サーバーなどのインフラに関する専門的な知識がなくても、実装したプログラムをクラウド上のサーバーにデプロイして簡単に運用することが可能です。

また、AWS LambdaはAWSの各サービスと簡単に組み合わせることができます。例えば、AWS LambdaにデプロイしたプログラムをAmazon EventBridgeと組み合わせて決められたスケジュールで定期的に実行することや、Amazon API Gatewayと組み合わせてWeb APIとして外部アプリから実行することも可能です。

こうした特性から、AWS Lambdaは様々な開発に応用できる非常に汎用性の高いAWSのサービスです。AWS Lambdaを使いこなせるようになると、AWSを活用して開発できるアプリケーションの幅が非常に広がるでしょう

公式サイトの「なぜAWS Lambdaを使うのか」から。

事前準備

この記事ではAWS Lambdaを使用するため、なによりAWSアカウントが必要になります。そのため、まだAWSアカウントを作成していない方は、公式AWSサイトからAWSアカウントを作成してください。

また、この記事ではAWS LambdaにデプロイするプログラムをJavaで実装していくので、事前に使用するPCにJDKをインストールしておく必要があります。先日、OpenJDKの一つでAmazon/AWSから完全無償で提供されているAmazon Correttoのインストール方法について書きましたので、まだJDKをインストールしていない方は以下の記事を参考にインストールしてみてください

利用料金について

AWS Lambdaは、他のAWSのサービスと同様に、使用した分だけ利用料金が発生する従量課金制となっています。

しかし、AWS Lambdaには超太っ腹な無料利用枠が用意されており、なんと1ヶ月あたり100万件のリクエストと40万GB-秒のコンピューティング時間を無料で利用することができます

1ヶ月あたり100万件のリクエストと40万GB-秒のコンピューティング時間というと、高トラフィックのWebアプリやモバイルアプリを運営していたり、大量データを高頻度で計算するようなバッチアプリケーションを運用していない限りなかなか超えられないような枠です。

そのため、個人開発で使用する場合はもちろんのこと、クラウドベースでプロトタイプのサービスを構築したいスタートアップにもオススメのサービスとなっています。

AWS Lambdaの無料枠に関する公式の説明。

AWSが提供しているサービスの利用料金は頻繁に変更されるため、古い情報を掲載し続けないようにこの記事では利用料金の詳細には触れません。

AWS Lambdaの利用料金については、AWS Lambda公式の料金ページで最新の情報を確認するようにしてください。

AWS Lambdaにデプロイするプログラムを実装する

早速、AWS Lambdaにデプロイするための検証用の簡単なプログラムをJavaでサクッと実装していきましょう。

この記事の例では、JavaプログラムをMavenプロジェクトとしてプログラムを作成していきます。Maven以外のGradleなどのビルド管理ツールを使用したい場合は、依存ライブラリの追加方法などをそれぞれのビルド管理ツールに読み替えてください。

使用するライブラリ

AWS LambdaにデプロイするためのJavaプログラムを作成するためには、次の公式ライブラリが必要になります。

<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.3.0</version>
</dependency>

今回の例では、この記事を書いている時点で最新バージョンの「1.3.0」を使用していきます。

ライブラリをPOMに追加する

先に確認した公式ライブラリを次のようにPOMのdependenciesタグの中に追加します。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>dev.shinyakato.lambda</groupId>
    <artifactId>lambda</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core -->
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.3.0</version>
        </dependency>
    </dependencies>
</project>

POMの依存性に公式ライブラリを追加したら、次のMavenコマンドを実行してライブラリをインストールしておきましょう。

mvn clean install

Lambdaハンドラーの実装

それでは、ライブラリのインストールも終わったので、実際にAWS LambdaにデプロイするJavaプログラムを作成していきましょう。AWS LambdaにデプロイするためのJavaプログラムを作成するのはとても簡単で、基本的に次の手順で実装するだけです。

  1. RequestHandlerインターフェースをimplementsする
    • ジェネリクスの第一引数はLambda実行時に受け取る入力の型を指定
    • ジェネリクスの第二引数はLambda実行時に返却する出力の型を指定
  2. handleRequestメソッドを実装する
    • Lambda実行時の処理を定義
    • 第一引数はRequestHandlerのジェネリクスで指定した入力の型を指定
    • 返却型はRequestHandlerのジェネリクスで指定した出力の型を指定

上記の手順を踏まえて、Lambda実行時に「Hello, World!」という文字列を返す単純なLambdaハンドラーを実装すると以下のようになります。

package dev.shinyakato.lambda;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class SayHelloHandler implements RequestHandler<Object, String> {

    @Override
    public String handleRequest(Object input, Context context) {
        return "Hello, World!";
    }
}

AWS LambdaにJavaプログラムをデプロイできるように実装するためには、RequestHandlerインターフェースとhandleRequestメソッドを実装するだけで作業は完了です。

そのため、依存するシステムなどをひとまず隅に置いておいて単純に考えると、もし既にオンプレミスのサーバーなどで稼働しているバッチアプリケーションなどをAWS Lambdaに移行したいような場合は、オンプレミスのサーバーで実際に実行しているJavaクラスを個々の目的に合わせて実装したLambdaハンドラークラスのhandleRequestメソッドの中で実行するようにするだけです。

AWS Lambdaにデプロイする際にはJarファイルが必要なので、次のMavenコマンドを実行してビルドしておきましょう。

mvn clean install

そうすると、Javaプロジェクト直下のtargetフォルダにJarファイルが生成されるので、このJarファイルを使用してAWS Lambdaにデプロイしていきましょう。

作成したJarファイルをAWS Lambdaにデプロイする

AWS Lambdaにデプロイする対象のJavaプログラムも作成したので、このプログラムを実際にAWS Lambdaにデプロイしていきます。

AWS Lambdaのダッシュボードにアクセスする

まずは、AWS Lambdaのダッシュボードにアクセスする必要があります。

AWSのマネージメントコンソールから、画面上部にある検索ボックスに「lambda」と入力してください。そうすると、サービスの検索結果一覧に「Lambda」が表示されるのでクリックしてください。

次のような画面に遷移できたら、AWS Lambdaのダッシュボードに遷移できています。

関数を作成する

作成したプログラムをAWS Lambdaにデプロイするためには「関数」を作成する必要があります。

AWS Lambdaのダッシュボードの右上に表示されている「関数を作成」をクリックしてください。

そうすると、関数の作成画面が開きますので、次の手順で関数を作成してください。

  1. オプション: 「一から作成」を選択
  2. 関数名: リージョン内でユニークな任意の名前を入力
  3. ランタイム: 特段の理由がなければ最新のJavaランタイムを選択
  4. アーキテクチャ: 実行効率と料金で有利なGravitonプロセッサの「arm64」を選択
  5. 「関数の作成」をクリック

入力した項目に問題がなければ、次のように関数の作成が完了します。

作成した関数にプログラムをアップロードする

先の工程で作成した関数にJavaプログラムをアップロードしていきます。

先ほど作成した関数の管理画面で「コード」タブを選択し、「コードソース」のセクションにある「アップロード元」をクリックします。

AWS Lambdaの関数にプログラムをアップロードする際には、Jarファイルなどの圧縮ファイルを直接アップロードする方法と、一度Amazon S3の特定のバケットにアップロードしてからAWS Lambdaにアップロードする方法があります。

使い分けとしては、アップロードする対象のプログラムのサイズが10MBを超える場合には、Amazon S3を経由してAWS Lambdaにアップロードすることが公式に推奨されています

今回の記事で作成したプログラムは2.5KBほどしか容量がないので、Jarファイルを直接アップロードする方法で進めます。

次に、アップロードする対象のプログラムを選択する画面が開くので、アップロード対象のJarファイルを選択してください。

アップロード対象のJarファイルを選択したら「保存」ボタンをクリックします。

関数が実行するハンドラ名を編集する

次に、先ほど関数にアップロードしたプログラムに定義されているハンドラ名を設定していきます。

関数の管理画面にある「ランタイム設定」から「編集」ボタンをクリックしてください。

そうすると、ランタイムの設定画面が開くので、「ハンドラ」の項目を編集していきます。

次の形式でハンドラ名を入力して、入力が完了したら「保存」ボタンをクリックしてください。

  • ハンドラのパッケージ名.ハンドラのクラス名::handleRequest
    • 例: dev.shinyakato.lambda.SayHelloHandler::handleRequest

デプロイしたJavaプログラムを実行してみる

ここまでの作業でAWS Lambdaへのデプロイは完了です。それでは早速、デプロイしたJavaプログラムを実行してみましょう。

関数の管理画面から「テスト」タブを選択し、「テストイベント」セクションにある「テスト」ボタンをクリックしてください。

そうすると、アップロードしたプログラムのテスト実行が即時に行われるので、デプロイとハンドラの設定などが上手くできていると次の画像のように成功の実行結果を確認することができます。

Shinya

フリーランス。プログラマー歴10年以上。Amazoned Programmer (Amazon中毒のプログラマー)。

仕事ではJavaとSQLとかを主に使ってアプリケーションを開発しています。BIツールを使用したビッグデータの可視化や解析から、AWSなどのクラウド技術の活用に興味があり、日々研究と研鑽を重ねています。このブログでは日々の学習のアウトプットを投稿していこうと思います。

お気に入りの言葉は「Day 1」と「Data Never Sleeps」。

Shinyaをフォローする
AWSAWS LambdaJavaProgrammingTech
Shinyaをフォローする
タイトルとURLをコピーしました