Terraform erfreut sich nicht ohne Grund immer größerer Beliebtheit, da es als IaC (Infrastructure as Code) ein hohes Maß an Steuerungsflexibilität bietet.
Unterstützt Module, verfolgt den Status Ihrer Infrastruktur und ist hilfreich, wenn es sich bei Ihrem Projekt um komplexe, Multi-Cloud- oder Hybridumgebungen handelt.
Befolgen Sie zunächst unbedingt diese Anleitung für die Terraform-Installation, falls Sie dies noch nicht getan haben, und stellen Sie sicher, dass das GCP-Konto bereits eingerichtet ist.
Sie sollten die App bereits zuvor über andere Mittel wie CLI bereitgestellt haben, um den Bereitstellungsprozess, die Grundkonfiguration, den inkrementellen Übergang usw. zu verstehen.
Verwandter Blog mit manueller Bereitstellung, den ich unten hinzugefügt habe ??
https://blog.stackademic.com/how-to-deploy-a-go-service-to-gcp-cloud-run-694d01cab5b5
Für meine Projektstruktur habe ich diese Dateien und Verzeichnisstruktur.
terraform/ ├── modules/ │ ├── docker/ │ │ ├── docker-artifact.tf │ │ └── variables.tf │ ├── gcp/ │ │ ├── cloud-run.tf │ │ └── variables.tf ├── main.tf ├── set-prod.env.sh ├── terraform.tfvars ├── variables.tf └── account_key.json
Ich werde Skripte von übergeordneten zu untergeordneten Modulen vorstellen, um eine umfassendere Anleitung zu erhalten.
Höchstwahrscheinlich werden Sie Env-Variablen haben. Der bequemste Weg für mich ist, ein Shell-Skript mit dem TF_VAR_-Präfix zu erstellen, das Terraform erkennt und die initialisierten verwendet (aber dazu später).
#!/bin/bash #server export TF_VAR_redis_url="redis_url" export TF_VAR_firebase_account_key="your_account_key.json" export TF_VAR_client_url="client_url" export TF_VAR_gcp_account_key="client_url" echo "Environment variables for Terraform GCP set."
Variablen, die ich auch auf Modulebene festgelegt habe, aber das übergeordnete Element enthält normalerweise alle, aber auf Modulebene habe ich gerade die richtigen übergeben.
variable "project_id" { description = "The ID of the Google Cloud project." type = string } variable "project_name" { description = "The project name of the Google Cloud Run project." type = string } variable "region" { description = "The Google Cloud region." type = string } variable "redis_url" { description = "The URL for the Redis instance." type = string } variable "client_url" { description = "The URL for the client application." type = string } variable "gcp_account_key" { description = "Path to the Google Cloud service account key file." type = string } variable "firebase_account_key_location" { description = "Firebase account key location in Docker container." type = string }
Es gibt auch eine andere Skriptdatei, die ich erstellt habe, die KEINE privaten oder geheimen Schlüsselwerte enthält, die leicht geändert werden können und praktisch für Standardwerte ist, nämlich Ihre terraform.tfvars
project_id = "recepies-6e7c0" project_name = "recipe-service" region = "europe-north1" gcp_account_key = "./account_key.json" firebase_account_key_location = "/app/config/account_key.json"
Reden wir darüber? im Raum unser main.tf-Skript.
terraform { required_providers { google = { source = "hashicorp/google" version = ">= 4.0.0" } } required_version = ">= 0.12" } provider "google" { credentials = file(var.gcp_account_key) project = var.project_id region = var.region } # Get project information data "google_project" "project" { project_id = var.project_id } module "docker" { source = "./modules/docker" project_id = var.project_id } module "cloud_run" { source = "./modules/gcp" project_id = var.project_id region = var.region redis_url = var.redis_url client_url = var.client_url firebase_account_key_location = var.firebase_account_key_location cloudrun_image = "gcr.io/${var.project_id}/recipe-server:latest" depends_on = [ module.docker ] }
Zu Beginn definiere ich den PaaS-Anbieter, da ich GCP verwende. Google wird hinzugefügt. Sie können AWS, Azure oder andere Anbieter hinzufügen. Um Ihre Anfrage an einen Cloud-Anbieter zu genehmigen, sind Kreditinformationen unerlässlich. Den gcp_account_key übergeben Sie als JSON-Datei, die ich im übergeordneten Terraform-Verzeichnis habe.
Auf dem Screenshot oben können Sie sehen, dass ich einen Dienstkontoschlüssel in GCP erstellt und die richtigen IAM-Zugriffsrechte übergeben habe.
Es ist wichtig, der account_key.json die richtigen IAM-Zugriffsrechte (Identity and Access Management) zuzuweisen, da sonst beim Versuch, Terraform auszuführen, unterschiedliche Berechtigungsprobleme auftreten. Rollen Viewer, Editor, storage.admin, cloudrun.admin, Docker-Artefakte.
Es gibt auch eine Alternative, Rollen und Berechtigungen einfach über IaC zuzuweisen, aber für mich ist es eher umständlich, zumindest bis ich mich damit besser vertraut gemacht habe.
terraform/ ├── modules/ │ ├── docker/ │ │ ├── docker-artifact.tf │ │ └── variables.tf │ ├── gcp/ │ │ ├── cloud-run.tf │ │ └── variables.tf ├── main.tf ├── set-prod.env.sh ├── terraform.tfvars ├── variables.tf └── account_key.json
Oben ist dargestellt, wie es gemacht werden könnte.
Dann sind die nächsten Schritte die Ausführung Ihrer Module. Ich beginne mit Docker, um ein Docker-Artefakt in GCP zu erstellen, und nachdem das abgeschlossen ist, mache ich dasselbe mit Cloud Run. Denken Sie daran, dass ich mit „./modules/docker“ auf das Verzeichnis zugreife und die benötigten Variablen vom übergeordneten Modul an das untergeordnete Modul „modules/docker/variables.tf“ übergebe.
#!/bin/bash #server export TF_VAR_redis_url="redis_url" export TF_VAR_firebase_account_key="your_account_key.json" export TF_VAR_client_url="client_url" export TF_VAR_gcp_account_key="client_url" echo "Environment variables for Terraform GCP set."
Die docker-artifact.tf ist ziemlich kurz, da wir nur denken, dass wir die verwendeten Ressourcen definieren müssen, beginnend mit container_registry_api und zweitens docker_build_push die Bereitstellung für hinzufügen lokale Ausführung und beenden Sie es mit dem Erstellen und Bereitstellen des GRC-Docker-Images mit übergebener var.project_id. Fügen Sie hinzu, dass es je nach Bedarf von container_registry_api abhängt.
Zuletzt stellen wir es in unserem IaC bereit, indem wir unser letztes Modul mit „./modules/gcp“ ausführen
variable "project_id" { description = "The ID of the Google Cloud project." type = string } variable "project_name" { description = "The project name of the Google Cloud Run project." type = string } variable "region" { description = "The Google Cloud region." type = string } variable "redis_url" { description = "The URL for the Redis instance." type = string } variable "client_url" { description = "The URL for the client application." type = string } variable "gcp_account_key" { description = "Path to the Google Cloud service account key file." type = string } variable "firebase_account_key_location" { description = "Firebase account key location in Docker container." type = string }
Genau wie für das Docker-Modul definieren wir die erforderlichen Ressourcen für „google_cloud_run_service“. Wir wählen den Namen, die Region und die Projekt-ID aus und wählen dann das Image aus, das von main übergeben wurde.
Wenn Sie erforderliche Umgebungsvariablen haben, übergeben Sie diese ebenfalls.
Die IAM-Mitgliedsressource wird hinzugefügt, um die Berechtigung für die Bereitstellung in Cloud Run zu erteilen.
Sobald die Architektur festgelegt und fertig ist, führen wir die folgenden Schritte aus.
1.Terraform initialisieren
project_id = "recepies-6e7c0" project_name = "recipe-service" region = "europe-north1" gcp_account_key = "./account_key.json" firebase_account_key_location = "/app/config/account_key.json"
terraform { required_providers { google = { source = "hashicorp/google" version = ">= 4.0.0" } } required_version = ">= 0.12" } provider "google" { credentials = file(var.gcp_account_key) project = var.project_id region = var.region } # Get project information data "google_project" "project" { project_id = var.project_id } module "docker" { source = "./modules/docker" project_id = var.project_id } module "cloud_run" { source = "./modules/gcp" project_id = var.project_id region = var.region redis_url = var.redis_url client_url = var.client_url firebase_account_key_location = var.firebase_account_key_location cloudrun_image = "gcr.io/${var.project_id}/recipe-server:latest" depends_on = [ module.docker ] }
Damit Terraform auf die .env-Variablen zugreifen kann.
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="serviceAccount:YOUR_SERVICE_ACCOUNT_EMAIL" \ --role="roles/editor"
Wenn alles gut ist, werden Sie am Ende so etwas bekommen.
Wenn Sie GitHub verwenden, sollten Sie einige Dateien in .gitignore hinzufügen, da Terraform Artefakte und Backups usw. generiert.
resource "google_project_service" "container_registry_api" { project = var.project_id service = "containerregistry.googleapis.com" disable_on_destroy = false } resource "null_resource" "docker_build_push" { triggers = { always_run = timestamp() } provisioner "local-exec" { command = <<-EOT # Build the Docker image docker build -t gcr.io/${var.project_id}/recipe-server:latest . # Configure docker to authenticate with GCP gcloud auth configure-docker --quiet # Push the image docker push gcr.io/${var.project_id}/recipe-server:latest EOT } depends_on = [ google_project_service.container_registry_api ] }
Während IaC im Vergleich zur manuellen Einrichtung eine gewisse Komplexität mit sich bringt, bringt es wie bereits erwähnt auch mehr Wartbarkeit und Automatisierung mit sich, insbesondere bei der Interaktion zwischen mehreren Cloud-Anbietern usw. Auch für mich persönlich gibt es mir als Entwickler mehr Macht!
Repo finden Sie hier.
Das obige ist der detaillierte Inhalt vonStellen Sie Ihre GCP Cloud Run-App mühelos mit Terraform bereit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!