API Gateway経由で Lambda関数(Java)を呼び出し、サーバレスな環境でプログラムを実行する
Lambda関数(Java8)を作成し、API Gateway経由で呼び出すことで、サーバレスな環境でプログラムを実行する。
目次
- 概要
- 構成図
- 構築手順
3-1. Lambda用のロール作成
3-2. Lambdaアップロード用のjar作成
3-3. Lambda関数(Java)作成
3-4. APIGateway作成
3-5. POSTメソッドの作成
3-6. APIGatewayのデプロイ
3-7. 動作確認
1.概要
API GateWayとJavaで実装したLambda関数を利用したサーバレス環境を構築し、
POSTリクエストをAPI GateWayで受け、Lambda関数に連携し「姓と名を受け取り結合して返却する」という処理を行う。
また、Lambda関数の結果はCloudWatch Logsへ出力して確認できるようにする。
2.構成図
構成図は以下の通り。

3.構築手順
3-1. Lambda用のロール作成
Lambdaに他のAWSサービスへの操作権限を与えるため、ロールを作成する。
今回は ” CloudWatch Logs へログの作成/出力をする権限 ” を与える。
Lambda関数用のロールを作成する。

Lambdaを選択する。

CloudWatch Logs にログ出力できるように、AWS管理ポリシー「AWSLambdaBasicExecutionRole」をアタッチする。

タグは特に設定せず、任意のロール名を指定して作成する。

3-2. Lambdaアップロード用のjar作成
今回はJavaでコーディングを行う。
コンパイルが必要な言語はAWS Lambdaの画面上で直接編集できないため、
ビルドした資材を用意し、Lambda関数にアップロードする必要がある。
EclipseにてMavenプロジェクトを下記要領で作成し、Jarファイルを生成する。
グループ Id | 任意のルートパッケージ名 |
アーティファクト Id | 任意のプロジェクト名(グループIDと揃える) |
バージョン | デフォルトのまま |
パッケージング | jar |

pom.xmlに下記を追記し、「Lambda用ライブラリ」と「Mavenプラグイン」をインストールする。

・Lambda用ライブラリを追加
groupId | com.amazonaws |
artifactId | aws-lambda-java-core |
version | 1.1.0 |
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
・依存関係のあるライブラリを1つの jar ファイルにまとめる Maven のプラグインを追加
groupId | org.apache.maven.plugins |
artifactId | maven-shade-plugin |
version | 3.1.0 |
createDependencyReducedPom | false |
phase | package |
goal | shade |
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
適当なクラスを作成し、受け取った値を文字列結合してフルネームとして返すソースコードを記載する。
ソースコード
package lambda.cloud;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import lambda.cloud.LambdaFunctionProgram.Input;
import lambda.cloud.LambdaFunctionProgram.Output;
public class LambdaFunctionProgram implements RequestHandler<Input, Output>{
static Logger logger = Logger.getLogger("FullnameReturn");
public LambdaFunctionProgram.Output handleRequest(LambdaFunctionProgram.Input in, Context context) {
logger.log(Level.INFO, "Input:" + in.firstName + "/" + in.lastName);
final Output out = new Output();
out.firstName = in.firstName;
out.lastName = in.lastName;
out.fullName = in.firstName + "_" + in.lastName;
logger.log(Level.INFO, "Output:" + out.firstName + "/" + out.lastName + "/" + out.fullName);
return out;
}
public static class Input {
public String firstName;
public String lastName;
}
public static class Output {
public String firstName;
public String lastName;
public String fullName;
}
}
下記を指定してjarを生成する。
ゴール | package shade:shade |

3-3. Lambda関数(Java)作成
Lambda関数を下記要領で作成する。
オプション | 一から作成 |
関数名 | 任意の名前 |
ランタイム | Java8 |
実行ロール | 既存のロールを使用する |
既存のロール | 作成したロールを指定 |

Lambda関数に作成したjarをアップロードする。
アップロードファイル | [プロジェクト名]-0.0.1-SNAPSHOT-shaded.jar |

Lambda関数のハンドラを修正する。
ハンドラ | パッケージ名.クラス名::メソッド名 |


Lambda関数のテストイベントを作成し、プログラムの動作確認を行う。

テストイベントを下記要領で作成する。
イベント | 任意の名前 |
テスト用文字列 | 下記 JSON文字列 (Inputクラスのメンバ変数名をキー名とする) |
{
"firstName": "tanaka",
"lastName": "tarou"
}

作成したテストイベントを選択し、テスト実行する。

実行が成功したことと、性と名を繋げたフルネームが返されてることを確認する。

CloudWatch LogsにLambda関数名でロググループが作成され、ログ出力されていることを確認する。

Lambda関数のSTART/ENDログと、メソッド実行ログと、ソースコードに記載した標準出力が出力されていることが確認できる。

3-4. APIGateway作成
API Gatewayを作成する。
APIタイプ | REST API |
API名 | 任意の名前 |

リソース(APIパス)を作成する。
※ 設定することで、パスごとにリクエスト先を設定できる。
リソース名 | 任意の名前 |
リソースパス | リクエストするパス(URL)を指定できる。 リソース名が自動入力されるため今回は編集しない。 |


3-5. POSTメソッドの作成
POSTメソッドを下記要領で作成する。
統合タイプ | Lambda関数 |
Lambda関数 | 作成したLambda関数名 |


Lambda関数と連携する。

API Gatewayで内部テストを行う。

リクエスト本文に下記を記載し、テスト実行する。
{
"firstName": "tanaka",
"lastName": "tarou"
}

テスト結果のステータスが「200」であることと、Lambda関数のテストイベント実行時と同じ値が返ってくることを確認する。

3-6. APIGatewayのデプロイ
APIを下記要領でデプロイする
※ デプロイ済APIは ”ステージ” でエンドポイントとデプロイバージョンを紐づけ、管理する。
デプロイされるステージ | [新しいステージ] |
ステージ名 | 任意の名前 |
ステージの説明 | ステージの任意の説明 |
デプロイメントの説明 | デプロイ毎に記載するコメント |


デプロイ完了。
呼び出し用URLはリクエスト時に使用するため、控えておく。

3-7. 動作確認
コマンドプロンプトで下記コマンドを実行し、POSTリクエスト時の動作確認を行う。
curl -X POST https://○○○○○○/dev/test -H "Content-Type:application/json" -d "{\"firstName\":\"tanaka\",\"lastName\":\"tarou\"}"
※ https://○○○○○○/dev/test : [呼び出し用URL]/[リソース名]
※ -H:ヘッダ
※ -d:リクエストデータ
Lambda関数のテストイベント実行時と同じ値が出力されることを確認する。
