Search code examples
amazon-web-servicesrustamazon-dynamodbaws-sdk

Rust AWS SDK DynamoDB Conditional Check Error Handling


Does the Rust AWS SDK provide information on where a DynamoDB conditional check failed exactly? I have multiple conditional checks and the Err response doesn't shed any light on which condition failed.

TransactionCanceledException(TransactionCanceledException { message: Some("Transaction cancelled, please refer cancellation reasons for specific reasons [None, ConditionalCheckFailed]"), cancellation_reasons: Some([CancellationReason { item: None, code: Some("None"), message: None }, CancellationReason { item: None, code: Some("ConditionalCheckFailed"), message: Some("The conditional request failed") }]), meta: ErrorMetadata { code: Some("TransactionCanceledException"), message: Some("Transaction cancelled, please refer cancellation reasons for specific reasons [None, ConditionalCheckFailed]"),

https://docs.rs/aws-sdk-dynamodb/latest/aws_sdk_dynamodb/types/error/struct.ConditionalCheckFailedException.html

let request = client
        .transact_write_items()
        .set_transact_items(Some(transact_items));

    match request.send().await {
        Err(err) => {
            match err.into_service_error() {
                aws_sdk_dynamodb::operation::transact_write_items::TransactWriteItemsError::TransactionCanceledException(i) => {
                    println!("reason: {:?}", &i.cancellation_reasons().unwrap());
                },
                _ => todo!(),
            };

[CancellationReason { item: None, code: Some("None"), message: None }, CancellationReason { item: None, code: Some("ConditionalCheckFailed"), message: Some("The conditional request failed") }]


Solution

  • Yes you need to supply the parameter return_values_on_condition_check_failure and set it to ALL_OLD:

    https://docs.rs/rusoto_dynamodb/latest/rusoto_dynamodb/struct.Put.html

    This will return the value of the item on the server side, which you can then understand why your condition failed.

    [None, ConditionalCheckFailed] this already let's you know the condition failed for the second item in your transactional batch.