403 Forbidden на HeadObject объяснялся не кредами и не отсутствием объекта —
и то и другое я проверил, они в порядке. Дело в схеме файла.
Движок читает /vault/secrets/processing-s3 с ключами host/bucket/verify, а
под задачи разбирает свой файл моделью S3AccountModel с ключами
endpoint/bucket_name/access_key_id/secret_access_key/use_ssl. Совпадают
только два имени из пяти.
Коварство в том, что pydantic на формате движка НЕ падает: access_key_id и
secret_access_key подходят по имени, а endpoint и bucket_name молча берут
значения по умолчанию. Поэтому вместо понятной ошибки конфигурации задача
шла в чужое хранилище и получала 403 — креды при этом верные.
endpoint пишется без схемы, протокол задаёт use_ssl; у нас MinIO внутри
кластера по http.