【问题标题】:Add a new item to a Dynamodb using a AWS lambda function each time a function is executed with Cloudwatch每次使用 Cloudwatch 执行函数时,使用 AWS lambda 函数将新项目添加到 Dynamodb
【发布时间】:2021-07-14 10:55:36
【问题描述】:

每次执行 Lambda 函数时,我都会尝试修改 Dynamodb 表。 具体来说,我创建了一个简单的 lambda 函数,它返回 S3 存储桶名称的列表,并且由于 Cloudwatch 的规则,该函数每分钟运行一次。 然而,正如我之前所说,我的目标是每次执行相同的函数时也更新一个 Dynamodb。具体来说,我想每次添加一个具有相同属性的新项目(假设函数执行 1000 次,我想要 1K 个项目/行)。

但是我不知道该怎么做。有什么建议?代码如下:

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
    }

提前谢谢你

【问题讨论】:

  • 代码有什么问题?任何错误
  • 没有错误,代码有效,但 Dynamodb 中的最终表格仅保留一行。相反,我想要的是每次执行文件时都会将一行添加到数据库中......也许我应该使用事件的 cloudwatch 日志 ID 而不是使用“项目”......但我不知道如何得到它
  • 也许不是使用“Item” = {“Update”:“done”},而是使用特定的日志 id = {“Update”: specific log timestamp} 但同样......我不知道怎么弄
  • 我不知道你的数据库的结构是什么,但你似乎没有为你的表设置任何主键。
  • 忘了提。我已将它手动添加到 Dynamodb。是“更新”

标签: amazon-web-services amazon-s3 aws-lambda amazon-dynamodb aws-cloudwatch-log-insights


【解决方案1】:

您的问题是PutItem 确实会覆盖现有项目,如果它们相同的话。因此,每次您尝试插入 Update=done 时,它都会覆盖同一个项目。

documentation 的第一句话说:

创建新项目,或用新项目替换旧项目。

所以你需要做的是在你的项目中加入一些独特的东西,这样就会创建一个新项目而不是覆盖旧项目。

您可以创建一个 UUID 或类似的东西,但我认为使用执行时间是有益的。这样你就可以看到你上次执行的时间等等。

from datetime import datetime

[...]

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

【讨论】:

    【解决方案2】:

    补充 Jens 所说的,这是 100% 正确的。

    您可以使用来自event 的数据。 event 看起来像这样:

    {
      "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": {}
    }
    

    id 值将是 100% 唯一的,time 值将是触发时间。

    【讨论】:

    • 呃。使用idtime 是个好主意。没想到。
    猜你喜欢
    • 2019-07-02
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2019-07-16
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    相关资源
    最近更新 更多