Amazon dynamodb 阶跃函数中的dynamodb条件表达式

Amazon dynamodb 阶跃函数中的dynamodb条件表达式,amazon-dynamodb,aws-step-functions,Amazon Dynamodb,Aws Step Functions,通过使用aws step函数我试图将项目放入dynamodb 这里是.yml的摘录,它按预期工作 ... AddingURLs: Type: Map ItemsPath: "$.vidPosts" Parameters: vidPostsIndex.$: "$$.Map.Item.Index" vidPosts.$: "$$.Map.Item.Value" Iterator: Start

通过使用
aws step函数
我试图
将项目
放入
dynamodb

这里是
.yml
的摘录,它按预期工作

...

AddingURLs:
  Type: Map
  ItemsPath: "$.vidPosts"
  Parameters:
    vidPostsIndex.$: "$$.Map.Item.Index" 
      vidPosts.$: "$$.Map.Item.Value"

  Iterator:
    StartAt: AddingURLIntoDynamoDB
    Comment: Looping over urls and adding them into the db

    States:
      AddingURLIntoDynamoDB:
        Type: Task
        Resource: arn:aws:states:::dynamodb:putItem
        ResultPath: null
        Parameters:
          TableName: my-table-table-name
          Item:
            videoID:
              S.$: "$.vidPosts.[0]"
            urls:
              S.$: "$.vidPosts.[1]"
          ConditionExpression: "attribute_not_exists(videoID)"    

        End: true

  Next: EndStepFunctions

EndStepFunctions:
  Comment: This marks the end of a step functions
  Type: Succeed
但是下一次调用此状态时,如果它遇到一个已经存在的条目,因为,
ConditionExpression:“attribute\u not\u exists(videoID)”
,它会抛出

{
  executionArn: 'arn:aws:states:us-east-2:aaabbbccc:execution:xxxStateMachine:XXX-YYY-ZZZ',
  stateMachineArn: 'arn:aws:states:us-east-2:aaabbbccc:stateMachine:xxxStateMachine',
  name: '9814ce93-bc42-4f31-a742-089ea7db9ad6',
  status: 'FAILED',
  startDate: 2021-03-18T15:30:45.912Z,
  stopDate: 2021-03-18T15:30:52.386Z,
  input: '{}',
  inputDetails: { included: true },
  error: 'DynamoDB.ConditionalCheckFailedException',
  cause: 'The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: bfd76f51-567b-439c-9a39-5a1643e75a69; Proxy: null)'
}
我的问题是在aws step函数中,如何使其忽略现有条目,但继续使用迭代器


感谢您的帮助,并提前向您表示感谢。

我想您在这里有一些选择

  • 不要在
    putItem
    上设置条件。如果数据是相同的,那么您可以允许它用新数据覆盖数据,这实际上不会改变任何东西。请记住,
    putItem
    与SQL
    INSERT
    不同。它更像是一个
    UPSERT
  • 在步骤中添加一个
    Catch
    块,并使其与成功案例的位置相同。如果您希望下一步的输入中有来自
    putItem
    输出的内容,则可能需要先将其转到
    Pass
    状态
  • 在执行get的put之前添加一个步骤,然后在条件步骤上执行put。如果在某些情况下,您可以在很近的距离内获得对同一记录的多个调用,那么这可能不是最佳选择,因为您可能都点击了get,但看不到记录,然后两者都将执行put(在这种情况下,一个将失败)。如果你永远不会有这种情况,那么这将工作

  • 我们只需要捕获
    DynamoDB.ConditionalCheckFailedException
    exception并向前移动,而不抛出任何错误

    我们需要的是

      "Catch": [
        {
          "ErrorEquals": [
            "DynamoDB.ConditionalCheckFailedException"
          ],
          "Next": "FinalStep"
        }
      ]
    
    这里是完整的步骤函数

    {
      "StartAt": "put-item",
      "States": {
        "put-item": {
          "Next": "FinalStep",
          "Catch": [
            {
              "ErrorEquals": [
                "DynamoDB.ConditionalCheckFailedException"
              ],
              "Next": "FinalStep"
            }
          ],
          "Type": "Task",
          "Resource": "arn:aws:states:::dynamodb:putItem",
          "Parameters": {
            "Item": {
              "pk": {
                "S": "1"
              },
              "test": {
                "S": "value"
              }
            },
            "TableName": "test",
            "ConditionExpression": "attribute_not_exists(#videoID)",
            "ExpressionAttributeNames": {
              "#videoID": "videoID"
            }
          }
        },
        "FinalStep": {
          "Type": "Pass",
          "End": true
        }
      }
    }
    
    放置项目失败,出现错误,仍移动到下一个任务

    {
      "Error": "DynamoDB.ConditionalCheckFailedException",
      "Cause": "The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: xxxx-xxx-xxx-xxx-xxxxx; Proxy: null)"
    }
    

    谢谢您的回复@JasonWadsworth。1). 它不需要覆盖现有条目,因此需要
    putItem
    沿着
    conditionalPression
    。2). 我试图给它添加一个
    Catch
    ,但是我没能把它做好,但是下面的@BaluVyamajala让它完全按照它应该的方式工作,见3)。我没有用另一个解决方案来补充这个问题,而是在寻找真正的100%
    step函数
    唯一的解决方案第三个选项仍然在step函数中。您可以在step函数中调用DynamoDB上的
    getItem
    ,并将结果传递到下一步。