Aws lambda can';t从lambda调用AWS DynamoDB DocumentClient上的Transact-Write

Aws lambda can';t从lambda调用AWS DynamoDB DocumentClient上的Transact-Write,aws-lambda,amazon-dynamodb,Aws Lambda,Amazon Dynamodb,我有一个lambda函数(node.js),需要在两个DynamoDB表上执行事务 let ddb = new AWS.DynamoDB.DocumentClient(); ddb.transactWrite(params, function(err, data) { if (err) { ... } else { ... } }); 当我尝试使用它时,我收到错误: ddb.transactWrite is not a func

我有一个lambda函数(node.js),需要在两个DynamoDB表上执行事务

let ddb = new AWS.DynamoDB.DocumentClient();

  ddb.transactWrite(params, function(err, data) {
    if (err) {
      ...
    }
    else {
      ...
    }
  });
当我尝试使用它时,我收到错误:

ddb.transactWrite is not a function
我还尝试使用AWS.DynamoDB.TransactionWriteItems(),结果相同

2019年9月更新 Lambda运行时环境在过去几个月的某个时间点进行了更新-根据以下说明,这些是每个运行时环境(包括SDK)SDK的最新版本:

  • nodejs10.x-AWS SDK 2.488.0
  • nodejs8.10-AWS SDK 2.488.0
  • 蟒蛇3.7-boto3-1.9.42 botocore-1.12.42
  • 蟒蛇3.6-boto3-1.7.74 botocore-1.10.74
  • ruby2.5-AWS SDK 3.0.1

旧职位 从(我的)重点:

底层AWS Lambda执行环境包括以下内容 软件和图书馆

操作系统–Amazon Linux

AMI–amzn-AMI-hvm-2017.03.1.20170812-x86_64-gp2

Linux内核–4.14.77-70.59.amzn1.x86_64

AWS JavaScript SDK–2.290.0

Python SDK(Boto 3)–3-1.7.74 botocore-1.10.74

撰写本文时的最新版本ist 2.382—Lambda执行环境中的默认版本已存在5个月

我刚核实过,文件是最新的:

console.log("AWS SDK Version " + AWS.VERSION) // AWS SDK Version 2.290.0
DynamoDB交易已被取消,大约3个月前


最有可能的是,
Transact-Write
尚未在该版本中实现-您可能需要包括您自己的版本。

正如Maurice指出的,问题在于Lambda没有使用aws sdk的最新版本(至少在我写这篇文章的时候没有)

要使用最新版本,请执行以下操作:

  • 下载lambda部署包
  • 使用
    npm安装aws sdk
    安装最新版本的aws sdk
  • 重新上传lambda内部的包
此时,当您使用
require('aws-sdk')导入aws sdk时,lambda使用最新版本的sdk

注意:aws sdk包将lambda的包大小增加到3MB以上,因此您将无法在内联代码编辑器中编辑代码。最好的选择是在本地编辑代码并使用CLI上载。

更新您的运行时 在AWS SDK的更高版本中添加了
Transact-Write
功能。要访问更新的AWS SDK,请将Lambda函数切换到更新的运行时

AWS不会更新旧运行时的AWS SDK版本。例如,如果您使用的是过时的
nodejs8.10
运行时,则只能访问不支持
transact-write
的AWS SDK版本
2.290.0
。如果您将运行时切换到
nodejs10.x
,您将获得支持DynamoDB事务的版本
2.437.0
(在本文发布时)

在此处查看每个运行时可用的SDK版本的完整列表:

如何更新您的运行时 要更新运行时,请单击Lambda函数“函数代码”部分中的“运行时”下拉列表,然后选择更新的运行时


另一个答案是,将aws sdk与lambda一起使用会使其超过3MB,这意味着您无法使用亚马逊的在线代码编辑器。不要这样做,而是创建一个包含要使用的aws sdk版本的层。您的所有lambda都可以共享该层,这有助于加快部署速度。使用AWS Javscript SDK创建层的良好说明:不需要手动创建层并包含AWS SDK。您只需切换到较新的Lambda运行时即可获得SDK的最新版本。这是不正确的。要获取最新版本的AWS SDK,必须使用最新的Lambdaruntime@Tyler在SDK的新版本发布和将其引入Lambda环境之间通常会有延迟,这就是问题所在-因此,在这种情况下,您不能仅依赖预装版本。@Maurice完全正确。只需更新Lambda运行时以使用最新版本的AWS SDK即可。我相信
nodejs10.x
运行时支持DynamoDB事务。