Viestinvälityspalvelun avulla sovellukset voivat lähettää sähköpostiviestejä OPH:n nimissä.
Arkkitehtuurikuvaus on osoitteessa: https://wiki.eduuni.fi/pages/viewpage.action?pageId=395905952
Viestinvälityspalvelu on toteutettu lambdoilla, ja siinä on seuraavat osat:
-
Lähetyspyyntöjen vastaanotto ja tilan raportointi
Tämä komponentti sisältää endpointit joiden avulla viestinvälityspalvelun asiakasjärjestelmät voivat:
- Luoda uusia lähetyksiä (aggregaatioentiteetti jonka avulla joukkoa viestejä voidaan tarkastella kokonaisuutena)
- Tallentaa uusia liitetiedostoja
- Luoda uusia viestejä
- Tarkkailla lähetysten ja viestien tilaa
-
Liitetiedostojen skannaus
Ympäristöihin on asennettu BucketAV-palvelu skannaamaan S3-palveluun tallennettuja tiedostoja. Tämä komponentti kuuntelee BucketAV-palvelulta tulevia SNS-notifikaatioita ja päivittää sen perusteella tallenetut liitetiedostot puhtaiksi tai saastuneiksi.
-
Lähetysten ajastamisen ajastaminen
Tämän komponentin ainoa tarkoitus on mahdollistaa lähetysvalmiiden viestien pollaus muutaman sekunnin välein. Erillinen komponentti on tarpeellinen, koska pienin aikaikkuna johon lambdan toistuvan ajon voi aikatauluttaa on yksi minuutti.
-
Lähetysvalmiiden viestien pollaus ja lähetys
Tämä komponentti pollaa tietokantaa ja ottaa lähetykseen maksimissaan tietyn määrän viestien vastaanottajia ettei SES-palvelun lähetysquota ylity.
-
Lähetyksen tilan päivitys
Tämä komponentti kuuntelee SES-palvelulta tulevia notifikaatioita ja päivittää sen perusteella yksittäiselle vastaanottajalle tehdyn lähetyksen tilaa.
-
Vanhojen viestien poisto
Tämä komponentti poistaa vanhat viestit, vastaanottajat, liitteet ja lähetykset kun viesteille määritelty säilytysaika on päättynyt.
-
Raportointi
Tämä komponentti sisältää viestinvälityspalvelun käyttöliittymän tarvitsemat endpointit.
Lokaali ympäristö emuloi sovelluksen keskeisiä toiminnallisuuksia. Se perustuu Spring Boot -sovellukseen, koska tällä tavalla featurekehitys on yksinkertaisempaa (esim. debuggerin voi laittaa kiinni yhteen JVM:ään eikä jokaiseen lambdaan erikseen). Localstackia käytetään ainoastaan S3-liitetiedostobucketin, SES:in, SQS:n ja CloudWatchin osalta. Osaa toiminnallisuuksista (esim. lähetyksen ajastus, BucketAV-skannaus) simuloidaan testikoodilla.
Lokaali ympäristö ei oletuksena käytä CAS-integraatiota, vaan spring-konfiguraatiossa on määritelty testikäyttäjät (ks. integraatioprojektin SecurityConfiguration-luokka), näin a) lokaali kehitys ei ole riippuvainen CAS-yhteydestä, ja b) samaa konfiguraatiota voidaan käyttää integraatiotesteissä.
Lokaalin ympäristön käyttöönotto
- Asenna docker-compose: https://docs.docker.com/compose/install/
- Mene hakemistoon ./integraatio/docker
- Käynnistä docker-ympäristö komennolla: docker-compose up
- Käynnistä lokaali sovellus ajamalla mainMethod-metodi luokassa fi.oph.viestinvalitys.vastaanotto.DevApp. Käynnistyksen yhteydessä luodaan tarvittavat komponentit localstackiin (S3-bucketit, SQS-jonot)
- Kirjaudu sisään sovellukseen menemällä osoitteeseen: https://localhost:8080/login (tunnukset esim. user/password)
- Mene osoitteeseen: https://localhost:8080/swagger, kaikkia kutsuja pitäisi pystyä kokeilemaan esimerkkiparametreilla
- Järjestelmän tilaa voi seurata kannasta (salasana on "app"): psql -U app --host localhost -d viestinvalityspalvelu
Lähtökohtaisesti mailit ohjautuvat MailCatcheriin joka löytyy osoitteesta http://localhost:1080. Lähetetyn viestin tilan päivitystä (SES -eventtejä) voi testata liittämällä vastaanottajan nimiosaan liitteen +success (esim. [email protected]), jolloin maili ohjataan Localstackin SES-palvelulle joka palauttaa Delivery-eventin. Myös +bounce ja +complaint -liitteet sisältävät osoitteet ohjataan Localstack SES -palvelulle, mutta se ei toistaiseksi tue Bounce- ja Complaint-eventtejä.
Huomaa että Localstack-ympäristö ei persistoi tilaansa, joten jos sammutat docker-composen, niin tallennetut liitteet katoavat S3-bucketista (kannassa ne säilyvät).
Lokaalia Spring Boot -sovellusta voi ajaa myös CAS-autentikointia käyttäen. Tämä onnistuu vaihtamalla integraatio-projektin application.properties-tiedostossa profiiliksi caslocal
.
Tällöin tulee käyttöön erillinen Spring Security -konfiguraatio luokassa CasSecurityConfiguration.
Oletuksena käytetään CAS-autentikoinnin ja muiden järjestelmien rajapintojen osalta hahtuva-ympäristöä. Testiympäristön voi vaihtaa DevApp-tiedostossa olevia osoitteita muokkaamalla.
CAS-kirjautumista käytettäessä myös käyttöliittymän env.local-tiedostoon on päivitettävä raportointi-backendin osoite ja kirjautumisosoite env.templatessa olevan esimerkin mukaan.
HUOM! Integraatiotestejä ajettaessa täytyy olla dev-profiili käytössä jotta formlogin toimii.
- Asenna aws vault: https://github.com/99designs/aws-vault
- Asenna cdk cli (esim. homebrew:lla)
- Aja cdk-hakemistossa
npm ci
- Tee tarvittaessa palveluista tuoreet buildit
- Aja juuressa ./deploy.sh hahtuva deploy
- Kirjaudu sisään sovellukseen osoitteessa: https://viestinvalitys.hahtuvaopintopolku.fi/lahetys/login
- Swagger on osoitteessa: https://viestinvalitys.hahtuvaopintopolku.fi/swagger
Lisäksi integraatioita varten ympäristön parameter storessa on oltava cas-autentikaation palvelutunnuksen salasana:
- /<ympäristö>/viestinvalitys/palvelutunnus-password
- Deployaa persistenssi-stack
- Luo seuraavat parametrit ssm:ssä:
- /<ympäristö>/postgresqls/viestinvalityspalvelu/app-user-password
- /<ympäristö>/postgresqls/viestinvalityspalvelu/master-user-password
- /<ympäristö>/postgresqls/viestinvalityspalvelu/readonly-user-password
- Aseta oph-käyttäjän salasana RDS-kannalle (master-user-password ks. yllä)
- Kirjaudu sisään kantaan bastionilta oph-tunnuksella: psql -U oph --host viestinvalitys.db.<ympäristö>opintopolku.fi -d postgres
- Luo tietokanta: CREATE DATABASE viestinvalitys;
- Aja (lokaalisti) sovelluskäyttäjien luomiseksi skripti: tools/db/update-postgres-db-roles.sh <ympäristö> viestinvalitys
-
Käynnistä kuormatestausympäristö komennolla: ./deploy.sh <ympäristö> loadup
-
Kirjaudu sisään kuormatestausinstanssiin komennolla: ./kuormatestaus/ssh.sh <ympäristö>
-
Käynnistä shelli komennolla: bash
-
ja kuormatesti komennolla: ./kuormatestaus/run.sh
-
Seuraa ajon kulkua Cloudwatchin dashboardilta, dashboardin nimi on <ympäristö>-viestinvalitys
Dashboardista pitäisi näkyä seuraavat vaiheet:
- Rampup: lähetettyjen viesti (sekä korkea että normaali prioriteetti) määrä nousee samassa tahdissa lähetyspyyntöjen kanssa
- Maksimi lähetysnopeus ylittyy: jolloin normaaliprioriteetin viestien lähetysnopeus alkaa laskea
- Korkean priorieetin viestin määrä ylittää maksimilähetysnopeuden: normaalien prioriteetin viestejä ei lähetetä, korkean prioriteetin viestejä lähetetään hitaammin kuin niitä saapuu
- Rampdown: jossain vaiheessa ramp-downia korkean prioriteetin jono tyhjenee jolloin normaalin prioriteetin viestejä aletaan jälleen lähettää
- Normaalin prioriteetin jonon purku: ajon loputtua järjestelmä purkaa maksimilähetysnopeudella normaalin prioriteetin jonon
-
Tutki tulokset konsolilta. Raportilla ei pitäisi olla virheitä. Erityisesti skaalausvaiheessa yksittäiset pyynnöt voivat kestää pitkään, mutta palvelulle ei ainakaan toistaiseksi ole määritelty SLA:ta.
-
Tuhoa kuormatestausympäristö komennolla: ./deploy.sh <ympäristö> loaddown (muista tehdä tämä!)
Kuormatestaus pituus on tarkoituksella rajattu lyhyeksi, koska viestien lähettäminen SES simulaattorin laskutetaan normaalitaksoilla, jolloin hinnaksi tulee noin 1 euro/minuutti.
Kuormatestauksen ajo jokaisen tiketin yhteydessä on suositeltavaa. Koska:
- Kesto on lyhyt joten ylimääräinen vaiva on pieni
- Apimuutokset tms. voivat rikkoa skriptin, joten skriptin toimivuus tulee testattua samalla