【问题标题】:Map EventBridge JSON for an S3 event to a Java object将 S3 事件的 EventBridge JSON 映射到 Java 对象
【发布时间】:2022-07-13 02:29:50
【问题描述】:

我目前有一个配置为启用 EventBridge 事件的 S3 存储桶,并且我有一个 EventBridge 规则,该规则触发一个阶梯函数,该阶梯函数又触发一个 lambda。

我想将我在 lambda 中获得的输入映射到 AWS Java SDK (com.amazonaws:aws-lambda-java-events) 中的事件类之一,但我运气不佳。

这是我的 lambda 在我的 Java 代码中的签名:

public class DeviceAssociationLambda implements RequestHandler<S3Event, OutputObject> {
    @Override
    public OutputObject handleRequest(S3Event input, Context context) {

当我的 step 函数调用此 lambda 时,它会发送如下所示的有效负载:

{
  "version": "0",
  "id": "e31fcb40-aa08-11ec-b909-0242ac120002",
  "detail-type": "Object Created",
  "source": "aws.s3",
  "account": "123456789098",
  "time": "2022-03-22T17:07:44Z",
  "region": "eu-central-1",
  "resources": [
    "arn:aws:s3:::my-test-bucket"
  ],
  "detail": {
    "version": "0",
    "bucket": {
      "name": "my-test-bucket"
    },
    "object": {
      "key": "foo/bar.json",
      "size": 685,
      "etag": "af87c63487cc2ff6323e67ddd234f44",
      "sequencer": "00827F2232287F2343"
    },
    "request-id": "LK63256WW7E66YCC4",
    "requester": "123456789098",
    "source-ip-address": "123.123.123.123",
    "reason": "PutObject"
  }
}

尝试调试后,我发现我的 lambda 中的 S3Event 参数始终为空。这可能是因为它期望输入 JSON 格式不同(可能是:https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-content-structure.html

所以,我的问题是,Java SDK 中是否有任何标准事件对象可以处理我从 EventBridge 获得的 JSON?当然,我可以在 step 函数中对 JSON 进行一些操作,例如将 lambda 输入限制为“detail”块(如果有帮助的话)。

或者我是否只需要创建自己的输入类来映射到我作为输入获得的这个 JSON 结构?

【问题讨论】:

    标签: java amazon-s3 aws-lambda aws-java-sdk aws-event-bridge


    【解决方案1】:

    我发现了这个问题: https://github.com/aws/aws-lambda-java-libs/issues/109

    所以在我看来,Event Bridge 事件有自己的格式似乎很清楚,Java SDK 事件库目前不支持这种格式,但它正在开发中。

    但是,事件桥事件定义了我收到的 JSON 消息中的顶级元素,但我仍然有点不清楚“详细信息”元素内的格式对于我的 S3 ObjectCreated 事件是什么以及Java SDK 中是否存在我可以使用的某个类。

    【讨论】:

      【解决方案2】:

      看看这篇文章 - Link

          Configuration conf =
                  Configuration
                          .defaultConfiguration()
                          .setOptions(Option.DEFAULT_PATH_LEAF_TO_NULL, Option.SUPPRESS_EXCEPTIONS);
          DocumentContext document = JsonPath.using(conf).parse(input);
          String bucketName  = document.read("$.detail.bucket.name");
          String objectKey = document.read("detail.object.key");
          s3BucketInfo.put(CLAIMS_S3_BUCKET_NAME, bucketName);
          s3BucketInfo.put(CLAIMS_S3_SOURCE_OBJECT_KEY, objectKey);
      

      【讨论】:

        猜你喜欢
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 2019-05-27
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        相关资源
        最近更新 更多