0

我在 AWS step 函数中定义了一个状态机,我的一个状态是将项目存储到 DynamoDB

...
"Store item": {
  "End": true,
  "Type": "Task",
  "Resource": "arn:aws:states:::dynamodb:putItem",
  "Parameters": {
    "Item": {
      "foo": {
        "S.$": "$.data.foo"
      },
      "bar": {
        "S.$": "$.data.bar"
      },
      "baz": {
        "S.$": "$.data.baz"
      },
    },
    "TableName": "nrp_items"
  }
},
...

问题始于baz属性是可选的,即在某些情况下不存在。在这些情况下,putItem任务失败:

执行状态“存储项目”时发生错误(在事件 ID #71 处输入)。> 在输入中找不到为字段 'S.$' 指定的 JSONPath '$.data.baz'

我的备份计划是使用 lambda 来执行这种类型的操作,但我可以直接使用分putItem步任务功能来完成吗?

我想知道是否:

  1. 可以通过 JSONPath 以某种方式将我的整个$.data项目注入“项目”属性,例如:
...
"Store item": {
  "End": true,
  "Type": "Task",
  "Resource": "arn:aws:states:::dynamodb:putItem",
  "Parameters": {
    "Item": "$.data",
    "TableName": "nrp_items"
  }
},
...


2) 定义 baz 属性是可选的

4

1 回答 1

0

TL;DR我们可以处理带有"Variable": "$.baz", "IsPresent": true选择条件的可选变量来处理无条件的情况。

Amazon 状态语言规范没有可选属性:如果输入中不存在 Step Functions 将引发错误$.baz。我们可以通过插入两个分支Choice State来避免未定义的路径,其中一个分支处理 baz-exists 情况,另一个分支处理 no-baz 情况。每个分支都以Pass State继续,该状态使用Parametersdata输入重新加工为 dynamo 格式Item语法。当未定义 baz 时, put-item 任务(如您的#1)仅包含 foo-bar ,否则全部包含三个。"Item.$": "$.data"

{
  "StartAt": "HasBazChoice",
  "States": {
    "HasBazChoice": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.baz",
          "IsPresent": true,
          "Next": "MakeHasBazItem"
        }
      ],
      "Default": "MakeNoBazItem"
    },
    "MakeHasBazItem": {
      "Type": "Pass",
      "Parameters": {
        "data": {
          "foo": { "S.$": "$.foo"},
          "bar": { "S.$": "$.bar"},
          "baz": { "S.$": "$.baz"}
        }
      },
      "Next": "PutItemTask"
    },
    "MakeNoBazItem": {
      "Type": "Pass",
      "Parameters": {
        "data": {
          "foo": {"S.$": "$.foo"},
          "bar": {"S.$": "$.bar"}
        }
      },
      "Next": "PutItemTask"
    },
    "PutItemTask": {
      ...
      "Parameters": {
        "TableName": "my-table",
        "Item.$": "$.data"
      }
    },
  }
}

如果您有多个可选字段,则您的 lambda 备份计划是更好的选择 - 上述解决方法将变得笨拙。

于 2022-01-04T19:46:33.773 回答