V_20_sl
V_20_sl

Reputation: 45

Add a new item to a Dynamodb using a AWS lambda function each time a function is executed with Cloudwatch

I'm trying to modify a Dynamodb table each time a Lambda function is executed. Specifically, I create a simple lambda function that returns a list of S3 bucket names and this function run each minute thanks to a Cloudwatch's rule. However, as I said before, my goal is to also update a Dynamodb each time the same function is executed. Specifically I want to add each time a new Item with the same attribute (so let's say the function is executed 1000 times, I want 1K items/rows).

However I don't know how to do it. Any suggestions? Here's the code:

import json
import boto3

s3 = boto3.resource('s3')
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Table')

def lambda_handler(event, context):
    
    bucket_list = []
    for b in s3.buckets.all():
        print(b.name)
        bucket_list.append(b.name)
        
    response = "done"
    table.put_item(
        Item = {
            "Update": response
        }
        )
    return {
        "statusCode": 200,
        "body": bucket_list
    }

Thank you in advance

Upvotes: 0

Views: 728

Answers (2)

Jason Wadsworth
Jason Wadsworth

Reputation: 8887

Adding to what Jens stated, which is 100% correct.

You could use data from the event. The event will look something like this:

{
  "id": "cdc73f9d-aea9-11e3-9d5a-835b769c0d9c",
  "detail-type": "Scheduled Event",
  "source": "aws.events",
  "account": "123456789012",
  "time": "1970-01-01T00:00:00Z",
  "region": "us-west-2",
  "resources": [
    "arn:aws:events:us-west-2:123456789012:rule/ExampleRule"
  ],
  "detail": {}
}

The id value will be 100% unique, and the time value will be the time it was triggered.

Upvotes: 2

Jens
Jens

Reputation: 21510

Your problem is that PutItem does overwrite exiting items, if they are the same. So every time you try to insert Update=done, it just overwrites the same item.

The very first sentence of the documentation states:

Creates a new item, or replaces an old item with a new item.

So what you need to do is to put something in your item that is unique, so that a new item is created instead of the old one being overwritten.

You could create a UUID or something like that, but I think it would be beneficial to use the time of execution. This way you could see when your last execution was etc.

from datetime import datetime

[...]

table.put_item(
    Item = {
        "Update": response,
        "ProcessingTime": datetime.now().isoformat()
    }
)

Upvotes: 2

Related Questions