簡體   English   中英

通過步進函數在 DynamoDB 的 putItem 中存儲可選屬性

[英]Storing optional attributes in DynamoDB's putItem via step functions

我在 AWS 步進函數中定義了一台 state 機器,我的一個狀態是將項目存儲到 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任務失敗:

執行 state 'Store item' 時發生錯誤(在事件 ID #71 中輸入)。 > 在輸入中找不到為字段 'S.$' 指定的 JSONPath '$.data.baz'

我的備份計划是使用 lambda 來執行該類型的操作,但我可以直接使用步驟 function 中的putItem任務來執行嗎?

我想知道是否:

  1. 可以通過 JSONPath 以某種方式將我的整個$.data項注入“Item”屬性,例如:
...
"Store item": {
  "End": true,
  "Type": "Task",
  "Resource": "arn:aws:states:::dynamodb:putItem",
  "Parameters": {
    "Item": "$.data",
    "TableName": "nrp_items"
  }
},
...

或者
2)定義baz屬性是可選的

TL;DR我們可以使用"Variable": "$.baz", "IsPresent": true選擇條件來處理無 baz 情況的可選變量。

Amazon 狀態語言規范沒有可選屬性:如果輸入中不存在$.baz ,Step Functions 將引發錯誤。 我們可以通過插入兩個分支選擇 State來避免未定義的路徑,其中一個分支處理 baz-exists 情況,另一個分支處理 no-baz 情況。 每個分支都以Pass State繼續,它使用Parametersdata輸入重新加工為 dynamo-format Item語法。 put-item 任務的"Item.$": "$.data" (如您的 #1 中所示)在未定義 baz 時僅包含 foo-bar ,否則全部包含三個。

{
  "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 備份計划是更好的選擇 - 上述解決方法將變得笨拙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM