S3 イベント通知の使用 - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

S3 イベント通知の使用

バケット内のアクティビティをモニタリングしやすくするために、Amazon S3 は特定のイベントが発生したときに通知を送信できます。Amazon S3 ユーザーガイドには、バケットが を送信できる通知に関する情報が記載されています。

SDK for Java を使用して、4 つの可能な送信先にイベントを送信するようにバケットを設定できます。

  • Amazon Simple Notification Service トピック

  • Amazon Simple Queue Service キュー

  • AWS Lambda 関数

  • Amazon EventBridge

にイベントを送信するようにバケットを設定すると EventBridge、同じイベントを複数の送信先にファンアウトするように EventBridge ルールを設定できます。最初の 3 つの送信先のいずれかに直接送信するようにバケットを設定する場合、イベントごとに指定できる送信先タイプは 1 つだけです。

次のセクションでは、 SDK for Java を使用してバケットを設定し、S3 イベント通知を Amazon SQSキューに直接送信する方法と に送信する方法の 2 つの方法を説明します EventBridge。

最後のセクションでは、S3 イベント通知を使用してオブジェクト指向の通知APIを操作する方法を示します。

送信先に直接送信するようにバケットを設定する

次の例では、オブジェクト作成イベントまたはオブジェクトタグ付けイベントがバケットに対して発生したときに通知を送信するようにバケットを設定します。

static void processS3Events(String bucketName, String queueArn) { // Configure the bucket to send Object Created and Object Tagging notifications to an existing SQS queue. s3Client.putBucketNotificationConfiguration(b -> b .notificationConfiguration(ncb -> ncb .queueConfigurations(qcb -> qcb .events(Event.S3_OBJECT_CREATED, Event.S3_OBJECT_TAGGING) .queueArn(queueArn))) .bucket(bucketName) ); }

上記のコードは、2 種類のイベントを受信するように 1 つのキューを設定します。メソッドqueueConfigurationsを使用すると、必要に応じて複数のキューの送信先を設定できます。また、 notificationConfigurationメソッドでは、1 つ以上の Amazon SNSトピックや 1 つ以上の Lambda 関数など、追加の送信先を設定できます。次のスニペットは、2 つのキューと 3 種類の送信先を含む例を示しています。

s3Client.putBucketNotificationConfiguration(b -> b .notificationConfiguration(ncb -> ncb .queueConfigurations(qcb -> qcb .events(Event.S3_OBJECT_CREATED, Event.S3_OBJECT_TAGGING) .queueArn(queueArn), qcb2 -> qcb2.<...>) .topicConfigurations(tcb -> tcb.<...>) .lambdaFunctionConfigurations(lfcb -> lfcb.<...>)) .bucket(bucketName) );

コード例 GitHub リポジトリには、S3 イベント通知をキューに直接送信する完全な例が含まれています。

に送信するバケットを設定する EventBridge

次の例では、 に通知を送信するようにバケットを設定します EventBridge。

public static String setBucketNotificationToEventBridge(String bucketName) { // Enable bucket to emit S3 Event notifications to EventBridge. s3Client.putBucketNotificationConfiguration(b -> b .bucket(bucketName) .notificationConfiguration(b1 -> b1 .eventBridgeConfiguration(SdkBuilder::build)) .build());

にイベントを送信するようにバケットを設定するときは EventBridge、イベントのタイプや が EventBridge EventBridge ディスパッチする最終的な送信先ではなく、送信先を指定するだけです。Java EventBridge の SDKクライアントを使用して、最終的なターゲットとイベントタイプを設定します。

次のコードは、オブジェクトが作成したイベント EventBridge をトピックとキューにファンアウトするように を設定する方法を示しています。

public static String configureEventBridge(String topicArn, String queueArn) { try { // Create an EventBridge rule to route Object Created notifications. PutRuleRequest putRuleRequest = PutRuleRequest.builder() .name(RULE_NAME) .eventPattern(""" { "source": ["aws.s3"], "detail-type": ["Object Created"], "detail": { "bucket": { "name": ["%s"] } } } """.formatted(bucketName)) .build(); // Add the rule to the default event bus. PutRuleResponse putRuleResponse = eventBridgeClient.putRule(putRuleRequest) .whenComplete((r, t) -> { if (t != null) { logger.error("Error creating event bus rule: " + t.getMessage(), t); throw new RuntimeException(t.getCause().getMessage(), t); } logger.info("Event bus rule creation request sent successfully. ARN is: {}", r.ruleArn()); }).join(); // Add the existing SNS topic and SQS queue as targets to the rule. eventBridgeClient.putTargets(b -> b .eventBusName("default") .rule(RULE_NAME) .targets(List.of ( Target.builder() .arn(queueArn) .id("Queue") .build(), Target.builder() .arn(topicArn) .id("Topic") .build()) ) ).join(); return putRuleResponse.ruleArn(); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return null; }

Java コード EventBridge で を使用するには、アーeventbridgeティファクトへの依存関係を Maven pom.xml ファイルに追加します。

<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>eventbridge</artifactId> </dependency>

コード例 GitHub リポジトリには、S3 イベント通知を に、次にトピック EventBridge とキューに送信する完全な例が含まれています。

S3 イベント通知APIを使用してイベントを処理する

送信先が S3 通知イベントを受信したら、S3 イベント通知 を使用してオブジェクト指向の方法でイベントを処理できますAPI。S3 イベント通知を使用してAPI、ターゲットに直接ディスパッチされたイベント通知 (最初の例 を参照) を操作できますが、 を介してルーティングされた通知は操作できません EventBridge。S3 イベント通知が現在処理APIしていない別の構造 EventBridge を含むようにバケットから送信される S3 イベント通知。

依存関係の追加

S3 イベント通知は、 SDK for Java 2.x のバージョン 2.25.11 でリリースAPIされました。

S3 イベント通知 を使用するにはAPI、次のスニペットpom.xmlに示すように、必要な依存関係要素を Maven に追加します。

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.X.X1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3-event-notifications</artifactId> </dependency> </dependencies>

1 最新バージョン

S3EventNotification クラスを使用する

JSON 文字列からS3EventNotificationインスタンスを作成する

JSON 文字列をS3EventNotificationオブジェクトに変換するには、次の例に示すように、 S3EventNotificationクラスの静的メソッドを使用します。

import software.amazon.awssdk.eventnotifications.s3.model.S3EventNotification import software.amazon.awssdk.eventnotifications.s3.model.S3EventNotificationRecord import software.amazon.awssdk.services.sqs.model.Message; public class S3EventNotificationExample { ... void receiveMessage(Message message) { // Message received from SQSClient. String sqsEventBody = message.body(); S3EventNotification s3EventNotification = S3EventNotification.fromJson(sqsEventBody); // Use getRecords() to access all the records in the notification. List<S3EventNotificationRecord> records = s3EventNotification.getRecords(); S3EventNotificationRecord record = records.stream().findFirst(); // Use getters on the record to access individual attributes. String awsRegion = record.getAwsRegion(); String eventName = record.getEventName(); String eventSource = record.getEventSource(); } }

この例では、 fromJsonメソッドはJSON文字列を S3EventNotification オブジェクトに変換します。JSON 文字列にフィールドがないと、対応する Java オブジェクトフィールドnullの値が生成され、 の余分なフィールドJSONは無視されます。

イベント通知レコードAPIsのその他については、「」のAPIリファレンスを参照してくださいS3EventNotificationRecord

S3EventNotification インスタンスをJSON文字列に変換する

次の例に示すように、 toJson (または toJsonPretty) メソッドを使用してS3EventNotificationオブジェクトをJSON文字列に変換します。

import software.amazon.awssdk.eventnotifications.s3.model.S3EventNotification public class S3EventNotificationExample { ... void toJsonString(S3EventNotification event) { String json = event.toJson(); String jsonPretty = event.toJsonPretty(); System.out.println("JSON: " + json); System.out.println("Pretty JSON: " + jsonPretty); } }

GlacierEventData、、ReplicationEventData、および のフィールドLifecycleEventDataIntelligentTieringEventData、 JSONの場合、 から除外されますnull。その他のnullフィールドは としてシリアル化されますnull

S3 オブジェクトのタグ付けイベントの toJsonPrettyメソッドの出力例を次に示します。

{ "Records" : [ { "eventVersion" : "2.3", "eventSource" : "aws:s3", "awsRegion" : "us-east-1", "eventTime" : "2024-07-19T20:09:18.551Z", "eventName" : "ObjectTagging:Put", "userIdentity" : { "principalId" : "AWS:XXXXXXXXXXX" }, "requestParameters" : { "sourceIPAddress" : "XXX.XX.XX.XX" }, "responseElements" : { "x-amz-request-id" : "XXXXXXXXXXXX", "x-amz-id-2" : "XXXXXXXXXXXXX" }, "s3" : { "s3SchemaVersion" : "1.0", "configurationId" : "XXXXXXXXXXXXX", "bucket" : { "name" : "DOC-EXAMPLE-BUCKET", "ownerIdentity" : { "principalId" : "XXXXXXXXXXX" }, "arn" : "arn:aws:s3:::XXXXXXXXXX" }, "object" : { "key" : "akey", "size" : null, "eTag" : "XXXXXXXXXX", "versionId" : null, "sequencer" : null } } } ] }

完全な例は、 を使用して Amazon SQSキューが受信した通知APIを操作する方法 GitHub を示す で利用できます。