Skip to content

Commit bc60371

Browse files
committed
chore: refactored dynamodb samples
1 parent b207711 commit bc60371

File tree

6 files changed

+137
-116
lines changed

6 files changed

+137
-116
lines changed

docs/utilities/batch.md

Lines changed: 8 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -180,138 +180,34 @@ Processing batches from DynamoDB Streams works in three stages:
180180

181181
=== "Recommended"
182182

183-
```python hl_lines="4 9 14 20 30"
183+
```python hl_lines="4-11 14 20 32"
184184
--8<-- "examples/batch_processing/src/getting_started_dynamodb.py"
185185
```
186186

187187
=== "As a context manager"
188188

189-
```python hl_lines="4-5 9 15 23-27"
190-
import json
191-
192-
from aws_lambda_powertools import Logger, Tracer
193-
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType
194-
from aws_lambda_powertools.utilities.data_classes.dynamo_db_stream_event import DynamoDBRecord
195-
from aws_lambda_powertools.utilities.typing import LambdaContext
196-
197-
198-
processor = BatchProcessor(event_type=EventType.DynamoDBStreams)
199-
tracer = Tracer()
200-
logger = Logger()
201-
202-
203-
@tracer.capture_method
204-
def record_handler(record: DynamoDBRecord):
205-
logger.info(record.dynamodb.new_image)
206-
payload: dict = json.loads(record.dynamodb.new_image.get("Message"))
207-
...
208-
209-
@logger.inject_lambda_context
210-
@tracer.capture_lambda_handler
211-
def lambda_handler(event, context: LambdaContext):
212-
batch = event["Records"]
213-
with processor(records=batch, handler=record_handler):
214-
processed_messages = processor.process() # kick off processing, return list[tuple]
215-
216-
return processor.response()
189+
```python hl_lines="5-7 10 16 28-30 33"
190+
--8<-- "examples/batch_processing/src/getting_started_dynamodb_context_manager.py"
217191
```
218192

219193
=== "As a decorator (legacy)"
220194

221-
```python hl_lines="4-5 9 15 22 24"
222-
import json
223-
224-
from aws_lambda_powertools import Logger, Tracer
225-
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, batch_processor
226-
from aws_lambda_powertools.utilities.data_classes.dynamo_db_stream_event import DynamoDBRecord
227-
from aws_lambda_powertools.utilities.typing import LambdaContext
228-
229-
230-
processor = BatchProcessor(event_type=EventType.DynamoDBStreams)
231-
tracer = Tracer()
232-
logger = Logger()
233-
234-
235-
@tracer.capture_method
236-
def record_handler(record: DynamoDBRecord):
237-
logger.info(record.dynamodb.new_image)
238-
payload: dict = json.loads(record.dynamodb.new_image.get("Message"))
239-
...
240-
241-
@logger.inject_lambda_context
242-
@tracer.capture_lambda_handler
243-
@batch_processor(record_handler=record_handler, processor=processor)
244-
def lambda_handler(event, context: LambdaContext):
245-
return processor.response()
195+
```python hl_lines="4-11 14 20 31"
196+
--8<-- "examples/batch_processing/src/getting_started_dynamodb_decorator.py"
246197
```
247198

248199
=== "Sample response"
249200

250201
The second record failed to be processed, therefore the processor added its sequence number in the response.
251202

252-
```python
253-
{
254-
'batchItemFailures': [
255-
{
256-
'itemIdentifier': '8640712661'
257-
}
258-
]
259-
}
203+
```json
204+
--8<-- "examples/batch_processing/src/getting_started_dynamodb_event.json"
260205
```
261206

262207
=== "Sample event"
263208

264209
```json
265-
{
266-
"Records": [
267-
{
268-
"eventID": "1",
269-
"eventVersion": "1.0",
270-
"dynamodb": {
271-
"Keys": {
272-
"Id": {
273-
"N": "101"
274-
}
275-
},
276-
"NewImage": {
277-
"Message": {
278-
"S": "failure"
279-
}
280-
},
281-
"StreamViewType": "NEW_AND_OLD_IMAGES",
282-
"SequenceNumber": "3275880929",
283-
"SizeBytes": 26
284-
},
285-
"awsRegion": "us-west-2",
286-
"eventName": "INSERT",
287-
"eventSourceARN": "eventsource_arn",
288-
"eventSource": "aws:dynamodb"
289-
},
290-
{
291-
"eventID": "1",
292-
"eventVersion": "1.0",
293-
"dynamodb": {
294-
"Keys": {
295-
"Id": {
296-
"N": "101"
297-
}
298-
},
299-
"NewImage": {
300-
"SomethingElse": {
301-
"S": "success"
302-
}
303-
},
304-
"StreamViewType": "NEW_AND_OLD_IMAGES",
305-
"SequenceNumber": "8640712661",
306-
"SizeBytes": 26
307-
},
308-
"awsRegion": "us-west-2",
309-
"eventName": "INSERT",
310-
"eventSourceARN": "eventsource_arn",
311-
"eventSource": "aws:dynamodb"
312-
}
313-
]
314-
}
210+
--8<-- "examples/batch_processing/src/getting_started_dynamodb_response.json"
315211
```
316212

317213
### Partial failure mechanics

examples/batch_processing/src/getting_started_dynamodb.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818

1919
@tracer.capture_method
2020
def record_handler(record: DynamoDBRecord):
21-
logger.info(record.dynamodb.new_image) # type: ignore[union-attr]
22-
payload: dict = json.loads(record.dynamodb.new_image.get("Message")) # type: ignore[union-attr,arg-type]
23-
logger.info(payload)
24-
...
21+
if record.dynamodb and record.dynamodb.new_image:
22+
logger.info(record.dynamodb.new_image)
23+
message = record.dynamodb.new_image.get("Message")
24+
if message:
25+
payload: dict = json.loads(message)
26+
logger.info(payload)
2527

2628

2729
@logger.inject_lambda_context
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import json
2+
3+
from aws_lambda_powertools import Logger, Tracer
4+
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType
5+
from aws_lambda_powertools.utilities.data_classes.dynamo_db_stream_event import (
6+
DynamoDBRecord,
7+
)
8+
from aws_lambda_powertools.utilities.typing import LambdaContext
9+
10+
processor = BatchProcessor(event_type=EventType.DynamoDBStreams)
11+
tracer = Tracer()
12+
logger = Logger()
13+
14+
15+
@tracer.capture_method
16+
def record_handler(record: DynamoDBRecord):
17+
if record.dynamodb and record.dynamodb.new_image:
18+
logger.info(record.dynamodb.new_image)
19+
message = record.dynamodb.new_image.get("Message")
20+
if message:
21+
payload: dict = json.loads(message)
22+
logger.info(payload)
23+
24+
25+
@logger.inject_lambda_context
26+
@tracer.capture_lambda_handler
27+
def lambda_handler(event, context: LambdaContext):
28+
batch = event["Records"]
29+
with processor(records=batch, handler=record_handler):
30+
processed_messages = processor.process() # kick off processing, return list[tuple]
31+
logger.info(f"Processed ${len(processed_messages)} messages")
32+
33+
return processor.response()
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import json
2+
3+
from aws_lambda_powertools import Logger, Tracer
4+
from aws_lambda_powertools.utilities.batch import (
5+
BatchProcessor,
6+
EventType,
7+
batch_processor,
8+
)
9+
from aws_lambda_powertools.utilities.data_classes.dynamo_db_stream_event import (
10+
DynamoDBRecord,
11+
)
12+
from aws_lambda_powertools.utilities.typing import LambdaContext
13+
14+
processor = BatchProcessor(event_type=EventType.DynamoDBStreams)
15+
tracer = Tracer()
16+
logger = Logger()
17+
18+
19+
@tracer.capture_method
20+
def record_handler(record: DynamoDBRecord):
21+
if record.dynamodb and record.dynamodb.new_image:
22+
logger.info(record.dynamodb.new_image)
23+
message = record.dynamodb.new_image.get("Message")
24+
if message:
25+
payload: dict = json.loads(message)
26+
logger.info(payload)
27+
28+
29+
@logger.inject_lambda_context
30+
@tracer.capture_lambda_handler
31+
@batch_processor(record_handler=record_handler, processor=processor)
32+
def lambda_handler(event, context: LambdaContext):
33+
return processor.response()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"batchItemFailures": [
3+
{
4+
"itemIdentifier": "8640712661"
5+
}
6+
]
7+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
{
2+
"Records": [
3+
{
4+
"eventID": "1",
5+
"eventVersion": "1.0",
6+
"dynamodb": {
7+
"Keys": {
8+
"Id": {
9+
"N": "101"
10+
}
11+
},
12+
"NewImage": {
13+
"Message": {
14+
"S": "failure"
15+
}
16+
},
17+
"StreamViewType": "NEW_AND_OLD_IMAGES",
18+
"SequenceNumber": "3275880929",
19+
"SizeBytes": 26
20+
},
21+
"awsRegion": "us-west-2",
22+
"eventName": "INSERT",
23+
"eventSourceARN": "eventsource_arn",
24+
"eventSource": "aws:dynamodb"
25+
},
26+
{
27+
"eventID": "1",
28+
"eventVersion": "1.0",
29+
"dynamodb": {
30+
"Keys": {
31+
"Id": {
32+
"N": "101"
33+
}
34+
},
35+
"NewImage": {
36+
"SomethingElse": {
37+
"S": "success"
38+
}
39+
},
40+
"StreamViewType": "NEW_AND_OLD_IMAGES",
41+
"SequenceNumber": "8640712661",
42+
"SizeBytes": 26
43+
},
44+
"awsRegion": "us-west-2",
45+
"eventName": "INSERT",
46+
"eventSourceARN": "eventsource_arn",
47+
"eventSource": "aws:dynamodb"
48+
}
49+
]
50+
}

0 commit comments

Comments
 (0)