[Python] Azure Cache for Redis randomly throws WRONGPASS

Discussão em 'Python' iniciado por Stack, Agosto 12, 2025.

  1. Stack

    Stack Membro Participativo

    I have a Django website running as an Azure Web App, which is uzing Azure Cache for Redis.

    We use a Managed Identity to connect to Azure Cache for Redis so we do not need to use access keys.

    The application itself is running in gunicorn so as multiple threads.

    There is a health check, being called by Azure Web App platform itself, for which I have this middleware:

    import logging
    import os
    import signal

    from django.conf import settings
    from django.core.cache import cache
    from django.db import connection
    from django.http import HttpResponse
    from django_redis import get_redis_connection
    from tenacity import retry, stop_after_attempt, wait_random_exponential

    from .azure_helper import RedisCredentials, get_db_password, get_redis_credentials

    logger = logging.getLogger("pulumi_django_azure.health_check")


    class HealthCheckMiddleware:
    def __init__(self, get_response):
    self.get_response = get_response

    def _self_heal(self):
    logger.warning("Self-healing by gracefully restarting Gunicorn.")

    master_pid = os.getppid()

    logger.debug("Master PID: %d", master_pid)

    # https://docs.gunicorn.org/en/latest/signals.html

    # Reload a new master with new workers,
    # since the application is preloaded this is the only safe way for now.
    os.kill(master_pid, signal.SIGUSR2)

    # Gracefully shutdown the current workers
    os.kill(master_pid, signal.SIGTERM)

    def _test_redis_connection(self) -> bool:
    try:
    cache.set("health_check", "test")
    return True
    except Exception:
    return False

    @retry(stop=stop_after_attempt(3), wait=wait_random_exponential(multiplier=0.5, max=5))
    def _update_redis_credentials(self, redis_credentials: RedisCredentials):
    logger.debug("Updating Redis credentials with password: %s", redis_credentials.password)

    # Re-authenticate the Redis connection
    redis_connection = get_redis_connection("default")
    redis_connection.execute_command("AUTH", redis_credentials.username, redis_credentials.password)

    settings.CACHES["default"]["OPTIONS"]["PASSWORD"] = redis_credentials.password

    def __call__(self, request):
    if request.path == settings.HEALTH_CHECK_PATH:
    # Update the database credentials if needed
    if settings.AZURE_DB_PASSWORD:
    try:
    current_db_password = settings.DATABASES["default"]["PASSWORD"]
    new_db_password = get_db_password()

    if new_db_password != current_db_password:
    logger.debug("Database password has changed, updating credentials")
    settings.DATABASES["default"]["PASSWORD"] = new_db_password

    # Close existing connections to force reconnect with new password
    connection.close()
    else:
    logger.debug("Database password unchanged, keeping existing credentials")
    except Exception as e:
    logger.error("Failed to update database credentials: %s", str(e))
    self._self_heal()
    return HttpResponse(status=503)

    # Update the Redis credentials if needed
    if settings.AZURE_REDIS_CREDENTIALS:
    try:
    current_redis_password = settings.CACHES["default"]["OPTIONS"]["PASSWORD"]
    redis_credentials = get_redis_credentials()

    if redis_credentials.password != current_redis_password:
    logger.debug("Redis password has changed, updating credentials")

    self._update_redis_credentials(redis_credentials)
    elif not self._test_redis_connection():
    logger.debug("Redis connection check failed, updating credentials")
    self._update_redis_credentials(redis_credentials)
    else:
    logger.debug("Redis password unchanged and connection check passed, keeping existing credentials")
    except Exception as e:
    logger.error("Failed to update Redis credentials: %s", str(e))
    self._self_heal()
    return HttpResponse(status=503)

    try:
    # Test the database connection
    connection.ensure_connection()
    logger.debug("Database connection check passed")

    # Test the Redis connection
    cache.set("health_check", "test")
    logger.debug("Redis connection check passed")

    return HttpResponse("OK")

    except Exception as e:
    logger.error("Health check failed with unexpected error: %s", str(e))
    self._self_heal()
    return HttpResponse(status=503)

    return self.get_response(request)


    So essentially, we retrieve an auth token from the Azure management API, and if that password has changed OR the connection test fails, we perform an AUTH command.

    Now, randomly we see that our self-healing mechanisms kicks in (which we added because of all the issues we had and we want to keep the site running while we figure this out). After adding more logging, as can be seen in the above code, we see in the logs:

    2025-08-12 13:56:54,647 DEBUG [p:1293] [t:123417039960960] Updating Redis credentials with password: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSIsImtpZCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSJ9.eyJhdWQiOiJodHRwczovL3JlZGlzLmF6dXJlLmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2UyOThmYWJhLTdjNGEtNGQzZS1iZGQ2LTg3ZDA5OGI0ZjdlMi8iLCJpYXQiOjE3NTQ5OTk0NTksIm5iZiI6MTc1NDk5OTQ1OSwiZXhwIjoxNzU1MDg2MTU5LCJhaW8iOiJrMlJnWU5nLzYvY2JXN3ZGWmgwdERvOC9zbmJ3QVFBPSIsImFwcGlkIjoiN2YxY2UzOWItZmVmOS00NDAwLTg0NDMtYzhjMGVlMDc2ZGJlIiwiYXBwaWRhY3IiOiIyIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvZTI5OGZhYmEtN2M0YS00ZDNlLWJkZDYtODdkMDk4YjRmN2UyLyIsImlkdHlwIjoiYXBwIiwib2lkIjoiZTlmYWE3ZjUtZWQ4MC00MjhmLWFkNzMtMjM4MzdmNTFmZTVlIiwicmgiOiIxLkFRd0F1dnFZNGtwOFBrMjkxb2ZRbUxUMzRydGZ5cXprdHdsQWdmRTM0NF9XYlhqZEFBQU1BQS4iLCJzdWIiOiJlOWZhYTdmNS1lZDgwLTQyOGYtYWQ3My0yMzgzN2Y1MWZlNWUiLCJ0aWQiOiJlMjk4ZmFiYS03YzRhLTRkM2UtYmRkNi04N2QwOThiNGY3ZTIiLCJ1dGkiOiIwdDltQThYeVJVeVpzWWozOTEwYUFBIiwidmVyIjoiMS4wIiwieG1zX2Z0ZCI6InIwdGUwZVZ6TURXV0xJaThJcm5LMXpmRWJ3bDNqdEpnYTk4RzlQZm1CblVCYzNkbFpHVnVZeTFrYzIxeiIsInhtc19pZHJlbCI6IjggNyIsInhtc19yZCI6IjAuNDJMbFlCSmk1QkVTNGVBVUVtQkFBMEJSRGlHQjNmR24xanpaenVuUS1OSDhjZi0xM0FvQSJ9.nQTOjqYjyyfjKU5b4Y9fSWMYrkggCRRCeQAF4dhCTcuw-vUOpbLbBeRAJ1nM987L6qlOW03guLfENyGlPCdGEpCwDZrlo0HA13i35qeEklxKUUvieBu_rSz9lDBPrRLiPWDKANzgLZ9JuDj6ZpdH7RqVazK1Ygn-aIZ-J1iYPzgY-XCA0vMcCyHTwDDlNsOAq7uuvQwdDu9cUzbQk5bUwE7tWiyvr6cbzImuROAIAv6ZmxwfxrTBgUV7KcEwLP_vmMFipgvjqJDiydHtq7rERPSq0ixVspbZZCM0wsW56XZ5WjfXW2lfBnqRdTOeFhMTtJAQBDgOgijsIfRSup902Q
    2025-08-12 13:56:54,852 DEBUG [p:1293] [t:123417039960960] Database connection check passed
    2025-08-12 13:56:54,856 DEBUG [p:1293] [t:123417039960960] Redis connection check passed
    2025-08-12 13:57:54,562 DEBUG [p:1294] [t:123417039960960] Database password unchanged, keeping existing credentials
    2025-08-12 13:57:54,565 DEBUG [p:1294] [t:123417039960960] Redis password unchanged and connection check passed, keeping existing credentials
    2025-08-12 13:57:54,565 DEBUG [p:1294] [t:123417039960960] Database connection check passed
    2025-08-12 13:57:54,570 DEBUG [p:1294] [t:123417039960960] Redis connection check passed
    2025-08-12 13:58:54,760 DEBUG [p:1297] [t:123417039960960] Database password has changed, updating credentials
    2025-08-12 13:58:54,788 DEBUG [p:1297] [t:123417039960960] Redis password has changed, updating credentials
    2025-08-12 13:58:54,795 DEBUG [p:1297] [t:123417039960960] Updating Redis credentials with password: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSIsImtpZCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSJ9.eyJhdWQiOiJodHRwczovL3JlZGlzLmF6dXJlLmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2UyOThmYWJhLTdjNGEtNGQzZS1iZGQ2LTg3ZDA5OGI0ZjdlMi8iLCJpYXQiOjE3NTQ5OTk0NTksIm5iZiI6MTc1NDk5OTQ1OSwiZXhwIjoxNzU1MDg2MTU5LCJhaW8iOiJrMlJnWU5nLzYvY2JXN3ZGWmgwdERvOC9zbmJ3QVFBPSIsImFwcGlkIjoiN2YxY2UzOWItZmVmOS00NDAwLTg0NDMtYzhjMGVlMDc2ZGJlIiwiYXBwaWRhY3IiOiIyIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvZTI5OGZhYmEtN2M0YS00ZDNlLWJkZDYtODdkMDk4YjRmN2UyLyIsImlkdHlwIjoiYXBwIiwib2lkIjoiZTlmYWE3ZjUtZWQ4MC00MjhmLWFkNzMtMjM4MzdmNTFmZTVlIiwicmgiOiIxLkFRd0F1dnFZNGtwOFBrMjkxb2ZRbUxUMzRydGZ5cXprdHdsQWdmRTM0NF9XYlhqZEFBQU1BQS4iLCJzdWIiOiJlOWZhYTdmNS1lZDgwLTQyOGYtYWQ3My0yMzgzN2Y1MWZlNWUiLCJ0aWQiOiJlMjk4ZmFiYS03YzRhLTRkM2UtYmRkNi04N2QwOThiNGY3ZTIiLCJ1dGkiOiIwdDltQThYeVJVeVpzWWozOTEwYUFBIiwidmVyIjoiMS4wIiwieG1zX2Z0ZCI6InIwdGUwZVZ6TURXV0xJaThJcm5LMXpmRWJ3bDNqdEpnYTk4RzlQZm1CblVCYzNkbFpHVnVZeTFrYzIxeiIsInhtc19pZHJlbCI6IjggNyIsInhtc19yZCI6IjAuNDJMbFlCSmk1QkVTNGVBVUVtQkFBMEJSRGlHQjNmR24xanpaenVuUS1OSDhjZi0xM0FvQSJ9.nQTOjqYjyyfjKU5b4Y9fSWMYrkggCRRCeQAF4dhCTcuw-vUOpbLbBeRAJ1nM987L6qlOW03guLfENyGlPCdGEpCwDZrlo0HA13i35qeEklxKUUvieBu_rSz9lDBPrRLiPWDKANzgLZ9JuDj6ZpdH7RqVazK1Ygn-aIZ-J1iYPzgY-XCA0vMcCyHTwDDlNsOAq7uuvQwdDu9cUzbQk5bUwE7tWiyvr6cbzImuROAIAv6ZmxwfxrTBgUV7KcEwLP_vmMFipgvjqJDiydHtq7rERPSq0ixVspbZZCM0wsW56XZ5WjfXW2lfBnqRdTOeFhMTtJAQBDgOgijsIfRSup902Q
    2025-08-12 13:58:55,099 DEBUG [p:1297] [t:123417039960960] Database connection check passed
    2025-08-12 13:58:55,102 DEBUG [p:1297] [t:123417039960960] Redis connection check passed
    2025-08-12 13:59:54,606 DEBUG [p:1292] [t:123417039960960] Database password has changed, updating credentials
    2025-08-12 13:59:54,644 DEBUG [p:1292] [t:123417039960960] Redis password has changed, updating credentials
    2025-08-12 13:59:54,644 DEBUG [p:1292] [t:123417039960960] Updating Redis credentials with password: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSIsImtpZCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSJ9.eyJhdWQiOiJodHRwczovL3JlZGlzLmF6dXJlLmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2UyOThmYWJhLTdjNGEtNGQzZS1iZGQ2LTg3ZDA5OGI0ZjdlMi8iLCJpYXQiOjE3NTQ5OTk0NTksIm5iZiI6MTc1NDk5OTQ1OSwiZXhwIjoxNzU1MDg2MTU5LCJhaW8iOiJrMlJnWU5nLzYvY2JXN3ZGWmgwdERvOC9zbmJ3QVFBPSIsImFwcGlkIjoiN2YxY2UzOWItZmVmOS00NDAwLTg0NDMtYzhjMGVlMDc2ZGJlIiwiYXBwaWRhY3IiOiIyIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvZTI5OGZhYmEtN2M0YS00ZDNlLWJkZDYtODdkMDk4YjRmN2UyLyIsImlkdHlwIjoiYXBwIiwib2lkIjoiZTlmYWE3ZjUtZWQ4MC00MjhmLWFkNzMtMjM4MzdmNTFmZTVlIiwicmgiOiIxLkFRd0F1dnFZNGtwOFBrMjkxb2ZRbUxUMzRydGZ5cXprdHdsQWdmRTM0NF9XYlhqZEFBQU1BQS4iLCJzdWIiOiJlOWZhYTdmNS1lZDgwLTQyOGYtYWQ3My0yMzgzN2Y1MWZlNWUiLCJ0aWQiOiJlMjk4ZmFiYS03YzRhLTRkM2UtYmRkNi04N2QwOThiNGY3ZTIiLCJ1dGkiOiIwdDltQThYeVJVeVpzWWozOTEwYUFBIiwidmVyIjoiMS4wIiwieG1zX2Z0ZCI6InIwdGUwZVZ6TURXV0xJaThJcm5LMXpmRWJ3bDNqdEpnYTk4RzlQZm1CblVCYzNkbFpHVnVZeTFrYzIxeiIsInhtc19pZHJlbCI6IjggNyIsInhtc19yZCI6IjAuNDJMbFlCSmk1QkVTNGVBVUVtQkFBMEJSRGlHQjNmR24xanpaenVuUS1OSDhjZi0xM0FvQSJ9.nQTOjqYjyyfjKU5b4Y9fSWMYrkggCRRCeQAF4dhCTcuw-vUOpbLbBeRAJ1nM987L6qlOW03guLfENyGlPCdGEpCwDZrlo0HA13i35qeEklxKUUvieBu_rSz9lDBPrRLiPWDKANzgLZ9JuDj6ZpdH7RqVazK1Ygn-aIZ-J1iYPzgY-XCA0vMcCyHTwDDlNsOAq7uuvQwdDu9cUzbQk5bUwE7tWiyvr6cbzImuROAIAv6ZmxwfxrTBgUV7KcEwLP_vmMFipgvjqJDiydHtq7rERPSq0ixVspbZZCM0wsW56XZ5WjfXW2lfBnqRdTOeFhMTtJAQBDgOgijsIfRSup902Q
    2025-08-12 13:59:55,021 DEBUG [p:1292] [t:123417039960960] Updating Redis credentials with password: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSIsImtpZCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSJ9.eyJhdWQiOiJodHRwczovL3JlZGlzLmF6dXJlLmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2UyOThmYWJhLTdjNGEtNGQzZS1iZGQ2LTg3ZDA5OGI0ZjdlMi8iLCJpYXQiOjE3NTQ5OTk0NTksIm5iZiI6MTc1NDk5OTQ1OSwiZXhwIjoxNzU1MDg2MTU5LCJhaW8iOiJrMlJnWU5nLzYvY2JXN3ZGWmgwdERvOC9zbmJ3QVFBPSIsImFwcGlkIjoiN2YxY2UzOWItZmVmOS00NDAwLTg0NDMtYzhjMGVlMDc2ZGJlIiwiYXBwaWRhY3IiOiIyIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvZTI5OGZhYmEtN2M0YS00ZDNlLWJkZDYtODdkMDk4YjRmN2UyLyIsImlkdHlwIjoiYXBwIiwib2lkIjoiZTlmYWE3ZjUtZWQ4MC00MjhmLWFkNzMtMjM4MzdmNTFmZTVlIiwicmgiOiIxLkFRd0F1dnFZNGtwOFBrMjkxb2ZRbUxUMzRydGZ5cXprdHdsQWdmRTM0NF9XYlhqZEFBQU1BQS4iLCJzdWIiOiJlOWZhYTdmNS1lZDgwLTQyOGYtYWQ3My0yMzgzN2Y1MWZlNWUiLCJ0aWQiOiJlMjk4ZmFiYS03YzRhLTRkM2UtYmRkNi04N2QwOThiNGY3ZTIiLCJ1dGkiOiIwdDltQThYeVJVeVpzWWozOTEwYUFBIiwidmVyIjoiMS4wIiwieG1zX2Z0ZCI6InIwdGUwZVZ6TURXV0xJaThJcm5LMXpmRWJ3bDNqdEpnYTk4RzlQZm1CblVCYzNkbFpHVnVZeTFrYzIxeiIsInhtc19pZHJlbCI6IjggNyIsInhtc19yZCI6IjAuNDJMbFlCSmk1QkVTNGVBVUVtQkFBMEJSRGlHQjNmR24xanpaenVuUS1OSDhjZi0xM0FvQSJ9.nQTOjqYjyyfjKU5b4Y9fSWMYrkggCRRCeQAF4dhCTcuw-vUOpbLbBeRAJ1nM987L6qlOW03guLfENyGlPCdGEpCwDZrlo0HA13i35qeEklxKUUvieBu_rSz9lDBPrRLiPWDKANzgLZ9JuDj6ZpdH7RqVazK1Ygn-aIZ-J1iYPzgY-XCA0vMcCyHTwDDlNsOAq7uuvQwdDu9cUzbQk5bUwE7tWiyvr6cbzImuROAIAv6ZmxwfxrTBgUV7KcEwLP_vmMFipgvjqJDiydHtq7rERPSq0ixVspbZZCM0wsW56XZ5WjfXW2lfBnqRdTOeFhMTtJAQBDgOgijsIfRSup902Q
    2025-08-12 13:59:55,775 DEBUG [p:1292] [t:123417039960960] Updating Redis credentials with password: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSIsImtpZCI6IkpZaEFjVFBNWl9MWDZEQmxPV1E3SG4wTmVYRSJ9.eyJhdWQiOiJodHRwczovL3JlZGlzLmF6dXJlLmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2UyOThmYWJhLTdjNGEtNGQzZS1iZGQ2LTg3ZDA5OGI0ZjdlMi8iLCJpYXQiOjE3NTQ5OTk0NTksIm5iZiI6MTc1NDk5OTQ1OSwiZXhwIjoxNzU1MDg2MTU5LCJhaW8iOiJrMlJnWU5nLzYvY2JXN3ZGWmgwdERvOC9zbmJ3QVFBPSIsImFwcGlkIjoiN2YxY2UzOWItZmVmOS00NDAwLTg0NDMtYzhjMGVlMDc2ZGJlIiwiYXBwaWRhY3IiOiIyIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvZTI5OGZhYmEtN2M0YS00ZDNlLWJkZDYtODdkMDk4YjRmN2UyLyIsImlkdHlwIjoiYXBwIiwib2lkIjoiZTlmYWE3ZjUtZWQ4MC00MjhmLWFkNzMtMjM4MzdmNTFmZTVlIiwicmgiOiIxLkFRd0F1dnFZNGtwOFBrMjkxb2ZRbUxUMzRydGZ5cXprdHdsQWdmRTM0NF9XYlhqZEFBQU1BQS4iLCJzdWIiOiJlOWZhYTdmNS1lZDgwLTQyOGYtYWQ3My0yMzgzN2Y1MWZlNWUiLCJ0aWQiOiJlMjk4ZmFiYS03YzRhLTRkM2UtYmRkNi04N2QwOThiNGY3ZTIiLCJ1dGkiOiIwdDltQThYeVJVeVpzWWozOTEwYUFBIiwidmVyIjoiMS4wIiwieG1zX2Z0ZCI6InIwdGUwZVZ6TURXV0xJaThJcm5LMXpmRWJ3bDNqdEpnYTk4RzlQZm1CblVCYzNkbFpHVnVZeTFrYzIxeiIsInhtc19pZHJlbCI6IjggNyIsInhtc19yZCI6IjAuNDJMbFlCSmk1QkVTNGVBVUVtQkFBMEJSRGlHQjNmR24xanpaenVuUS1OSDhjZi0xM0FvQSJ9.nQTOjqYjyyfjKU5b4Y9fSWMYrkggCRRCeQAF4dhCTcuw-vUOpbLbBeRAJ1nM987L6qlOW03guLfENyGlPCdGEpCwDZrlo0HA13i35qeEklxKUUvieBu_rSz9lDBPrRLiPWDKANzgLZ9JuDj6ZpdH7RqVazK1Ygn-aIZ-J1iYPzgY-XCA0vMcCyHTwDDlNsOAq7uuvQwdDu9cUzbQk5bUwE7tWiyvr6cbzImuROAIAv6ZmxwfxrTBgUV7KcEwLP_vmMFipgvjqJDiydHtq7rERPSq0ixVspbZZCM0wsW56XZ5WjfXW2lfBnqRdTOeFhMTtJAQBDgOgijsIfRSup902Q
    2025-08-12 13:59:55,959 ERROR [p:1292] [t:123417039960960] Failed to update Redis credentials: RetryError[<Future at 0x703f38c02d70 state=finished raised ResponseError>]
    2025-08-12 13:59:55,970 WARNING [p:1292] [t:123417039960960] Self-healing by gracefully restarting Gunicorn.


    So, the health check arrives every minute on a different process (is random), in that process the logic kicks in that sees that the password has changed; but then the AUTH fails. It is not visible in these logs anymore but the error from Redis is WRONGPASS.

    So the credentials we freshly obtained from Azure, are not valid in P1292 in this example, while it was valid 3 minutes earlier on PID 1293.

    I have enabled full logs on Azure Cache hoping to spot something, but awaiting my findings of that, hoping to find an answer here.

    Continue reading...

Compartilhe esta Página