Kuidas luua serverita pilte AWS lambda ja ChartJS abil?

Lambda + ChartJS = headus

Tegelen projektiga, mille eesmärk on edastada sprindi andmeid levitatud Scrumi meeskondadele, kes töötavad Slackis. Kogu rakendus on serverita ja töötab AWS-is. Läbipõlenud piltide genereerimiseks soovisin üles ehitada lambdafunktsiooni, mis loob pildi, seejärel surub selle S3-ämbrisse. Selles artiklis kirjeldan lahendust, mille välja pakkusin.

Esiteks kaardistamise raamatukogu. Pärast paljude võimaluste uurimist otsustasin ChartJS-i teegi kasutamise üle. See on suurepärane Javascripti graafikute kogu, mis HTML5 lõuendi abil saab renderdada igasuguseid graafikuid. Ka väga paindlik ja konfigureeritav. Kuid kuidas juhtida seda peata lambda sees?

Minu esimene katse oli luua oma MacBookisse lihtne lambda, kasutades kolme NPM-i paketti: chart.js ja kahte muud teeki: chartjs-node-canvas ja canvas-prebuilt. Esimene neist on ümbris ChartJS ümber, mis toetab diagrammide renderdamist sõlmes. Viimane on HTML5 lõuendi eelehitatud loomulik versioon, mis võimaldab lõuendi peata luua ilma brauserita. Ehitasin lambda serverita raamistikuga, mis on väga kasulik tööriist serverivabade rakenduste loomiseks ja juurutamiseks.

Siin on minu näidislambda:

Minu lambda genereeris näidisgraafiku ja kõik nägid hästi välja, kui ma seda lokaalselt jooksin. AWS-i puhul see aga nurjus. Mida annab?

Nagu selgub, kasutab ChartJS otse lõuendile renderdamiseks natiivseid NPM-mooduleid. Ilmselt ei tööta emakeeles olevad moodulid, mida ma oma MacBookis kasutan, lambda sees. Mida siis teha?

Natiivmoodulite käivitamiseks lambda sees pidin kasutama natiivraamatukogusid, mida lambda käituskeskkond vajab. Nii vallandasin EC2-s lambda käitusaja AMI eksemplari ja logisin sisse. Seal võtsin sama lambda, mille varem ehitasin, ja käisin EC2 eksemplari installimisel npm. See laadib alla natiivsed NPM-i teegid, mida ChartJS vajab, kuid seekord lambda käituskeskkonna jaoks. Kuna need teegid on lambda-funktsiooni osa, on ChartJS võimeline pildi renderdama just nagu tavaliselt. Jah!

Vastupidiselt tavalistele NPM-projektidele kontrollisin oma GIT-i hoidlasse allalaaditud sõlme mooduleid. Graafilise lambda värskendamisel või ehitamisel ärge kirjutage üle ühtegi oma sõltuvust. Selle lähenemisviisi üks kõrvalmõju on see, et ma ei saa enam testida kohaliku kohaliku sülearvuti koodi.

Edasi: salvestage loodud pildifail S3-ämbrisse. See oli tegelikult üsna lihtne ülesanne, paljude koodilõikudega, mis on veebis saadaval, millest õppida. Täielikkuse huvides on siin minu oma:

See selleks! Nüüd saate pilte soovi korral odavalt genereerida!

Natiivraamatukogude kasutamine pole aga probleemideta. Mul on kogu seadistus tehtud või ebaõnnestunud sõltuvalt lõuendi täpsest versioonist, mida ma kasutan. Praegune seadistus kasutab tegelikult kahte. Üks transitiivne sõltuvus chartjs-node-canvas (2.0.0-alfa.14) kaudu. Üks, mille ma täpsustan otse (1.6.5-eelväljalase.1). Kui ma ühe neist eemaldan, ei õnnestu rakendus mõne linkimisvea tõttu käivituda. YMMV.

Kui soovite seda proovida, olen kokku pannud repo koos näidiskoodi ja binaarfailidega. Vaadake lähtekoodi.

Martin töötab StackState'i VP-insenerina, kus ta koos meeskondadega ehitab uue põlvkonna jälgimis- ja AIOps-toodet. Kõrvalprojektina töötab Martin Sprintlri, Scrumi hajutatud meeskondade parendamise tööriista, ja techfu.io, tehnilise talendi automaatse hindamise tööriista.