Vienti objektitallennukseen
Yksi JSON-objekti toteutunutta tavoitetta kohti omaan säilöön. Tämä on reitti kaikkiin muihin tietovarastoihin kuin BigQueryyn.
1. Mitä aukkoa tämä täyttää
Tähän asti MousePlayerista oli täsmälleen yksi reitti tietovarastoon, ja se vei Googlelle. Snowflakelle, Redshiftille ja ClickHouselle reittiä ei ollut, vaikka kaikki kolme lukevat objektitallennuksesta ongelmitta.
Siksi silta kirjoittaa objektitallennukseen eikä jokaiseen tietovarastoon erikseen. Snowflake lukee S3-palvelusta, Redshift lukee S3-palvelusta, ClickHouse lukee S3-palvelusta ja BigQuery lukee Google Cloud Storagesta. Yksi vienti tavoittaa kaikki.
| Kohde | Osoitustapa |
|---|---|
| Amazon S3 | Signature Version 4, säilö isäntänimessä |
| Cloudflare R2 | Signature Version 4 oman tilin päätepisteeseen |
| Google Cloud Storage | S3-yhteensopivan API:n kautta HMAC-avaimella |
| MinIO, Wasabi, Backblaze B2 ja muut | Signature Version 4 omaan päätepisteeseen |
| Azure Blob Storage | säiliön SAS-linkki — ei lainkaan allekirjoitusta meillä |
2. Miksi Azure poikkeaa ja miksi se on parempi
Azure Blob ei käytä Signature Version 4:ää vaan allekirjoittaa SharedKeyllä. Olisimme voineet rakentaa toisen allekirjoitusjärjestelmän. Sen sijaan silta vastaanottaa säiliön SAS-linkin — omalla tallennustilillä luodun URL:n, jossa allekirjoitus on jo mukana.
Näin meillä on vähemmän koodia ja omalta puolelta tarvitaan vähemmän luottamusta. Emme näe tiliavainta lainkaan: saamme itse rajatun käyttöoikeuden yhteen säiliöön itse valitulla päättymisajalla. Sen voi perua milloin tahansa koskematta muuhun.
Sama rajaus kannattaa tehdä S3-puolella: anna käyttöavaimelle oikeus kirjoittaa vain tähän yhteen etuliitteeseen, ei muualle. Avain, jolla voi vain lisätä kohteeseen mouseplayer/goals/, ei voi vuotaessaankaan lukea muita säilöjä.
3. Yksi objekti tavoitetta kohti, avaimena päivämäärä
Objektitallennuksessa ei voi lisätä tiedoston loppuun. Päivätiedosto pitäisi kirjoittaa joka kerta kokonaan uudelleen, ja kaksi yhtä aikaa saapuvaa tavoitetta korvaisivat toisensa. Siksi jokainen toteutunut tavoite on oma objektinsa.
Hintana on paljon pieniä objekteja; avainrakenne tekee tästä toimivaa:
prefix/YYYY/MM/DD/channel/session-goal.json
Tietovarasto lukee päivän yhtenä osiona, ja aiempien tietojen täydennys on kyselyn sijaan etuliitteen läpikäynti. Jos osiointi halutaan projektin eikä päivämäärän mukaan, lisää kanavatunnus etuliitteeseen.
Jokainen objekti on yksi JSON-rivi
Tarkoituksella ilman sisennystä, jotta koko etuliitteen voi lukea NDJSON-muodossa avaamatta objekteja yksitellen. Aikaleima, projekti, istunto, asiakastunnus, tavoite, arvo, valuutta ja tallenteen toistava linkki.
Tyhjä arvo on null, ei nolla
Tavoite ilman rahallista arvoa kirjoittaa null. Tietovarastossa nolla summattaisiin kokonaismäärään, jota ei koskaan ollut — ero ilmauksien ”summaa ei sovittu” ja ”summaksi sovittiin nolla” välillä säilyy viennissä.
4. Jos vastaus on 403, lue ensin tämä
Hylätty S3-pyyntö kertoo tuskin mitään. Lokimme virheviesti kertoo enemmän kuin S3 syystä: alue sisältyy allekirjoitukseen. Väärä alue ja väärä avain tuottavat saman 403:n, joten ilmeinen epäilty — avain — on oikea vain joka toisella kerralla.
Tarkista kolme asiaa tässä järjestyksessä:
- Alue, täsmälleen säilön ilmoittamassa muodossa. R2 ja Google Cloud Storage hyväksyvät arvon
autoeivätkä tarkista sitä; muut tarkistavat. - Etuliitteen käyttöoikeus. Avain, joka on rajattu kohteeseen
mouseplayer/, ei voi kirjoittaa kohteeseenmouseplayer-goals/— lopun kauttaviivalla on merkitystä resurssin ARN-tunnuksessa. - Päätepiste, R2-palvelulle ja S3-yhteensopiville tallennuspalveluille. Liitä isäntä ilman osaa
https://; poistamme sen joka tapauksessa, mutta perään lisätty polku tarkoittaa eri säilöä.
Käyttöavaimen tunnus säilytetään tarkoituksella selväkielisenä. Se kulkee jokaisessa allekirjoitetussa pyynnössä, joten salaus olisi työtä ilman suojaa. Salaisuus salataan, sitä ei näytetä uudelleen eikä se koskaan päädy tehtävää kuljettavaan sisäiseen jonoon.
Kaikki tässä mainitut tavaramerkit kuuluvat omistajilleen. MousePlayerilla ei ole liikesuhdetta näihin toimittajiin.