2016-12-07 6 views
1

Всякий раз, когда файл загружается на S3, я ценю, что S3 может написать сообщение SQS. Однако доступ к имени файла («ключ»: «filename.txt») в теле сообщения SQS из Python является немного проблематичным, поскольку это словарь, содержащий список с несколькими словарями.Python, получающий сообщение AWS SQS, созданное S3

Кто-нибудь обращался к имени файла в теле сообщения SQS, когда , что сообщение было создано событием S3?

Полное сообщение:

{ 
    "Records": [{ 
     "eventVersion": "2.0", 
     "eventSource": "aws:s3", 
     "awsRegion": "us-west-2", 
     "eventTime": "2016-12-04T22:14:52.325Z", 
     "eventName": "ObjectCreated:Put", 
     "userIdentity": { 
      "principalId": "ABC123" 
     }, 
     "requestParameters": { 
      "sourceIPAddress": "12.345.687.899" 
     }, 
     "responseElements": { 
      "x-amz-request-id": "ABC123", 
      "x-amz-id-2": "ABCDEF" 
     }, 
     "s3": { 
      "s3SchemaVersion": "1.0", 
      "configurationId": "MyQueueName", 
      "bucket": { 
       "name": "mybucket", 
       "ownerIdentity": { 
        "principalId": "ABC123" 
       }, 
       "arn": "arn:aws:s3:::mybucket" 
      }, 
      "object": { 
       "key": "filename.txt", 
       "size": 2310, 
       "eTag": "defg123", 
       "sequencer": "00345" 
      } 
     } 
    }] 
} 
+1

Вы уверены, что разве стандартное сообщение ответа JSON, что вы должны разобрать? –

+0

Кроме того, '' object ":" key ":" filename.txt "' is is valid JSON или синтаксис словаря Python, поэтому я думаю, что вам не хватает каких-либо управляющих символов –

+0

@ cricket_007 Я думаю, что это опечатка - это сообщение было дезинфицировано , Это фактически «объект»: {«ключ»: «filename.txt», «размер»: ... '... да, стандартный JSON. OP необходимо извлечь (псевдокод) from_json (this) -> Record [0] -> object-> key. Возможно, вы можете помочь с этим? Я очень хорошо знаком с этой структурой данных JSON, но я не человек-питон. Массив записей всегда имеет только 1 член (эта структура данных является общей, используемой мультиплексированными службами AWS, поэтому это массив). –

ответ

1

Я исправил свой вопрос, чтобы быть надлежащим JSON.

import json 
# message = get_sqs_message() 
message = json.loads(message) 
print(message["Records"][0]["s3"]["object"]["key"]) 

Если выход filename.txt

+0

Спасибо за помощь. Я получаю сообщение об ошибке -> TypeError: объект JSON должен быть str, а не «list». Следующие 3 команды работают и возвращают имя файла: message = queue.receive_messages (MaxNumberOfMessages = 1) jsonmsg = json.loads (сообщение [0] .body) jsonmsg ["Records"] [0] ["s3 "] [" object "] [" key "] – RandomTask

+0

Да, я не знал формат сообщения, которое вы получали. Но, вы поняли это ..'message [0] .body' –