Печать s3 ведро загрузить объектный ключ с лямбда с Ruby? - PullRequest
0 голосов
/ 17 марта 2019

Ниже приведен тестовый пример, предоставляемый 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"
        }
      }
    }
  ]
}

Мне особенно интересно, как бы я напечатал object: key:?

В частности "test/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'"
  ]
}

Обновление:

Я могу напечатать всю запись:

def lambda_handler(event:, context:)
    body = JSON.generate(event)
    parse = JSON.parse(body)

    puts(parse["Records"])
end

Но один, который я добавляю в put / print что-то вроде:

puts(parse["Records"]["object"]["key"])

Я получаю такие ошибки, как:

"errorMessage": "no implicit conversion of String into Integer",

1 Ответ

1 голос
/ 17 марта 2019

Что делать, если вы делаете следующее:

record = event["Records"][0]
key = record.dig *%w(s3 object key)

Причина, по которой вы запутались, я думаю, в том, что объект event - это хеш с ключом Records, который содержит массив всех записей событий. Поэтому вместо преобразования в JSON вы можете вместо этого извлечь запись (первая строка) и затем получить доступ к ключу с помощью метода dig хэша (я считаю, что это действительно удобно при обходе хэшей записей событий AWS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...