En implementasjon av stukturen fra https://immutablewebapps.org/ .
- Opprett en fork av dette repoet på din egen bruker og klon det ned på egen maskin
- Sjekk at
node
ognpm
er installert brew install awscli
brew install terraform
git --version
er større en 2.9 (om du har lavere versjon, drop githook som er nevnt senere)- Opprett en AWS-konto. (jeg har valgt region eu-north-1 (Stockholm) ) Om du legger inn betalingskort, så vær klar over at du betaler for enkelte tjenester, følg med på Billing-service
- Opprett en ny bruker i IAM
- Add user: username
terraform
og access typeProgrammatic access
- Permissions:
Attach existing policies directly
og velg policyen med policy nameAdministratorAccess
- Tags: name =
system
og value=terraform
- Etter Create,husk å last ned access-key og secret.
- Add user: username
- Kjør kommandoen
aws configure
med ACCESS_KEY_ID og SECRET_ACCESS_KEY som du fikk fra brukeren over.- Kommandoen
aws iam get-user
kan brukes som en ping og sjekk av alt ok!
- Kommandoen
Om du allerede nå ser at du vil lage noe under et eget domene, anbefaler jeg å gå inn på AWS Route 53 og opprettet et billig et med en gang. Selv om det sikkert går mye fortere, advarere Amazon om at det kan ta opp til 3 dager.
- Kjør opp appen med
npm install && npm run start
- Generer en index.html med
node src-index/main.js
- Gjør deg kjent med hvor de forskjellige inputene og env-variablene i appen kommer fra
Felles mål her er en immutable webapp med to S3-buckets og et CDN foran som hoster index.html og kildekode.
Nyttige lenker:
- Om du ikke er veldig kjent i aws-konsollen fra før, anbefaler jeg å sjekke ut de forskjellie servicene underveise
- Terraform-docs
- AWS-cli-docs
Opprett to buckets som skal bli der vi server asset og host fra ved å bruke terraform. Start i terraform/test/main.tf
. I tillegg til buckets, anbefaler jeg å bruke en aws_s3_bucket_policy
for å sette objektene i bucketen til public. For å få generert en public policy, bruk http://awspolicygen.s3.amazonaws.com/policygen.html
Husk at S3-bucketnavn må være unike innenfor en region!
Tips
- Principal
*
dekker alle brukere også uinloggede - bruk attributet
arn
fraaws_s3_bucket
som input til policyen - bruk
*
som key_name slik at policyen dekker alle filer "s3:GetObject"
er actionen som trengs for å lese en fil
Tips
Anbefalt terraform-output:
- bucket_domain_name
- id
Bygg assets manuelt npm run build
og last opp alt innholdet i build-mappen til asset-bucketen under navnet assets/id
. Velg en tilfeldig id for testen, senere skal vi bruke githash! Test at fila blir tilgjengelig i browseren på <bucket_domain_name>/assets/id/main.js
og sett rett cachcontrol-headers.
aws s3 cp <LocalPath> <S3Uri>
Se AWS-cli-docs for aws s3 cp
Tips
- bruk følgende S3-uri
s3://bucket-name/assets/1/
--recursive
laster opp hele mappen--cache-control public,max-age=31536000,immutable
setter cache-controls-headerne til alltid lagre som beskrevet i https://immutablewebapps.org/
Gjør endringer i sha
og url
i src-index/main.js
for å peke på bucket og fila du har lastet opp over.
Bygg index.html (node src-index/main.js
) og bruk aws s3 cp
igjen for å kopiere index.html til host-bucket. Husk rett headers
Om du nå går på <bucket_domain_name>/index.html
bør du se en kjørende applikasjon.
Tips
- Bruk
index.html
både som localPath ogs3://bucket-host-name/index.html
som S3Uri ettersom vi kun laster opp en fil --cache-control no-store
setter cache-controls-headerne til aldri lagre som beskrevet i https://immutablewebapps.org/
Det finnes en githook som linter yml-filer for å slippe unna enkelte yml-feil i workflow-definisjonen.
Om du ønsker å ta den i bruk kan du sette git config core.hooksPath .githooks
- Bygg og kopier filer til assets-bucketen på hver push, se
.github/workflows/nodejs.yml
- I run-delen av en githubaction kan man hente ut commit med
${{github.sha}}
, se docs
- Utvid
.github/workflows/nodejs.yml
til også å lage og kopiere opp index.html. Sjekk ut tilgjengelige variable for node i docs.
AWS CloudFront er Amazon sin CDN-provider, se terraform-docs.
- TODO tine må fylle ut tips herfra *
Test ut endringer i App.jsx
og deploy ny versjon av assets og index for å sjekke caching og endringer.
- OBS: Nå kan du bruke
domain_name
outputen fra cloudfront som erstatning formy-url
isrc-index/main.js
Cirka frem til punktet "Lag et eget domene" kan du finne et løsningsforslag i repoet https://github.com/kleivane/immutable-webapp .
- Lag et prodmiljø
- La terraform opprette en iam-bruker som bruker av github med rettigheter kun til opplasting i buckets. Rettighetssimulatoren for iam kan hjelpe litt
- Ta i bruk remote backend i S3
- Trekk ut til en felles terraform-modul
- Trekk ut bygging av index.html til en lambda
- Lambdaen trenger kildekode i egen bucket
- La tagging i github
lambda-x.y.z
trigge bygging og release av ny kildekode - Provisjoner lambda med terraform pr miljø og send inn versjon av kildekoden som skal brukes
- Lag et eget domene i Route 53 slik at du har en egen url
- Lag sertifikat fra certification manager
- Legg inn alias og sertifikat (
viewer_certificate
) i cloudfront. Merk avssl_support_method = sni-only
for å unngå ekstra kostnader! - Opprett alias i route53 med en ny record
- Alias record typically have a type of A or AAAA, but they work like a CNAME record
- Skriv tester! https://terratest.gruntwork.io/
- Trekk ut prodmiljø i en egen AWS-account
- Rull ut dockercontaineren fra https://github.com/kleivane/static-json
- Test ut workspaces for terraform-endringer
- Bruk moduler fra https://github.com/cloudposse/, feks https://github.com/cloudposse/terraform-aws-cloudfront-cdn
- Flytt cachecontrol fra hver enkelt fil til lambda@edge
- Bruk en annen skyprovider
- Klone repoet git clone starterpack
- Slett .git-mappa
- Slett stuff under terraform (behold test/main og test/output)
- Slett stuff under .github (behold nodejs0.yml, og triggere xxxxx)
- Lag et nytt repo på github
- Slett notatene her
- Kjør git init, add, commit, push til nytt repo
- Infrastruktur som kode
- Deploy av kode og infrastruktur skal skje fra ci
- Utviklere skal ha rettigheter som ikke stopper dem fra å teste og utforske
- Prod skal ha annen tilgangsstyring enn test
- Bygget kode skal kunne deployes til alle miljøer - config skal leve et annet sted
- Den eneste hemmeligheten utenfor infrastrukturen skal egentlig være access-keys
- Gjør deg kjent med verktøyene i skyplattformen, deres styrker og svakheter, følg med på nyheter :)
- Om to produkter kan løse samme oppgaven, velg den som gir minst vedlikeholdsarbeide
name på ressursser = tf-* navn i terraform = se link
Tags managed_by = terraform environment = ci/dev/test/prod/common system = tilhørighet
I alle moduler:
Lag en input variabel i alle moduler som heter tags , type map(string)
og så ha en tags = var.tags
eller vtags = merge(var.tags, { Name = "mytag"}) hvis du trenger å legge til egne
Det aller viktigste er egentlig at du skriver moduler som du kan sende tags inn i uten å måtte endre hele modulen hvis du senere kommer på en tag som er kjekk å ha
iam: type = program/person
- hvorfor trenger vi public acl på cp når man setter bucket til public? -> det virker som om canned acl tilhører et gammelt oppsett på aws s2 før iam-policies var lansert. Anbefalingene jeg har funnet frem preferer bucket policies over acl. Sistnevnte må også settes både på bucket og på objektnivå, noe som er ganske forvirrende.
- kan man sette cachecontrol på bucketnivå?