首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Step函数中的dynamodb ConditionExpression

Step函数中的dynamodb ConditionExpression
EN

Stack Overflow用户
提问于 2021-03-18 15:49:04
回答 2查看 669关注 0票数 1

通过使用aws-step-functions,我正在尝试将putItem转换为dynamodb

下面是.yml的一个摘录,它按预期工作。

代码语言:javascript
复制
...

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_not_exists(videoID)",它应该抛出,

代码语言:javascript
复制
{
  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-functions中,如何使它忽略现有的条目,但继续迭代器呢?

感谢您的帮助,并提前感谢您。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-18 19:11:03

我们只需要捕获DynamoDB.ConditionalCheckFailedException异常并继续前进,而不会抛出任何错误。

我们需要的是

代码语言:javascript
复制
  "Catch": [
    {
      "ErrorEquals": [
        "DynamoDB.ConditionalCheckFailedException"
      ],
      "Next": "FinalStep"
    }
  ]

这是完整的步骤函数。

代码语言:javascript
复制
{
  "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
    }
  }
}

Put-item错误失败,仍转移到下一个任务.

代码语言:javascript
复制
{
  "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)"
}

票数 1
EN

Stack Overflow用户

发布于 2021-03-18 16:17:54

我觉得你有几个选择。

  1. 不要在putItem上附加条件。如果数据是相同的,那么您可以允许它用新的数据覆盖数据,这不会真正改变任何事情。请记住,putItem与SQL INSERT不一样。它更像是一个UPSERT.
  2. Add,一个Catch块,它与成功案例的位置相同。如果您希望Pass输出中的某些内容处于下一步的输入中,则可能需要先将其转到一个putItem状态。
  3. 在put之前添加一个步骤,该步骤执行一个get,然后在一个条件步骤上执行put。如果存在这样的情况,那么这可能不是最好的选择,在这种情况下,您可以在接近的范围内对同一记录进行多次调用,因为您可以同时命中get而看不到记录,然后两者都会执行put操作(在这种情况下,其中一个会失败)。如果你永远不会有这种情况,那么这个就可以了。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66694482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档