Search code examples
amazon-web-servicesamazon-dynamodbaws-step-functions

Why do I get 'Item is required' when updating an item in DynamoDB using AWS Step Functions?


I'm trying to push a DynamoDB record through Step Functions while setting up a conditional expression but for some reason, I'm getting the error:

There are Amazon States Language errors in your state machine definition. Fix the errors to continue. The field 'Item' is required but was missing (at /States/MyStep/Parameters)

I don't want to push an Item. I want to use an update expression.

Here's my code:

{
  "StartAt": "MyStep",
  "States": {
    "MyStep": {
      "Type": "Task",
      "Resource": "arn:aws:states:::dynamodb:putItem",
      "Parameters": {
        "TableName.$": "$.table_name",
        "Key": {
          "test_id_path_method_executor_id": {"S.$": "$.update_key.test_id_path_method_executor_id"},
          "result_timestamp": {"S.$": "$.update_key.result_timestamp"}
        },
        "ConditionExpression": "#max_db < :max_values",
        "ExpressionAttributeValues": {
          ":max_values": {"N.$": "$.result_value"}
        },
        "ExpressionAttributeNames": {
          "#max_db": "max"
        },
        "UpdateExpression": "SET #max_db = :max_values"
      },
      "Next": "EndSuccess"
    },
    "EndSuccess": {
      "Type":"Succeed"
    }
  }
}

What's the issue?


Solution

  • There are 2 main DynamoDB APIs for modifying items:

    1. PutItem
    2. UpdateItem

    In a nutshell, PutItem 'updates' the item by replacing it & because of this, it requires the replacement item to be passed. This is the API call you're using and is why you're getting The field 'Item' is required but was missing. It's correct, Item is required when using PutItem.

    Instead, you need to use UpdateItem which does not require the new item in full & will modify the attributes of an item based on an update expression (which is what you have).

    In your step function definition, replace:

    "Resource": "arn:aws:states:::dynamodb:putItem",
    

    With:

    "Resource": "arn:aws:states:::dynamodb:updateItem",