Bug: CachePersistenceLayer raises IdempotencyValidationError on retries with the same payload when payload_validation_jmespath is set

オープン 初心者向け
#8,655 コメント 5 件 リアクション 0 件 担当者 1 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@thebadalov がすでに取り組んでいます。

2026年10月24日 から。

  • #8656 @thebadalov による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
83/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python, redis
領域
backend, databases

調査の方向性

Redis の永続化レイヤーにある CachePersistenceLayer._update_record から始め、そのマッピングを _put_in_progress_record および DynamoDB レイヤーの _update_record と比較してください。test_idempotent_function_and_lambda_handler_redis_validation の隣に、同じペイロードで再試行し、保存されたレスポンスが返されることを検証する回帰ケースを追加してください。ペイロード検証ハッシュが処理完了後も保持され、再試行が成功すれば完了です。

索引モデルが issue の本文から書いたものです。

説明

bug good first issue idempotency
Expected Behaviour

With CachePersistenceLayer (Redis/Valkey) and payload_validation_jmespath set, a retry with the same payload should return the stored response, the same way it does with DynamoDBPersistenceLayer.

Current Behaviour

The second call with the exact same payload raises IdempotencyValidationError: Payload does not match stored record for this event key.

_put_in_progress_record stores the payload hash under validation_key_attr, but _update_record overwrites the whole key with a new SET that only contains data, status and expiration. The hash is lost when the record moves to COMPLETED, so on the next call payload_hash is read back as "" and never matches.

DynamoDBPersistenceLayer._update_record writes the validation key when payload_validation_enabled is true, so only the Redis layer is affected.

Code snippet
from aws_lambda_powertools.utilities.idempotency import IdempotencyConfig, idempotent_function
from aws_lambda_powertools.utilities.idempotency.persistence.redis import CachePersistenceLayer


class InMemoryClient:
    """Minimal client with the get/set/delete calls the layer uses."""

    def __init__(self):
        self.store = {}

    def get(self, name):
        return self.store.get(name)

    def set(self, name, value, ex=0, nx=False):
        if nx and name in self.store:
            return None
        self.store[name] = value
        return True

    def delete(self, name):
        self.store.pop(name, None)


client = InMemoryClient()
persistence_layer = CachePersistenceLayer(client=client)
config = IdempotencyConfig(event_key_jmespath="order_id", payload_validation_jmespath="amount")


@idempotent_function(data_keyword_argument="order", persistence_store=persistence_layer, config=config)
def process_order(order):
    return {"order_id": order["order_id"]}


order = {"order_id": "o-1", "amount": 10}
print(process_order(order=order))  # {'order_id': 'o-1'}
print(list(client.store.values())[0])  # no "validation" field in the stored record
print(process_order(order=order))  # IdempotencyValidationError
Possible Solution

Add the validation key to the mapping in CachePersistenceLayer._update_record, like _put_in_progress_record already does:

if self.payload_validation_enabled:
    item["mapping"][self.validation_key_attr] = data_record.payload_hash

The existing test test_idempotent_function_and_lambda_handler_redis_validation only covers a different payload, so a test for a same-payload retry would catch this. I'm happy to send a PR.

Steps to Reproduce

Run the snippet above. No Redis server is needed, the in-memory client follows the same get/set/delete calls. The same happens with a real Redis or Valkey client.

Powertools for AWS Lambda (Python) version

latest (also on develop)

AWS Lambda function runtime

3.13

Packaging format used

PyPi

Debugging logs
aws_lambda_powertools.utilities.idempotency.exceptions.IdempotencyValidationError: Payload does not match stored record for this event key
主要言語
Python
スター
3.3k
フォーク
511
平均マージ
3日 4時間
マージ済み PR(30日)
98

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

aws-powertools/powertools-lambda-python のほかの issue

aws-powertools/powertools-lambda-python の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。