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
与SQLINSERT
不同。它更像是一个UPSERT
Catch
块,并使其与成功案例的位置相同。如果您希望下一步的输入中有来自putItem
输出的内容,则可能需要先将其转到Pass
状态我们只需要捕获
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
,并将结果传递到下一步。