AWS Stepfunction,ValidationException
AWS Stepfunction, ValidationException
我在使用 stepfunction 从 AWS dynamoDB 获取数据时收到错误“提供的关键元素与模式不匹配”。
stepfunction 定义
{
"Comment": "This is your state machine",
"StartAt": "Choice",
"States": {
"Choice": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.data.Type",
"StringEquals": "GET",
"Next": "DynamoDB GetItem"
},
{
"Variable": "$.data.Type",
"StringEquals": "PUT",
"Next": "DynamoDB PutItem"
}
]
},
"DynamoDB GetItem": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "KeshavDev",
"Key": {
"Email": {
"S": "$.Email"
}
}
},
"End": true
},
"DynamoDB PutItem": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:putItem",
"Parameters": {
"TableName": "KeshavDev",
"Item": {
"City": {
"S.$": "$.City"
},
"Email": {
"S.$": "$.Email"
},
"Address": {
"S.$": "$.Address"
}
}
},
"InputPath": "$.data",
"End": true
}
}
}
输入
{
"data": {
"Type": "GET",
"Email": "demo@gmail.com"
}
}
错误
{ "resourceType": "dynamodb", "resource": "getItem", "error":
"DynamoDB.AmazonDynamoDBException", "cause": "The provided key
element does not match the schema (Service: AmazonDynamoDBv2; Status
Code: 400; Error Code: ValidationException; Request ID:
a78c3d7a-ca3f-4483-b986-1735201d4ef2; Proxy: null)" }
与 AWS documentation 相比,我发现 getItem
任务存在一些潜在问题。
- 我认为
Key
字段需要 S.$
类似于您在 putItem
任务中的内容。
- 没有
ResultPath
属性告诉状态机将结果放在哪里。
- 你的路径可能不对,试试
$.data.Email
"DynamoDB GetItem": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "KeshavDev",
"Key": {
"Email": {
"S.$": "$.data.Email"
}
}
},
"ResultPath": "$.DynamoDB",
"End": true
},
老实说,我不确定是否所有这些因素之一都导致了验证错误,这些是一些可以试验的东西。
另一方面,Amazon State Language 有一些开源 validators,但对于这种情况,它们不是很有帮助,并说您的代码是有效的。
它的工作原理,在 JD D 上面提到了步骤,并且还通过在步骤函数定义中添加了两个键。
DynamoDb 有两个键。
- 主分区键
- 主排序键
我在使用 stepfunction 从 AWS dynamoDB 获取数据时收到错误“提供的关键元素与模式不匹配”。
stepfunction 定义
{
"Comment": "This is your state machine",
"StartAt": "Choice",
"States": {
"Choice": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.data.Type",
"StringEquals": "GET",
"Next": "DynamoDB GetItem"
},
{
"Variable": "$.data.Type",
"StringEquals": "PUT",
"Next": "DynamoDB PutItem"
}
]
},
"DynamoDB GetItem": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "KeshavDev",
"Key": {
"Email": {
"S": "$.Email"
}
}
},
"End": true
},
"DynamoDB PutItem": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:putItem",
"Parameters": {
"TableName": "KeshavDev",
"Item": {
"City": {
"S.$": "$.City"
},
"Email": {
"S.$": "$.Email"
},
"Address": {
"S.$": "$.Address"
}
}
},
"InputPath": "$.data",
"End": true
}
}
}
输入
{
"data": {
"Type": "GET",
"Email": "demo@gmail.com"
}
}
错误
{ "resourceType": "dynamodb", "resource": "getItem", "error": "DynamoDB.AmazonDynamoDBException", "cause": "The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: a78c3d7a-ca3f-4483-b986-1735201d4ef2; Proxy: null)" }
与 AWS documentation 相比,我发现 getItem
任务存在一些潜在问题。
- 我认为
Key
字段需要S.$
类似于您在putItem
任务中的内容。 - 没有
ResultPath
属性告诉状态机将结果放在哪里。 - 你的路径可能不对,试试
$.data.Email
"DynamoDB GetItem": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "KeshavDev",
"Key": {
"Email": {
"S.$": "$.data.Email"
}
}
},
"ResultPath": "$.DynamoDB",
"End": true
},
老实说,我不确定是否所有这些因素之一都导致了验证错误,这些是一些可以试验的东西。
另一方面,Amazon State Language 有一些开源 validators,但对于这种情况,它们不是很有帮助,并说您的代码是有效的。
它的工作原理,在 JD D 上面提到了步骤,并且还通过在步骤函数定义中添加了两个键。 DynamoDb 有两个键。
- 主分区键
- 主排序键