Questo tutorial spiega come gestire Infrastructure as Code con Terraform e Cloud Build utilizzando la popolare metodologia GitOps. Il termine GitOps era coniata per la prima volta da Weaveworks, e il suo concetto chiave è l'utilizzo di un repository Git per l'archiviazione dell'ambiente lo stato desiderato. Terraform è un HashiCorp che consente di creare, modificare e migliorare in modo prevedibile della tua infrastruttura cloud mediante il codice. In questo tutorial utilizzi Cloud Build (un servizio di integrazione continua di Google Cloud) per eseguire e applicare i manifest Terraform al tuo ambiente.
Questo tutorial è rivolto a sviluppatori e operatori che cercano una strategia elegante per apportare modifiche prevedibili all'infrastruttura. L'articolo presuppone che tu abbia familiarità con Google Cloud, Linux e GitHub.
Lo stato delle DevOps ha identificato funzionalità in grado di migliorare le prestazioni di distribuzione del software. Questo il tutorial ti aiuterà con le seguenti funzionalità:
Architettura
Per dimostrare come questo tutorial applica le pratiche GitOps per la gestione delle esecuzioni di Terraform, considera il seguente diagramma di architettura. Tieni presente che
utilizza i rami GitHub, dev
e prod
, per rappresentare gli ambienti reali. Questi
sono definiti dalle reti Virtual Private Cloud (VPC):dev
e
prod
, rispettivamente, in un progetto Google Cloud.
Il processo si avvia quando esegui il push del codice Terraform sull'oggetto dev
o prod
ramo. In questo scenario, Cloud Build attiva e poi applica i manifest Terraform per raggiungere lo stato desiderato nel rispettivo ambiente.
D'altra parte, quando esegui il push del codice Terraform in un altro ramo, ad esempio in un ramo di funzionalità, Cloud Build viene eseguito per eseguire terraform plan
, ma non viene applicato nulla a nessun ambiente.
Idealmente, gli sviluppatori o gli operatori devono presentare proposte di infrastruttura ai
rami non protetti
e poi inviarle tramite
pull request.
L'app GitHub di Cloud Build, discussa più avanti in questo tutorial, attiva automaticamente i job di compilazione e collega i report terraform plan
a queste richieste di pull. In questo modo, puoi discutere e rivedere le potenziali modifiche con i collaboratori e aggiungere commit di follow-up prima che le modifiche vengano unite al ramo base.
Se non vengono sollevati problemi, devi prima unire le modifiche al ramo dev
. Questa unione attiva un deployment dell'infrastruttura in dev
che ti consente di testare questo ambiente. Dopo aver testato e
di cosa è stato eseguito il deployment, devi unire il ramo dev
al
Ramo prod
per attivare l'installazione dell'infrastruttura in produzione
completamente gestito di Google Cloud.
Obiettivi
- Configura il tuo repository GitHub.
- Configurare Terraform per archiviare lo stato in un bucket Cloud Storage.
- Concedi le autorizzazioni al tuo account di servizio Cloud Build.
- Connetti Cloud Build al tuo repository GitHub.
- Modifica la configurazione del tuo ambiente in un ramo di funzionalità.
- Promuovere le modifiche all'ambiente di sviluppo.
- Apportare modifiche all'ambiente di produzione.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.
Prerequisiti
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- In Cloud Shell, recupera l'ID del progetto appena selezionato:
Se questo comando non restituisce l'ID progetto, configura Cloud Shell in per utilizzare il tuo progetto. Sostituiscigcloud config get-value project
PROJECT_ID
con il tuo progetto ID.gcloud config set project PROJECT_ID
- Abilita le API richieste:
Potrebbero essere necessari alcuni minuti per completare questo passaggio.gcloud services enable cloudbuild.googleapis.com compute.googleapis.com
- Se non hai mai utilizzato Git in Cloud Shell, configuralo con
nome e indirizzo email:
Git utilizza queste informazioni per identificarti come autore dei commit che da creare in Cloud Shell.git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_NAME"
Configurazione del repository GitHub
In questo tutorial, utilizzerai un singolo repository Git per definire il tuo dell'infrastruttura. Puoi orchestrare questa infrastruttura avendo diverse rami corrispondenti a diversi ambienti:
- Il ramo
dev
contiene le ultime modifiche applicate all'ambiente di sviluppo. - Il ramo
prod
contiene le ultime modifiche applicate all'ambiente di produzione.
Con questa infrastruttura, puoi sempre fare riferimento al repository per sapere
configurazione è prevista in ogni ambiente e proporre nuove modifiche
unendoli prima nell'ambiente dev
. Quindi promuovi le modifiche
unendo il ramo dev
nel ramo prod
successivo.
Per iniziare, crea un fork solutions-terraform-cloudbuild-gitops repository Git.
- Su GitHub, vai a https://github.com/GoogleCloudPlatform/solutions-terraform-cloudbuild-gitops.git.
Nell'angolo in alto a destra della pagina, fai clic su Fork.
Ora hai una copia di
solutions-terraform-cloudbuild-gitops
un repository con file di origine.
In Cloud Shell, clona questo repository creato mediante fork, sostituendo
YOUR_GITHUB_USERNAME
con il tuo nome utente GitHub:cd ~ git clone https://github.com/YOUR_GITHUB_USERNAME/solutions-terraform-cloudbuild-gitops.git cd ~/solutions-terraform-cloudbuild-gitops
Il codice in questo repository è strutturato come segue:
La cartella
environments/
contiene sottocartelle che rappresentano ambienti, comedev
eprod
, che forniscono una separazione logica tra i carichi di lavoro in diverse fasi di maturità, rispettivamente sviluppo e produzione. Sebbene sia buona norma avere ambienti il più simili possibile, ogni sottocartella ha la propria configurazione Terraform per garantire che possano avere impostazioni univoche, se necessario.La cartella
modules/
contiene moduli Terraform in linea. Questi moduli rappresentano raggruppamenti logici di risorse correlate e vengono utilizzati per condividere il codice in diversi ambienti.Il file
cloudbuild.yaml
è un file di configurazione di compilazione che contiene istruzioni per Cloud Build, ad esempio come eseguire attività basate in una serie di passaggi. Questo file specifica un'esecuzione condizionale che dipende dal ramo Cloud Build sta recuperando il codice, ad esempio:Per i rami
dev
eprod
, vengono eseguiti i seguenti passaggi:terraform init
terraform plan
terraform apply
Per qualsiasi altro ramo, vengono eseguiti i seguenti passaggi:
terraform init
per tutte leenvironments
sottocartelleterraform plan
per tutte leenvironments
sottocartelle
Per assicurarti che le modifiche proposte siano appropriate per ogni ambiente,
terraform init
e terraform plan
vengono eseguite per tutte le environments
sottocartelle. Prima di unire la richiesta di pull, puoi esaminare i piani
verificare che non sia concesso l'accesso a un'entità non autorizzata, ad esempio
esempio.
Configurare Terraform per archiviare lo stato in un bucket Cloud Storage
Per impostazione predefinita, Terraform archivia
lo stato
localmente in un file denominato terraform.tfstate
. Questa configurazione predefinita può
complicare l'utilizzo di Terraform per i team, soprattutto quando molti utenti eseguono
Terraform contemporaneamente e ogni macchina ha la propria comprensione dell'
infrastruttura attuale.
Per aiutarti a evitare questi problemi, questa sezione configura un
stato remoto
che rimanda a un bucket Cloud Storage. Lo stato remoto è una funzionalità dei backend e, in questo tutorial, viene configurato nei file backend.tf
, ad esempio:
Nei passaggi che seguono, creerai un bucket Cloud Storage e modificherai alcuni file in modo che rimandino al nuovo bucket e al progetto Google Cloud.
In Cloud Shell, crea il bucket Cloud Storage:
1. Attiva Controllo delle versioni degli oggetti per conservare la cronologia dei tuoi deployment:PROJECT_ID=$(gcloud config get-value project) gsutil mb gs://${PROJECT_ID}-tfstate
```sh gcloud storage buckets update gs://${PROJECT_ID}-tfstate --versioning ``` Enabling Object Versioning increases [storage costs](/storage/pricing){: track-type="tutorial" track-name="internalLink" track-metadata-position="body" }, which you can mitigate by configuring [Object Lifecycle Management](/storage/docs/lifecycle){: track-type="tutorial" track-name="internalLink" track-metadata-position="body" } to delete old state versions.
Sostituisci il segnaposto
PROJECT_ID
con l'ID progetto sia nei fileterraform.tfvars
chebackend.tf
:cd ~/solutions-terraform-cloudbuild-gitops sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
Su OS X/MacOS, potrebbe essere necessario aggiungere due virgolette (
""
) doposed -i
, come segue:cd ~/solutions-terraform-cloudbuild-gitops sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
Controlla se tutti i file sono stati aggiornati:
git status
L'output è simile al seguente:
On branch dev Your branch is up-to-date with 'origin/dev'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: environments/dev/backend.tf modified: environments/dev/terraform.tfvars modified: environments/prod/backend.tf modified: environments/prod/terraform.tfvars no changes added to commit (use "git add" and/or "git commit -a")
Esegui il commit e il push delle modifiche:
git add --all git commit -m "Update project IDs and buckets" git push origin dev
A seconda della configurazione di GitHub, dovrai autenticarti per spingere le modifiche precedenti.
Concedere le autorizzazioni all'account di servizio Cloud Build
Per consentire Account di servizio Cloud Build eseguire script Terraform con l'obiettivo di gestire le risorse Google Cloud, devi concedere l'accesso appropriato al tuo progetto. Per semplicità, in questo tutorial viene concesso l'accesso come editor del progetto. Ma quando il ruolo di Editor del progetto per un'autorizzazione ad ampio raggio, negli ambienti di produzione è necessario seguire best practice per la sicurezza IT, che di solito prevedono l'accesso con privilegi minimi.
In Cloud Shell, recupera l'indirizzo email dell'account di servizio Cloud Build del tuo progetto:
CLOUDBUILD_SA="$(gcloud projects describe $PROJECT_ID \ --format 'value(projectNumber)')@cloudbuild.gserviceaccount.com"
Concedi l'accesso richiesto al tuo account di servizio Cloud Build:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$CLOUDBUILD_SA --role roles/editor
Connessione diretta di Cloud Build al repository GitHub
Questa sezione illustra come installare App GitHub di Cloud Build. Questa installazione ti consente di connettere il tuo repository GitHub progetto Google Cloud in modo che Cloud Build possa applicare automaticamente i tuoi manifest Terraform ogni volta che crei un nuovo ramo o esegui il push del codice GitHub.
I passaggi riportati di seguito forniscono istruzioni per installare l'app solo per il repository
solutions-terraform-cloudbuild-gitops
, ma puoi scegliere di installarla per uno o più dei tuoi repository.Vai alla pagina GitHub Marketplace per Cloud Build dell'app:
Apri la pagina dell'app Cloud Build
- Se è la prima volta che configuri un'app in GitHub: fai clic su Configura. con Google Cloud Build in fondo alla pagina. Quindi, fai clic su Concedi l'accesso di questa app al tuo account GitHub.
- Se non è la prima volta che configuri un'app in GitHub: fai clic su Configura l'accesso. La pagina Applicazioni del tuo account personale dell'account di servizio.
Fai clic su Configura nella riga Cloud Build.
Seleziona Solo repository selezionati, quindi
solutions-terraform-cloudbuild-gitops
per connetterti al repository.Fai clic su Salva o Installa. L'etichetta del pulsante cambia in base al tuo flusso di lavoro. Verrà eseguito il reindirizzamento a Google Cloud per continuare l'installazione.
Accedi con il tuo account Google Cloud. Se richiesto, autorizza Integrazione di Cloud Build con GitHub.
Nella pagina Cloud Build, seleziona il tuo progetto. Viene visualizzata una procedura guidata.
Nella sezione Seleziona repository, seleziona il tuo account GitHub e il
solutions-terraform-cloudbuild-gitops
repository.Se accetti i Termini e condizioni, seleziona la casella di controllo, quindi fai clic su Connetti.
Nella sezione Crea un trigger, fai clic su Crea un trigger:
- Aggiungi un nome per l'attivatore, ad esempio
push-to-branch
. Prendi nota del nome dell'attivatore, perché ti servirà in seguito. - Nella sezione Evento, seleziona Push al ramo.
- Nella sezione Origine, seleziona
.*
nel campo Ramo. - Fai clic su Crea.
- Aggiungi un nome per l'attivatore, ad esempio
L'app GitHub di Cloud Build è ora configurata e il tuo repository GitHub è collegato al tuo progetto Google Cloud. D'ora in poi, le modifiche il repository GitHub attiva le esecuzioni di Cloud Build, che segnalano i risultati a GitHub utilizzando Controlli GitHub.
Modifica della configurazione dell'ambiente in un nuovo ramo di funzionalità
A questo punto, hai configurato la maggior parte dell'ambiente. È il momento di creare modifiche al codice nel tuo ambiente di sviluppo.
Su GitHub, vai alla pagina principale del repository creato con fork.
https://github.com/YOUR_GITHUB_USERNAME/solutions-terraform-cloudbuild-gitops
Assicurati di essere nella filiale
dev
.Per aprire il file per la modifica, vai al file
modules/firewall/main.tf
e fai clic sull'icona a forma di matita.Alla riga 30, correggi l'errore ortografico di
"http-server2"
nel campotarget_tags
.Il valore deve essere
"http-server"
.Aggiungi un messaggio di commit nella parte inferiore della pagina, ad esempio "Correzione del target del firewall http", e seleziona Crea un nuovo ramo per questo commit e avvia una pull request.
Fai clic su Proponi modifiche.
Nella pagina seguente, fai clic su Crea richiesta di pull per aprire una nuova richiesta di pull richiesta con la tua modifica.
Una volta aperta la richiesta di pull, viene eseguito un job Cloud Build avviato automaticamente.
Fai clic su Mostra tutti i controlli e attendi che il controllo diventi verde.
Fai clic su Dettagli per visualizzare ulteriori informazioni, incluso l'output di
terraform plan
al link Visualizza ulteriori dettagli su Google Cloud Build.
Non unire ancora la richiesta di pull.
Tieni presente che il job Cloud Build ha eseguito la pipeline definita nel
cloudbuild.yaml
file. Come discusso in precedenza, questa pipeline ha comportamenti diversi a seconda del ramo recuperato. La build controlla se La variabile$BRANCH_NAME
corrisponde a qualsiasi cartella di ambiente. Se sì, Cloud Build esegueterraform plan
per quell'ambiente. In caso contrario, Cloud Build esegueterraform plan
per tutti gli ambienti per assicurarsi che la modifica proposta sia appropriata per tutti. Se uno di questi elementi questi piani non vengono eseguiti, la build non funziona.Analogamente, il comando
terraform apply
viene eseguito per i rami di ambiente, viene completamente ignorato in qualsiasi altro caso. In questa sezione hai inviato una modifica al codice in un nuovo ramo, pertanto non sono stati applicati deployment dell'infrastruttura al tuo progetto Google Cloud.Applicazione forzata dell'esecuzione di Cloud Build prima dell'unione dei rami
Per fare in modo che le unioni possano essere applicate solo in relazione a Cloud Build sono riuscite, procedi con i seguenti passaggi:
Su GitHub, vai alla pagina principale del repository creato mediante fork.
https://github.com/YOUR_GITHUB_USERNAME/solutions-terraform-cloudbuild-gitops
Sotto il nome del repository, fai clic su Impostazioni.
Nel menu a sinistra, fai clic su Filiale.
In Regole di protezione dei rami, fai clic su Aggiungi regola.
In Pattern del nome del ramo, digita
dev
.Nella sezione Proteggi i rami corrispondenti, seleziona Richiedi stato controlli da superare prima dell'unione.
Cerca il nome del trigger di Cloud Build creato in precedenza.
Fai clic su Crea.
Ripeti i passaggi da 3 a 7, impostando Pattern nome ramo su
prod
.
Questa configurazione è importante protezione entrambi i rami
dev
eprod
. il che significa che i commit devono prima essere inviati solo a un altro ramo, e solo allora potranno essere uniti a quello protetto. Nella questo tutorial, la protezione richiede che l'esecuzione di Cloud Build affinché l'unione sia consentita.Promozione delle modifiche all'ambiente di sviluppo
Hai una richiesta di pull in attesa di essere unita. È il momento di applicare lo stato vuoi il tuo ambiente
dev
.Su GitHub, vai alla pagina principale del repository creato con fork.
https://github.com/YOUR_GITHUB_USERNAME/solutions-terraform-cloudbuild-gitops
Sotto il nome del repository, fai clic su Pull request.
Fai clic sulla richiesta di pull appena creata.
Fai clic su Unisci richiesta di pull e poi su Conferma unione.
Verifica che sia stato attivato un nuovo Cloud Build:
Apri la build e controlla i log.
Al termine della compilazione, viene visualizzato un messaggio simile al seguente:
Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE Step #3 - "tf apply": firewall_rule = dev-allow-http Step #3 - "tf apply": instance_name = dev-apache2-instance Step #3 - "tf apply": network = dev Step #3 - "tf apply": subnet = dev-subnet-01
Copia
EXTERNAL_IP_VALUE
e apri l'indirizzo in un browser web.http://EXTERNAL_IP_VALUE
Questo provisioning potrebbe richiedere alcuni secondi per l'avvio della VM e la propagazione della regola del firewall. Alla fine, vedrai Ambiente: dev nel browser web.
Vai al file di stato Terraform nel bucket Cloud Storage.
https://storage.cloud.google.com/PROJECT_ID-tfstate/env/dev/default.tfstate
Promozione di modifiche all'ambiente di produzione
Ora che hai testato completamente l'ambiente di sviluppo, puoi promuovere il codice dell'infrastruttura in produzione.
Su GitHub, vai alla pagina principale del repository creato mediante fork.
https://github.com/YOUR_GITHUB_USERNAME/solutions-terraform-cloudbuild-gitops
Sotto il nome del repository, fai clic su Richieste pull.
Fai clic su Nuova richiesta di pull.
Per il repository di base, seleziona il repository appena creato con fork.
Per base, seleziona
prod
dal tuo repository di base. Per confronta, selezionadev
.Fai clic su Crea richiesta di pull.
In title, inserisci un titolo, ad esempio
Promoting networking changes
, quindi fai clic su Crea pull request.Esamina le modifiche proposte, inclusi i dettagli di
terraform plan
di Cloud Build, quindi fai clic su Unisci richiesta pull.Fai clic su Conferma unione.
Nella console Google Cloud, apri la pagina Cronologia build per vedere le modifiche applicate all'ambiente di produzione:
Attendi il completamento della build, quindi controlla i log.
Alla fine dei log, vedrai qualcosa di simile a questo:
Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE Step #3 - "tf apply": firewall_rule = prod-allow-http Step #3 - "tf apply": instance_name = prod-apache2-instance Step #3 - "tf apply": network = prod Step #3 - "tf apply": subnet = prod-subnet-01
Copia
EXTERNAL_IP_VALUE
e apri l'indirizzo in una pagina web del browser.http://EXTERNAL_IP_VALUE
Questo provisioning potrebbe richiedere alcuni secondi per l'avvio della VM e la propagazione la regola firewall. Alla fine, vedrai Ambiente: prod nella browser web.
Vai al file di stato Terraform nel bucket Cloud Storage.
https://storage.cloud.google.com/PROJECT_ID-tfstate/env/prod/default.tfstate
Hai configurato correttamente una pipeline di infrastruttura come codice serverless su Cloud Build. In futuro, ti consigliamo di provare quanto segue:
- Aggiungi implementazioni per casi d'uso separati.
- Crea altri ambienti per soddisfare le tue esigenze.
- Utilizza un progetto per ambiente anziché un VPC per ambiente.
Esegui la pulizia
Al termine del tutorial, elimina le risorse che hai creato su Google Cloud in modo che non ti vengano addebitate in futuro.
Elimina il progetto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Eliminazione del repository GitHub
Per evitare di bloccare le nuove richieste di pull nel tuo repository GitHub, puoi eliminare le regole di protezione dei rami:
- In GitHub, vai alla pagina principale del repository di cui hai creato un fork.
- Sotto il nome del repository, fai clic su Impostazioni.
- Nel menu a sinistra, fai clic su Filiali.
- Nella sezione Regole per la protezione dei rami, fai clic sul pulsante Elimina sia per le righe
dev
sia per quelleprod
.
Se vuoi, puoi disinstallare completamente l'app Cloud Build da GitHub:
Vai alle impostazioni delle app di GitHub.
Nella scheda App GitHub installate, fai clic su Configura nel Riga Cloud Build. Quindi, nella sezione Zona pericolosa, fai clic sul pulsante Disinstalla nella riga Disinstalla Google Cloud Builder.
Nella parte superiore della pagina viene visualizzato il messaggio "Tutto pronto. Un job è stato messo in coda per disinstallare Google Cloud Build."
Nella scheda App GitHub autorizzate, fai clic sul pulsante Revoca nella riga Google Cloud Build, quindi su Ho capito, revoca l'accesso nel popup.
Se non vuoi conservare il tuo repository GitHub:
- In GitHub, vai alla pagina principale del repository creato con fork.
- Sotto il nome del repository, fai clic su Impostazioni.
- Scorri verso il basso fino alla sezione Zona pericolosa.
- Fai clic su Elimina questo repository e segui la procedura di conferma.
Passaggi successivi
- Valuta la possibilità di utilizzare i modelli di Cloud Foundation Toolkit per creare rapidamente una base ripetibile a livello aziendale in Google Cloud.
- Guarda Repeatable Google Cloud Environments at Scale With Cloud Build Infra-As-Code Pipelines di Next' 19 sul flusso di lavoro GitOps descritto in questo tutorial.
- Consulta il tutorial sulla distribuzione continua in stile GitOps con Cloud Build.
- Dai un'occhiata alle funzionalità più avanzate di Cloud Build: Configurazione dell'ordine dei passaggi di build, Creazione, test e deployment di elementi, e Creazione di passaggi di build personalizzati.
- Consulta il blog su come garantire la scalabilità e la conformità del deployment di Terraform con Cloud Build.
- Leggi le nostre risorse su DevOps.
- Scopri di più sulle funzionalità DevOps correlate a questo tutorial:
- Prendi l' Controllo rapido DevOps per capire a che punto sei rispetto al resto del settore.