
サーバーレスコンピューティング とは、アプリケーションのインフラストラクチャとサポートサービス層がソフトウェア層から完全に抽象化された状態で機能する、最新のクラウドベース型アプリケーションアーキテクチャのことを指します。すべてのアプリケーションが物理サーバーを使用して実行されることに変わりはありませんが、サーバーレスアプリケーションでは、その責任が Amazon Web Services(AWS)などのクラウドサービスプロバイダに移行されます。
真の サーバーレスアーキテクチャパラダイムにおいて、 Lambda 関数のコードは、第三者(通常はクラウドサービス)にホスト・管理されるインフラストラクチャ上で実行されます。プロバイダは、プロビジョニングから拡張、 負荷分散、インフラストラクチャのセキュリティ保護まで、すべての処理を行います。また、AWSツールキットやオペレーティングシステム、パッチ、サーバーレスフレームワーク、コードライブラリ、および必要なすべてのサポートサービスの管理も行います。実行中のアプリケーションが使用するコンピューティング時間に対してのみ料金が発生し、アプリケーションへの負荷の増減に応じてサーバーレスのバックエンドが自動的に拡張および負荷分散を行うため、高いコスト効率とスケーラビリティが実現します。
世界のサーバーレスアーキテクチャ市場 は、2024年には253億米ドルに達したことが推定されており、2025年から2030年にかけては14.1%の年平均成長率により成長することが予想されています。サーバーレスコンピューティングを採用する開発者や組織が増加する中、(特にJavaなどの一般的な言語により)効率的なイベント駆動型アプリを構築する方法を理解する必要があります。
まずは、Java 11を使用したLambda関数の作成方法とAmazon DynamoDBへの接続方法、そしてSumo LogicのTelemetry API統合によりAWSの可観測性を向上させる方法をご覧ください。
AWS Lambda関数とは
AWS Lambda は、サーバーのプロビジョニングや管理を必要とせず、あらゆる種類のアプリケーションやバックエンドサービスのコードを実行可能とする、サーバーレスかつイベント駆動型のコンピューティングサービスです。 Amazon CloudWatch、 Amazon S3、 Amazon EC2など、200を超えるAWSサービスやSoftware as a Service(SaaS)アプリケーションからLambda関数をトリガーすることが可能です。
これらは、 Amazon Simple Queue Service(SQS) からLambda関数へのデータの流れや、Amazon S3内のファイルにおける変更などのイベントに応答します。イベントは最初のパラメータとして関数に渡されます。Lambda関数は完全にステートレスであり、関数の実行場所や特定のインスタンスにおける実行回数についての保証はありません。
Java 11でAWS Lambda関数をコーディングする方法
AWS Lambdaを使用することにより、Lambda Java関数を作成することができ、これをAWSクラウドにアップロードすることで実行の設定を行うことが可能となります。この関数はさまざまな言語で記述することができますが、ここではJava 11を使用したAWS Lambda関数の作成方法に焦点を当てます。このセクションでは、AWSコンソールを使って関数のコーディング、設定、およびテストを行う手順を説明します。
AWS Lambdaの例:シンプルな郵便番号検証ツール
この例では、Amazon DynamoDBテーブルに追加された新しい住所に応答するシンプルな郵便番号の検証ツールを作成します。
ステップ0:はじめに
- AWSマネジメントコンソールへのアクセスがあることを確認します。この例の作成および展開は、AWSの無料利用枠内においては通常無料となっています。
- 不要な使用を避けるため、テスト後はトリガーを無効にし、DynamoDBテーブルを削除します。
ステップ1:DynamoDBテーブルの作成
- DynamoDBコンソールに移動します。
- 主キーがid(String型)である US_Address_Table というテーブルを作成します。
- ビュータイプ NEW_IMAGE でストリームを有効にします。
- 次のステップで使用するため、テーブルのARNをコピーします。
ステップ2:Lambda関数におけるロールの作成
- IAMコンソールに移動します。
- AWSLambdaDynamoDBExecutionRole管理ポリシーにより、新しいロールを作成します。
- ロールに lambda-validatorなどの名前を付けます。
ステップ3:DynamoDBを更新するための権限追加
- テーブルのARNを使用してDynamoDBテーブルに UpdateItem 権限を付与するため、インラインポリシーをアタッチするか、コンソールを使用します。
ステップ4:Lambda関数のコーディング
- Java 11とAWS SDK v2を使用します。以下がLambda関数の簡略版となります。
package com.example;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.*;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.regex.Pattern;
public class AddressValidator implements RequestHandler<DynamodbEvent, String> {
private static final Pattern ZIP_CODE_PATTERN = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$");
private final ObjectMapper objectMapper = new ObjectMapper();
private final DynamoDbClient dynamoDbClient = DynamoDbClient.builder().region(Region.US_WEST_2).build();
private static final String TABLE_NAME = "US_Address_Table";
public String handleRequest(DynamodbEvent event, Context context) {
LambdaLogger logger = context.getLogger();
for (DynamodbEvent.DynamodbStreamRecord record : event.getRecords()) {
if ("INSERT".equals(record.getEventName())) {
try {
String jsonAddress = record.getDynamodb().getNewImage().get("address").getS();
Address address = objectMapper.readValue(jsonAddress, Address.class);
if (!Boolean.TRUE.equals(address.getValidated())) {
address.setValidated(ZIP_CODE_PATTERN.matcher(address.getZipcode()).matches());
String updatedJson = objectMapper.writeValueAsString(address);
dynamoDbClient.updateItem(UpdateItemRequest.builder()
.tableName(TABLE_NAME)
.key(record.getDynamodb().getKeys())
.updateExpression("SET address = :a")
.expressionAttributeValues(Map.of(":a", AttributeValue.builder().s(updatedJson).build()))
.returnValues(ReturnValue.UPDATED_NEW)
.build());
}
} catch (Exception e) {
logger.log("Exception during ZIP validation: " + e.getMessage());
}
}
}
return "Validated " + event.getRecords().size() + " records.";
}
}
ステップ5:AWSコンソールによるLambda関数のアップロード
- MavenまたはGradleを使用して、Java Lambda関数をfat JARとしてパッケージ化します。
- AWS Lambdaコンソールからアップロードします。
- ランタイムをJava 11に設定し、ハンドラを com.example.AddressValidator::handleRequestに設定します。
- 先ほど作成したロールを割り当てます。
ステップ6:AWSコンソール内における関数の同期テスト
- Lambdaコンソールでテストイベントを作成します。
- 次のJSON形式を使用します。
{
"Records": [
{
"eventID": "1",
"eventVersion": "1.0",
"dynamodb": {
"Keys": {
"id": {"S": "111-222-333"}
},
"NewImage": {
"address": {
"S": "{\"address1\":\"123 Main St\",\"city\":\"Portland\",\"state\":\"OR\",\"zipcode\":\"97229\"}"
},
"id": {"S": "111-222-333"}
},
"StreamViewType": "NEW_IMAGE",
"SequenceNumber": "111-222-333",
"SizeBytes": 26
},
"awsRegion": "us-west-2",
"eventName": "INSERT",
"eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2023-01-01T00:00:00.000",
"eventSource": "aws:dynamodb"
}
]
}
- ヌルポインタまたは権限エラーが発生した場合は、テーブルのARNが正しいこと、またLambdaロールに必要な権限があることを確認します。
- logger.log() ステートメントを追加してデバッグを支援します。
ステップ7:DynamoDBにおけるLambda関数のトリガー
- DynamoDBコンソールで、テーブルのTriggersタブに移動し、Lambda関数にリンクします。
- 手動テストの場合、バッチサイズを1に設定します。
- 接続の完了後は、テーブルに新しいアイテムを挿入することでLambdaがトリガーされ、アドレスオブジェクトは 検証済みの フィールドで更新されるはずです。
Sumo Logicが役に立つ理由
Sumo LogicのSaaS Log Analytics PlatformでTelemetry APIを使用することにより、 AWS Lambdaからのログやプラットフォームメトリクス、プラットフォームトレースをSumo Logic に直接統合することが可能となります。この統合により環境全体の可観測性が向上するため、インフラストラクチャ管理のオーバーヘッドなしに、Lambda関数の詳細な可視化と簡単な監視が実現します。
AWSにおける監視と可観測性を次のレベルに引き上げる準備はできましたか? 30日間の無料トライアルを開始しましょう。


