Экспарт у аб'ектнае сховішча
Адзін JSON-аб'ект на дасягнутую мэту ў вашым бакеце. Гэта шлях ва ўсе сховішчы даных, акрамя BigQuery.
1. Які прабел гэта закрывае
Раней з MousePlayer у сховішча даных вёў толькі адзін шлях — у Google. Для Snowflake, Redshift або ClickHouse шляху не было, хоць усе тры лёгка чытаюць аб'ектныя сховішчы.
Таму мост піша ў аб'ектнае сховішча, а не ў кожную сістэму асобна. Snowflake чытае S3, Redshift чытае S3, ClickHouse чытае S3, а BigQuery — Google Cloud Storage. Адзін экспарт дасягае ўсіх.
| Куды | Адрасаванне |
|---|---|
| Amazon S3 | Signature Version 4, бакет у хосце |
| Cloudflare R2 | Signature Version 4 да кропкі вашага акаўнта |
| Google Cloud Storage | праз S3-сумяшчальны API з ключом HMAC |
| MinIO, Wasabi, Backblaze B2 і іншыя | Signature Version 4 да вашай кропкі |
| Azure Blob Storage | SAS-спасылка кантэйнера — без подпісу з нашага боку |
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 не мае дзелавых адносін з гэтымі пастаўшчыкамі.