Processing: у секрета задач своя схема JSON, не как у движка

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.
This commit is contained in:
emelinda 2026-08-10 00:50:03 +03:00
parent ab086a86b4
commit f3c2fa194b

View File

@ -396,16 +396,25 @@ vault_app_secrets:
# yc-s3-service-account.json, а не как-нибудь читаемо, и путь обязан # yc-s3-service-account.json, а не как-нибудь читаемо, и путь обязан
# совпадать с VAULT_MOUNT_PATH в apps/processing/aero. # совпадать с VAULT_MOUNT_PATH в apps/processing/aero.
# #
# Содержимое — тот же JSON, что движок получает в /vault/secrets/processing-s3, # СХЕМА ЗДЕСЬ ДРУГАЯ, чем у секрета самого движка, и это главная ловушка.
# только одной строкой: агент кладёт значение ключа в файл как есть. # Движок читает /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 Forbidden на HeadObject: креды верные, адрес и бакет чужие.
#
# endpoint БЕЗ схемы: протокол задаёт use_ssl. У нас MinIO внутри кластера по
# http, поэтому use_ssl: false.
- path: secrets/apps/processing/yc-s3 - path: secrets/apps/processing/yc-s3
data: data:
yc-s3-service-account.json: >- yc-s3-service-account.json: >-
{"host": "http://minio.minio.svc.cluster.local:9000", {"endpoint": "minio.minio.svc.cluster.local:9000",
"bucket": "{{ sarex_django_s3_bucket }}", "bucket_name": "{{ sarex_django_s3_bucket }}",
"access_key_id": "{{ sarex_minio_k8s_user }}", "access_key_id": "{{ sarex_minio_k8s_user }}",
"secret_access_key": "{{ sarex_secrets.SAREX_MINIO_ROOT_PASSWORD }}", "secret_access_key": "{{ sarex_secrets.SAREX_MINIO_ROOT_PASSWORD }}",
"region": "us-east-1", "verify": false} "use_ssl": false}
# --- Секреты приложения measurements --------------------------------------- # --- Секреты приложения measurements ---------------------------------------
# Структура задана vault-шаблоном в apps/measurements/base/backend.yaml: он # Структура задана vault-шаблоном в apps/measurements/base/backend.yaml: он
# собирает из этих ключей одну переменную S3_JSON_SETTINGS и читает endpoint # собирает из этих ключей одну переменную S3_JSON_SETTINGS и читает endpoint