Экспарт у аб'ектнае сховішча

Адзін JSON-аб'ект на дасягнутую мэту ў вашым бакеце. Гэта шлях ва ўсе сховішчы даных, акрамя BigQuery.

1. Які прабел гэта закрывае

Раней з MousePlayer у сховішча даных вёў толькі адзін шлях — у Google. Для Snowflake, Redshift або ClickHouse шляху не было, хоць усе тры лёгка чытаюць аб'ектныя сховішчы.

Таму мост піша ў аб'ектнае сховішча, а не ў кожную сістэму асобна. Snowflake чытае S3, Redshift чытае S3, ClickHouse чытае S3, а BigQuery — Google Cloud Storage. Адзін экспарт дасягае ўсіх.

КудыАдрасаванне
Amazon S3Signature Version 4, бакет у хосце
Cloudflare R2Signature Version 4 да кропкі вашага акаўнта
Google Cloud Storageпраз S3-сумяшчальны API з ключом HMAC
MinIO, Wasabi, Backblaze B2 і іншыяSignature Version 4 да вашай кропкі
Azure Blob StorageSAS-спасылка кантэйнера — без подпісу з нашага боку

2. Чаму Azure адрозніваецца і чаму гэта лепш

Azure Blob не выкарыстоўвае Signature Version 4, а падпісвае SharedKey. Можна было б пабудаваць другую схему подпісу. Замест гэтага мост прымае SAS-спасылку кантэйнера — URL, створаны ў вашым акаўнце сховішча, з ужо ўбудаваным подпісам.

Гэта менш кода ў нас і менш даверу з вашага боку. Мы ніколі не бачым ключ акаўнта: вы даяце самастойна абмежаваны дазвол на адзін кантэйнер з выбраным тэрмінам, які можна адклікаць у любы час, не кранаючы астатняе.

Тое ж абмежаванне варта ўжыць для S3: дазвольце ключу пісаць толькі ў гэты прэфікс і больш нікуды. Ключ, здольны толькі дадаваць у mouseplayer/goals/ , не прачытае іншыя бакеты нават пры ўцечцы.

3. Адзін аб'ект на мэту, ключ — дата

У аб'ектным сховішчы няма дапісвання. Штодзённы файл трэба было б перапісваць цалкам, і дзве адначасовыя мэты перазапісалі б адна адну. Таму кожная мэта — асобны аб'ект.

Кошт — шмат малых аб'ектаў; працаваць дазваляе структура ключа:

prefix/YYYY/MM/DD/channel/session-goal.json

Сховішча чытае дзень як адну партыцыю, а дапаўненне гісторыі — сканаванне прэфікса, не запыт. Для падзелу паводле праекта дадайце channel ID у прэфікс.

Кожны аб'ект — адзін радок JSON

Наўмысна без водступаў, каб увесь прэфікс чытаўся як NDJSON без паасобнага адкрыцця. Час, праект, сеанс, ID кліента, мэта, каштоўнасць, валюта і спасылка прайгравання.

Пустая каштоўнасць — null, не нуль

Мэта без грашовай каштоўнасці піша null. Нуль склаўся б у ніколі не існуючую суму — розніца паміж «сума не зададзена» і «сума нуль» захоўваецца ў экспарце.

4. Пры адказе 403 спачатку прачытайце гэта

Адхілены запыт S3 кажа мала, і нездарма наш журнал паведамляе больш за S3: рэгіён уваходзіць у подпіс. Няправільныя рэгіён і ключ даюць аднолькавы 403, таму відавочнае падазрэнне на ключ слушнае толькі ў палове выпадкаў.

Праверце тры рэчы ў такім парадку:

  • Рэгіён, дакладна як у бакеце. R2 і Google Cloud Storage прымаюць auto і не правяраюць яго; астатнія правяраюць.
  • Дазвол прэфікса. Ключ для mouseplayer/ не можа пісаць у mouseplayer-goals/ — канцавы слэш важны ў ARN рэсурсу.
  • Кропку падключэннядля R2 і S3-сумяшчальных сховішчаў. Устаўце хост без https://; мы ўсё роўна прыбяром гэта, але дадзены шлях азначае іншы бакет.

ID ключа доступу захоўваецца адкрыта наўмысна: ён перадаецца ў кожным падпісаным запыце, таму шыфраванне не дало б абароны. Сакрэт шыфруецца, больш не паказваецца і не трапляе ў чаргу задач.

Усе згаданыя таварныя знакі належаць адпаведным уладальнікам. MousePlayer не мае дзелавых адносін з гэтымі пастаўшчыкамі.