使用Ruby和lambda打印s3 bucket上载对象密钥?

使用Ruby和lambda打印s3 bucket上载对象密钥?,ruby,amazon-web-services,amazon-s3,aws-lambda,aws-sdk,Ruby,Amazon Web Services,Amazon S3,Aws Lambda,Aws Sdk,以下是aws lambda为s3事件提供的测试示例: { "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion": "us-east-2", "eventTime": "1970-01-01T00:00:00.000Z", "eventName": "ObjectCreated:Put", "userIdentity":

以下是aws lambda为s3事件提供的测试示例:

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-2",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "example-bucket",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::example-bucket"
        },
        "object": {
          "key": "test/key",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}
我特别想知道,如何打印
对象:key:

特别是
“测试/按键”

我尝试过这种方法和其他几种方法,但都没有成功:

require 'json'
require 'aws-sdk-elastictranscoder'
require "aws-sdk-s3"

def lambda_handler(event:, context:)
    src_bkt = "example-bucket"
    src_key = event.Records[0].s3.object.key

    s3.getObject({
        Bucket: src_bkt,
        Key: src_key
    })
    # TODO implement
    { statusCode: 200, body: JSON.generate(src_key) }
end
我得到的响应是失败的响应,如下所示:

Response:
{
  "errorMessage": "undefined method `Records' for #<Hash:0x0000561d9afa6618>",
  "errorType": "Function<NoMethodError>",
  "stackTrace": [
    "/var/task/lambda_function.rb:7:in `lambda_handler'"
  ]
}
record = event["Records"][0]
key = record.dig *%w(s3 object key)
但我在puts/print中添加了如下内容:

put(解析[“记录”][“对象”][“键”])

我会遇到如下错误:


“errorMessage”:“没有将字符串隐式转换为整数”

如果您执行以下操作,该怎么办:

Response:
{
  "errorMessage": "undefined method `Records' for #<Hash:0x0000561d9afa6618>",
  "errorType": "Function<NoMethodError>",
  "stackTrace": [
    "/var/task/lambda_function.rb:7:in `lambda_handler'"
  ]
}
record = event["Records"][0]
key = record.dig *%w(s3 object key)

我认为,您之所以感到困惑,是因为
event
对象是一个散列,其中包含一个包含所有事件记录的数组的key
Records
。因此,您可以不转换为JSON,而是将记录取出(第一行),然后使用散列的
dig
方法访问密钥(我发现在遍历AWS事件记录散列时非常方便)

为什么要像访问对象上的方法一样访问哈希值?您使用的是额外的东西吗?我试图定义
“object”:{“key”:“test/key”,
因此,我可以使用该名称在文件上载上创建水印。我已成功使用lambda来完成此操作,但我不知道如何识别从s3上载创建触发器的文件。我需要在s3存储桶中定义一个文件,以便在该文件上创建水印。因此,我正在测试如何识别y键,因此我可以使用它作为文件名,因为数据的表示方式不同,它不是
parse[:Records][0][:s3][:object][:key]
(或者
parse['Records'][0]['s3']['object']['key'])吗
?不久前,我就开始使用准确的代码,只是使用了双引号。但是现在lambda循环。所以现在我需要弄清楚,这比我之前使用的代码要少。现在我的问题是lambda由于相同的文件上传和反复触发lambda而不断循环。你认为呢是打破循环的好方法……现在,唯一不好的是我使用的是活动存储,因此存储桶需要保持不变。@uno您是否仅在lambda最初上传时尝试触发它,而不是每次更新它?它在PUT上工作,当我更改为POST时,什么也没有发生。因此,用户上传视频时,视频水印是无效的应用,它循环…它希望它在应用水印后停止。我想做POST可以解决这个问题,但它甚至不会触发,除非是on PUT?@uno根据文档,不同的PUT和POST事件类型来自不同的API,可用于访问S3对象。如果您遇到问题,因为您正在重写同一个文件,如果您尝试对项目进行版本控制,并且仅在文件具有特定版本时处理请求,该怎么办?您能举例说明您的意思吗?您是说,只允许例如:.mov文件,然后在.mp4中输出该文件?这样它就不会循环?