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.

KohdeOsoitustapa
Amazon S3Signature Version 4, säilö isäntänimessä
Cloudflare R2Signature Version 4 oman tilin päätepisteeseen
Google Cloud StorageS3-yhteensopivan API:n kautta HMAC-avaimella
MinIO, Wasabi, Backblaze B2 ja muutSignature Version 4 omaan päätepisteeseen
Azure Blob Storagesä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 auto eivätkä tarkista sitä; muut tarkistavat.
  • Etuliitteen käyttöoikeus. Avain, joka on rajattu kohteeseen mouseplayer/, ei voi kirjoittaa kohteeseen mouseplayer-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.