通过使用aws-step-functions,我正在尝试将putItem转换为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_not_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-functions中,如何使它忽略现有的条目,但继续迭代器呢?
感谢您的帮助,并提前感谢您。
发布于 2021-03-18 19:11:03
我们只需要捕获DynamoDB.ConditionalCheckFailedException异常并继续前进,而不会抛出任何错误。
我们需要的是
"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
}
}
}Put-item错误失败,仍转移到下一个任务.
{
"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)"
}

发布于 2021-03-18 16:17:54
我觉得你有几个选择。
putItem上附加条件。如果数据是相同的,那么您可以允许它用新的数据覆盖数据,这不会真正改变任何事情。请记住,putItem与SQL INSERT不一样。它更像是一个UPSERT.Catch块,它与成功案例的位置相同。如果您希望Pass输出中的某些内容处于下一步的输入中,则可能需要先将其转到一个putItem状态。https://stackoverflow.com/questions/66694482
复制相似问题