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

AWS State Machine - Update DynamoDB table is replacing the ID with "$.id"


I have a step where I want to update a object on a DynamoDB table.

Everything works except its creating a new object with the ID value of "$.id", instead of updating where the ID I pass in.

This is my first state machine attempt so what have I done wrong here?

    "update-table-processing": {
      "Type": "Task",
      "Resource": "arn:aws:states:::dynamodb:updateItem",
      "ResultPath": "$.updateResult",
      "Parameters": {
        "TableName": "Projects",
        "Key": {
          "id": {
            "S": "$.id"
          }
        },
        "UpdateExpression": "SET step = :updateRef",
        "ExpressionAttributeValues": {
          ":updateRef": {
            "S": "processing"
          }
        },
        "ReturnValues": "ALL_NEW"
      },
      "Next": "create-project"
    },

Do I somehow need to tell DynamoDB to evaluate "$.id" rather than treating it as a "S", or is this happening because I've not mapped the input correctly that the "$.id" value is empty?

My input looks like:

{
    "id": "f8185735-c90d-4d4e-8689-cec68a48b1bc"
}

Solution

  • In order to specify data from your input you have to use a Key-Value pair, with the key value ending in a ".$". So to fix this you need to change it to:

        "Key": {
          "id": {
            "S.$": "$.id"
          }
        },
    

    Using the above it should correctly resolve to the value from your input instead of the string value "$.id".

    References - https://docs.aws.amazon.com/step-functions/latest/dg/input-output-inputpath-params.html#input-output-parameters