如何使用 Step Functions 中 Lambda 的输出在 DynamoDB 中插入空字符串?

How to insert empty string in DynamoDB using the output of a Lambda in Step Functions?

我正在尝试使用 Step Functions 将调用 Lex 的 Lambda 的输出保存到 DynamoDB。

Lex 响应中的 intentName 有时是 null(未知)。问题是在将响应保存到 DynamoDB 的状态(任务)中,由于这个空字符串,我从 DynamoDB 收到错误。

是否有任何解决方法,可能使用 JsonPath 或 Step Function 的状态机图,以便插入 null 或者可能不插入特定的 属性 DynamoDB?

这是状态机的JSON:

{
  "StartAt": "ProcessLex",
  "States": {
    "ProcessLex": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:<Region>:<Account Id>:function:getIntent",
      "ResultPath": "$.lexResult",
      "Next": "ChoiceIfIntent"
    },
    "SaveToDynamo": {
      "Type": "Task",
      "Resource": "arn:aws:states:::dynamodb:putItem",
      "Parameters": {
        "TableName": "MyTable",
        "Item": {
          "dateTime": {
            "S.$": "$.dateTime"
          },
          "intentName": {
            "S.$": "$.lexResult.intentName"
          },
          "analysis": {
            "M.$": "$.lexResult.sentimentResponse"
          }
        }
      },
      "End": true
    },
    "Comprehend": {
      "Comment": "To be implemented later",
      "Type": "Pass",
      "End": true
    },
    "ChoiceIfIntent": {
      "Type": "Choice",
      "Choices": [
        {

            "Variable": "$.lexResult.intentName",
            "StringGreaterThanEquals": "",

          "Next": "SaveToDynamo"
        }        
      ],
        "Default": "Comprehend"
    }
  }
}

问题不是 null 值,问题是在带有 PutItem Api 的 DynamoDB 中,您 不能 插入空字符串。

我知道这很令人沮丧,但最快的解决方案是将 """ 替换为 NULL

我更喜欢的解决方案是在您的 DynamoDb 客户端设置中将 convertEmptyValue 设置为 true。

const dynamodb = new AWS.DynamoDB.DocumentClient({ convertEmptyValues: true })

更新

从昨天开始,DynamoDB 支持字符串为空值! 看看here.