使用 S3 事件通知 - Amazon SDK for Java 2.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 S3 事件通知

为了帮助您监控存储桶中的活动,Amazon S3 可以在某些事件发生时发送通知。Amazon S3 用户指南提供了有关存储桶可以发送的通知的信息。

您可以使用 for Java 设置存储桶,将事件发送到四个可能SDK的目的地:

  • Amazon Simple Notification Service 主题

  • Amazon Simple Queue Service 队列

  • Amazon Lambda 函数

  • Amazon EventBridge

当你设置要向其发送事件的存储桶时 EventBridge,你可以配置 EventBridge 一条规则,将同一个事件分散到多个目的地。当您将存储桶配置为直接发送到前三个目的地之一时,只能为每个事件指定一种目标类型。

在下一节中,您将看到如何使用SDK适用于 Java 的配置存储桶,以便通过两种方式发送 S3 事件通知:直接发送到 Amazon SQS 队列和发送到 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) ); }

上面显示的代码设置了一个队列来接收两种类型的事件。方便的是,该queueConfigurations方法允许您在需要时设置多个队列目的地。此外,在该notificationConfiguration方法中,您可以设置其他目标,例如一个或多个 Amazon SNS 主题或一个或多个 Lambda 函数。以下代码段显示了一个包含两个队列和三种目的地类型的示例。

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 SDK 的 EventBridge客户端配置最终目标和事件类型。

以下代码显示了如何配置 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 中使用,请在 Maven pom.xml 文件中添加对eventbridge工件的依赖关系。

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

代码示例 GitHub 存储库包含向主题 EventBridge 和队列发送 S3 事件通知的完整示例,然后向主题和队列发送。

使用 S3 事件通知API来处理事件

目的地收到 S3 通知事件后,您可以使用 S3 事件通知以面向对象的方式处理这些事件。API您可以使用 S3 事件通知API来处理直接发送到目标的事件通知(如第一个示例所示),但不能处理通过 EventBridge发送的通知。存储桶发送的 S3 事件通知 EventBridge 包含 S3 事件通知当前API无法处理的不同结构

添加依赖关系

S3 事件通知与SDK适用API于 Java 2.x 的 2.25.11 版本一起发布。

要使用 S3 事件通知API,请将所需的依赖项元素添加到您的 Maven 中pom.xml,如以下代码段所示。

<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 (ortoJsonPretty) 方法将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); } }

GlacierEventDataReplicationEventDataIntelligentTieringEventData、和LifecycleEventData的字段将被排除在外(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 } } } ] }

中提供了一个完整的示例 GitHub ,其中显示了如何使用API来处理亚马逊SQS队列收到的通知。