[英]Working with DynamoDB's PutItem ConditionExpression in Java (avoid replacement of attributes)
[英]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
任務來執行嗎?
我想知道是否:
$.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繼續,它使用Parameters將data
輸入重新加工為 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.