Heim  >  Artikel  >  Backend-Entwicklung  >  Stellen Sie Ihre GCP Cloud Run-App mühelos mit Terraform bereit

Stellen Sie Ihre GCP Cloud Run-App mühelos mit Terraform bereit

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 20:44:03899Durchsuche

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

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.

Voraussetzungen

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

Projektstruktur

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
  • main.tf: Einschließlich der erforderlichen Anbieter und der Google-Anbieterkonfiguration.
  • Variables.tf: Beschreiben Sie, wie Sie Variablen für Ihr Projekt definieren.
  • terraform.tfvars: Erklären Sie, wie Sie Variablenwerte speziell für Ihre * Umgebung festlegen.
  • set-prod.env.sh: Legt die Umgebungsvariablen für Terraform mit dem Präfix-Flag TF_VAR fest.
  • Module: Beschreiben Sie die Docker- und Cloud-Run-Module im Detail und erläutern Sie ihre Rollen und ihre Interaktion.

IaC-Skripte

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.

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

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.

Bereitstellen Ihrer Anwendung

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"
  1. Führen Sie das Shell-Skript aus oder legen Sie Ihre Umgebungsvariablen manuell fest
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.

  1. Sehen Sie sich eine Vorschau der Änderungen in Terraform an oder stellen Sie sie direkt bereit.
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.

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

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
  ]
}

Abschluss

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn