Próbuję napisać aplikację w Pythonie, która sonduje moją kolejkę SQS i odbiera wiadomość, że nowy obiekt został dodany do zasobnika s3, trafi tam i pobierze go.

Widzę tutaj problem, podobnie jak w dokumentacji, metoda pobierania z s3 jest określona jako:

s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'FILE_NAME')

Problem polega na tym, że oczywiście znam nazwę obiektu, który chcę pobrać (np. FileOne.csv), ale teoretycznie nie powinienem, ponieważ aplikacja Python sonduje kolejkę SQS i pobiera dowolny plik, który to wywołał wiadomość do wysłania do kolejki SQS. Oprócz tego zamierzam oczywiście dodawać więcej plików w różnym czasie, z wieloma różnymi nazwami, więc jak mogę sprawić, aby mój skrypt pobierał określony plik / obiekt, który spowodował określoną wiadomość SQS?

-2
user8981199 19 grudzień 2019, 14:30
2
Czy wiadomość wysłana do Twojej kolejki SQS nie zawiera tych informacji?
 – 
larsks
19 grudzień 2019, 14:56
Przejrzałem wiadomość i nie mogę nigdzie znaleźć nazwy, to wszystko to tylko metadane
 – 
user8981199
19 grudzień 2019, 15:39
Czy to wygląda jak to?
 – 
larsks
19 grudzień 2019, 15:46
Tak, widzę, że w sekcji „object” znajduje się nazwa pliku jako „klucz”, czy muszę napisać jakiś skrypt, który może przyjąć cały json i po prostu wyciągnąć ten klucz?
 – 
user8981199
19 grudzień 2019, 15:51

2 odpowiedzi

Zgodnie z dokumentacją wiadomość, odbierz przez SQS zawiera informacje o nowo dodanym pliku w sekcji s3 każdego rekordu zdarzenia:

[...]
         "s3":{  
            "s3SchemaVersion":"1.0",
            "configurationId":"ID found in the bucket notification configuration",
            "bucket":{  
               "name":"bucket-name",
               "ownerIdentity":{  
                  "principalId":"Amazon-customer-ID-of-the-bucket-owner"
               },
               "arn":"bucket-ARN"
            },
            "object":{  
               "key":"object-key",
               "size":object-size,
               "eTag":"object eTag",
               "versionId":"object version if bucket is versioning-enabled, otherwise null",
               "sequencer": "a string representation of a hexadecimal value used to determine event sequence, 
                   only used with PUTs and DELETEs"
            }
         },
[...]

Z tych informacji można wyodrębnić zarówno nazwę zasobnika, jak i nazwę obiektu.


Jeśli potrzebujesz jakiegoś przykładu pokazującego, jak uzyskać potrzebne informacje z rekordu zdarzenia, zaktualizuj swoje pytanie, aby pokazać kod, którego używasz do odbierania wiadomości z kolejki SQS.

1
larsks 19 grudzień 2019, 15:57

To byłoby coś takiego:

for object in event['Records']:
    bucket = object['s3']['bucket']['name']
    key = object['s3']['object']['key']

    ## Do something here with bucket and key
0
John Rotenstein 20 grudzień 2019, 00:00