Eksamen | PGR301 - DevOps i skyen | Oppgave | App | Infrastucture | Kandidatnummer: 10004 | Karakter: A
Dette repositoriet er infrastruktur-biten av eksamenen min i faget PGR301 - DevOps i skyen. Prosjektet viser hvordan man kan bruke Travis-CI og Terraform til å kontrollere infrastruktur, med hovedvekt på Google Cloud Platform som Terraform provider.
- Prosjektet er satt opp slik at mest mulig av infrastruktur håndteres av Terraform. Se Opprettelse av infrastruktur.
- All Terraformkode er lagt i
./tf
mappen i et forsøk på å holde prosjektet oversiktlig.terraform
-kommandoer må derfor suffixes medtf
, f.eks.terraform plan tf
. - Travis-CI er konfigurert til å kjøre
terraform init
ogterraform plan
fra alle branches, men utfører kuneterraform apply
påmaster
-branchen. - Det er en vedlagt
example.tfvars
som viser de helt nødvendige variablene å sette. Se også./tf/vars.tf
da noen variabler har 'default' verdier som kanskje ikke stemmer.
google_project_service
- aktiverer nødvendige tjenester i Google Cloud prosjektet.google_container_registry
- image registry som det andre repositoriet til eksamenen pusher sine images til.google_cloud_run_service
- kjører applikasjonen som ligger i Container Registryet.google_iam_policy
oggoogle_cloud_run_service_iam_policy
tillater offentlig tilgang til tjenesten
google_sql_database_instance
- hoster en PostgreSQL instans for applikasjonengoogle_sql_database
- oppretter en databasegoogle_sql_user
- oppretter en database-bruker for applikasjonen
statuscake_test
- brukes til å teste om applikasjonen er oppe ved å sende enkle HTTP-meldingerrandom_password
- brukes til å generere passord til brukere
influxdb_database
- oppretter en database i InfluxDB for applikasjoneninfluxdb_user
- oppretter en bruker for applikasjonen å skrive data til InfluxDB og en bruker for Grafana til å lese data fra InfluxDBgrafana_data_source
- oppretter en Data Source i Grafana for InfluxDBen som er konfigurertgrafana_dashboard
- laster inn et ferdiglaget dashboard for applikasjonen
Da Micrometer ikke har offisiell støtte for InfluxDB v.2 og InfluxData nå bruker v.2 har jeg ikke fått dette ut i produksjon.
Ved å starte den vedlagte Docker Compose filen med docker-compose -f metrics-compose.yml up
og sette de nødvendige Terraform-variablene kan man utføre terraform plan tf
som delvis verifiserer oppsettet.
Dersom man har InfluxDB(under versjon 2) og Grafana offentlig hostet kan man i applikasjonen kopiere over InfluxDB konfigurasjonen fra application-dev.yml
til application-prod.yml
for å få ut metrikk fra produksjonemiljøet.
-
Opprett et Google Cloud Platform prosjekt
-
Lag en
Cloud Storage Bucket
for å oppbevaring av Terraform State - navn kan være[PROSJEKTNAVN]-terraform-state
- Aktiver versjonering ved å kjøre følgende kommando i en terminal med rettigheter til prosjektet, som
Cloud Shell
direkte i Google Cloud Platform prosjektet
gsutil versioning set on gs://[BUCKETNAVN]
- Aktiver versjonering ved å kjøre følgende kommando i en terminal med rettigheter til prosjektet, som
-
Aktiver nødvendige GCP APIer via en terminal med rettigheter:
// Lar Terraform kontrollere hvilke servicer som er aktive via "google_project_service" resourcen gcloud services enable cloudresourcemanager.googleapis.com
-
Lag en
Service Account
for Terraform- Gi kontoen de rollene som er beskrevet i "Terraform Service Account Roles"
- Eksporter en .json-nøkkel for kontoen
- Navngi nøkkelen som
gcp_keyfile.json
og plasser den i prosjektetes rot-mappe
-
Opprett eller rediger
backend.tf
-filen i rot mappen med følgende innhold:terraform { backend "gcs" { credentials = "gcp_keyfile.json" bucket = "pgr301-exam-10004-terraform-state" } }
-
Sett de følgende env.global-variablene i
.travis.yml
filen.TF_VAR_project_name=[IDen på GCP Prosjektet] TF_VAR_project_region=[Region GCP Prosjektet er opprettet i] TF_VAR_auth_app_image=[Fullt navn til imaget som skal hostes] TF_VAR_auth_app_tag=[Taggen av imaget som skal hostes]
-
Krypter
gcp_keyfile.json
og variabler for prosjektnavn og region for bruk på Travis-CI med følgende kommandoer:// Google Cloud Platform travis encrypt-file --pro gcp_keyfile.json --add // Logz.io travis encrypt --pro TF_VAR_logzio_token=[Token for Logz.io-bruker] --add travis encrypt --pro TF_VAR_logzio_url=[Listener URL for Logz.io] --add // Statuscake travis encrypt --pro TF_VAR_statuscake_username=[Statuscake Username] --add travis encrypt --pro TF_VAR_statuscake_apikey=[Statuscake API-key] --add travis encrypt --pro TF_VAR_statuscake_contact_group=[Statuscake Contact Group IDs to be notified if service goes down (list of strings)] --add
NB.: Krever pålogget bruker på Travis-CI sin CLI
-
Prosjektet er nå konfigurert slik at et push til
master
branchen vil oppdatere infrastrukturen i henhold til filene i dette prosjektet.
Storage Admin
- gir Terraform tilgang til Cloud Storage for å skrive til State Bucketen.Service Usage Admin
- lar Terraform kontrollere hvilke services som er aktive via "google_project_service" resourcenService Account User
- lar Terraform utføre operasjoner som andre Service AccountsCloud Run Admin
- lar Terraform ha full tilgang til Cloud Run ressurserCloud SQL Admin
- lar Terraform ha full tilgang til Cloud SQL ressurser