2016-04-11 8 views
6

मेरे पास एक लैम्ब्डा है जिसे डायनेमो डीबी स्ट्रीम द्वारा ट्रिगर किया जा रहा है। लैम्ब्डा कुछ प्रसंस्करण करता है और फिर एसएनएस में किसी विषय पर अधिसूचना बनाता है। आदर्श रूप से मैं पूरे नए दस्तावेज़ को अधिसूचना में शामिल करना चाहता हूं जो एसएनएस के पास जाता है ताकि डाउनस्ट्रीम ग्राहकों को डेटा प्राप्त करने के लिए डायनेमो डीबी को हिट नहीं करना पड़े।डायनामो डीबी वायर प्रोटोकॉल से देशी पायथन ऑब्जेक्ट में मैन्युअल रूप से boto3 के साथ कैसे परिवर्तित करें?

जिस समस्या में मैं चल रहा हूं वह यह है कि डायनेमोडीबी स्ट्रीम से आने वाला डेटा डायनेमोडीबी वायर प्रारूप में है (मानचित्र में डेटा प्रकार को कुंजी के रूप में शामिल किया गया है)। जब मैं डाउनस्ट्रीम क्लाइंट्स को अधिसूचना भेजता हूं, तो मैं नहीं चाहता कि उन्हें संदेश को पार्स करने के लिए डायनेमो डीबी वायर प्रारूप को समझना पड़े (उदाहरण के लिए यदि मैं एक नए अंतर्निहित डेटा स्टोर पर स्विच करता हूं तो मुझे उस प्रारूप को फिर से बनाना होगा)।

जाहिर boto3 ग्राहक एक अजगर वस्तु में इस प्रारूप को पार्स करने में सक्षम है, वहाँ अपने दम पर पार्सर का उपयोग करने की मेरे लिए एक तरीका है? जहां तक ​​मैं कह सकता हूं कि इसे डायनेमो डीबी से डेटा लाने का हिस्सा कहा जाता है लेकिन मुझे इसे स्वयं कॉल करने का कोई तरीका नहीं मिल रहा है।

उत्तर

9

मैं एक ऐसी ही स्थिति है और मैं इस तरह एक दृष्टिकोण निम्नलिखित प्रयोग किया है:

from boto3.dynamodb.types import TypeDeserializer 

deser = TypeDeserializer() 

... 
<in handler> 
    for record in event['Records']: 
     old = record['dynamodb'].get('OldImage') 
     new = record['dynamodb'].get('NewImage') 
     if old: 
      d = {} 
      for key in old: 
       d[key] = deser.deserialize(old[key]) 

यह दृष्टिकोण मेरे लिए काम करता है। परिणामस्वरूप शब्दकोश d में हैंडलर को दिए गए वायर-प्रारूप संस्करण की बजाय परिवर्तित ऑब्जेक्ट शामिल है।

संबंधित मुद्दे