From f3c2fa194b918f3cb9a3d873213093bf1e937771 Mon Sep 17 00:00:00 2001 From: emelinda Date: Mon, 10 Aug 2026 00:50:03 +0300 Subject: [PATCH] =?UTF-8?q?Processing:=20=D1=83=20=D1=81=D0=B5=D0=BA=D1=80?= =?UTF-8?q?=D0=B5=D1=82=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D1=81?= =?UTF-8?q?=D0=B2=D0=BE=D1=8F=20=D1=81=D1=85=D0=B5=D0=BC=D0=B0=20JSON,=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BA=D0=B0=D0=BA=20=D1=83=20=D0=B4=D0=B2=D0=B8?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- aero/roles/sarex_stack/defaults/main.yml | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/aero/roles/sarex_stack/defaults/main.yml b/aero/roles/sarex_stack/defaults/main.yml index f94d4b9..aa31285 100644 --- a/aero/roles/sarex_stack/defaults/main.yml +++ b/aero/roles/sarex_stack/defaults/main.yml @@ -396,16 +396,25 @@ vault_app_secrets: # yc-s3-service-account.json, а не как-нибудь читаемо, и путь обязан # совпадать с 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 data: yc-s3-service-account.json: >- - {"host": "http://minio.minio.svc.cluster.local:9000", - "bucket": "{{ sarex_django_s3_bucket }}", + {"endpoint": "minio.minio.svc.cluster.local:9000", + "bucket_name": "{{ sarex_django_s3_bucket }}", "access_key_id": "{{ sarex_minio_k8s_user }}", "secret_access_key": "{{ sarex_secrets.SAREX_MINIO_ROOT_PASSWORD }}", - "region": "us-east-1", "verify": false} + "use_ssl": false} # --- Секреты приложения measurements --------------------------------------- # Структура задана vault-шаблоном в apps/measurements/base/backend.yaml: он # собирает из этих ключей одну переменную S3_JSON_SETTINGS и читает endpoint