在lambda函数中生成用于dynamodb的唯一密钥

Phi*_*ipp 2 node.js amazon-dynamodb aws-lambda serverless

DynamoDB没有为您自动生成唯一密钥的选项。

在示例中,我看到人们从字段组合中创建uid,但是有没有办法为不具有任何值组合的数据创建唯一ID,该值可以充当唯一标识符?我的问题专门针对lambda函数。

我看到的一个选择是基于时间戳创建一个uuid,末尾带有一个计数器,将其插入(或检查它是否存在),并在重复的情况下尝试递增一次直到成功。但是,这意味着我可能会在不创建条目的情况下超出lambda函数的执行时间限制。

hat*_*ted 14

如果您使用的是 Node.js 8.x,则可以使用 uuid 模块。

var AWS = require('aws-sdk'),
    uuid = require('uuid'),
    documentClient = new AWS.DynamoDB.DocumentClient();
[...]
        Item:{
            "id":uuid.v1(),
            "Name":"MyName"
        },
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 Node.js 10.x,则可以使用没有 uuid 模块的 awsRequestId。

    var AWS = require('aws-sdk'),
        documentClient = new AWS.DynamoDB.DocumentClient();
[...]
    Item:{
        "id":context.awsRequestId,
        "Name":"MyName"
    },
Run Code Online (Sandbox Code Playgroud)

  • 如果您每个请求只需要一个 UUID 并且您不使用数据库中的请求 ID 进行任何操作,那么重用 awsRequestId 是一种有趣的无需依赖项的解决方案。如果您将其存储在其他地方,可能会导致冲突,或者不要在同一请求中使用它两次,请务必小心。 (5认同)
  • `context` 是 Lambda 处理程序的第二个参数: `exports.handler = async function(event, context) {}` (3认同)

Que*_*yot 6

NPM上可用的UUID软件包正是这样做的。

https://www.npmjs.com/package/uuid

您可以选择4种不同的生成算法:

  • V1时间戳
  • V3命名空间
  • V4随机
  • V5命名空间(再次)

这将为您提供:

“一个UUID(128位)长,可以保证在空间和时间上的唯一性。” - RFC4122

生成的UUID如下所示:1b671a64-40d5-491e-99b0-da01ff1f3341
如果太长,您始终可以在Base64中对其进行编码以获得,G2caZEDVSR6ZsAAA2gH/Hw但是您将失去通过原始UUID中包含的时间和名称空间信息来操纵数据的能力(这可能无关紧要)。您)。


Muh*_*man 5

awsRequestId 看起来它实际上是 V.4 UUID(随机),下面的代码片段:

exports.handler = function(event, context, callback) {
    console.log('remaining time =', context.getRemainingTimeInMillis());
    console.log('functionName =', context.functionName);
    console.log('AWSrequestID =', context.awsRequestId);
    callback(null, context.functionName);
};
Run Code Online (Sandbox Code Playgroud)

如果你想自己生成这个,你仍然可以使用https://www.npmjs.com/package/uuidUlide(性能稍好)根据RFC-4122生成不同版本的 UUID

对于 Go 开发人员,您可以使用Google 的 UUIDPbormanSatori 中的这些包。Pborman 的性能更好,请查看这些文章和基准以获取更多详细信息。

可以在此处找到有关通用唯一标识符规范的更多信息。