Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan Apl Cloud Run GCP Anda dengan Mudah Menggunakan Terraform

Gunakan Apl Cloud Run GCP Anda dengan Mudah Menggunakan Terraform

Patricia Arquette
Patricia Arquetteasal
2024-11-02 20:44:03899semak imbas

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

Terraform semakin popular atas sebab tertentu kerana ia memberikan fleksibiliti kawalan tahap tinggi sebagai IaC(Infrastruktur sebagai Kod) 

Menyokong modul, menjejaki keadaan infrastruktur anda dan membantu jika projek anda adalah persekitaran yang kompleks, berbilang awan atau hibrid.

Prasyarat

Untuk memulakan, pastikan anda mengikuti panduan ini untuk pemasangan Terraform jika anda belum berbuat demikian dan pastikan akaun GCP telah disediakan.

Anda sepatutnya mempunyai apl yang telah digunakan terlebih dahulu melalui cara lain seperti CLI untuk memahami proses penggunaan, konfigurasi garis dasar, peralihan tambahan dll.

Blog berkaitan dengan penggunaan manual yang saya tambahkan di bawah ??

https://blog.stackademic.com/how-to-deploy-a-go-service-to-gcp-cloud-run-694d01cab5b5

Struktur Projek

Untuk struktur projek saya, saya mempunyai fail dan struktur direktori ini.

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: Termasuk penyedia yang diperlukan dan konfigurasi penyedia Google.
  • variables.tf: Terangkan cara untuk mentakrifkan pembolehubah untuk projek anda.
  • terraform.tfvars: Terangkan cara menetapkan nilai pembolehubah khusus untuk * persekitaran anda.
  • set-prod.env.sh: Menetapkan pembolehubah persekitaran untuk terraform dengan bendera awalan TF_VAR.
  • Modul: Perincikan modul docker dan cloud-run, menerangkan peranan mereka dan cara mereka berinteraksi.

Skrip IaC

Saya akan mempamerkan skrip modul ibu bapa kepada anak untuk mendapatkan lebih banyak panduan pesanan yang lebih tinggi.
Kemungkinan besar anda akan mempunyai pembolehubah env yang paling mudah bagi saya ialah membuat skrip shell dengan awalan TF_VAR_ yang Terraform akan kenali dan gunakan yang dimulakan (tetapi untuk itu kemudian).

#!/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."

Pembolehubah yang saya ada juga ditetapkan dalam tahap modul tetapi ibu bapa biasanya akan mengandungi kesemuanya tetapi dalam tahap modul saya hanya melepasi yang betul.

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
}

Terdapat juga fail skrip lain yang saya buat yang TIDAK mengandungi nilai kunci peribadi atau rahsia yang boleh diubah suai dengan mudah dan berguna untuk nilai lalai iaitu terraform.tfvars anda

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"

Mari kita bincangkan ? dalam bilik skrip utama.tf kami.

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

Pada mulanya saya mentakrifkan penyedia PaaS kerana saya menggunakan GCP google ditambah anda boleh menambah AWS, Azure atau penyedia lain. Kredit penting adalah penting untuk meluluskan permintaan anda kepada mana-mana penyedia awan gcp_account_key yang anda berikan sebagai fail json yang saya ada dalam direktori terraform induk.

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

Pada tangkapan skrin di atas anda dapat melihat saya telah mencipta kunci akaun Perkhidmatan dalam GCP dan meluluskan hak akses IAM yang betul.

Adalah penting untuk memberikan hak akses IAM (Pengurusan Identiti dan Akses) yang betul kepada account_key.json kerana jika tidak, anda akan mempunyai isu kebenaran yang berbeza apabila cuba menjalankan Terraform. Pemerhati peranan, editor, storage.admin, cloudrun.admin, artifak Docker.

Terdapat alternatif juga untuk hanya menetapkan peranan dan kebenaran melalui IaC tetapi bagi saya ia lebih mudah sekurang-kurangnya sehingga saya lebih mengenalinya.

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

Di atas menggambarkan cara ia boleh dilakukan.

Kemudian langkah seterusnya sedang menjalankan modul anda, saya mulakan dengan docker kerana perlu mencipta Artifak Docker dalam GCP dan selepas itu selesai, saya melakukan perkara yang sama dengan Cloud Run. Perlu diingat saya mengakses dir dengan "./modules/docker" dan lulus pembolehubah yang diperlukan daripada modul induk kepada anak/docker/variables.tf.

#!/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."

docker-artifact.tf agak pendek kerana hanya fikir kita perlu mentakrifkan sumber yang digunakan bermula dengan container_registry_api dan kedua docker_build_push tambah peruntukan untuk pelaksanaan setempat dan akhirinya dengan membina dan menggunakan imej docker grc dengan diluluskan dalam var.project_id tambah bahawa ia bergantung pada container_registry_api seperti yang diperlukan.

Akhir sekali dalam IaC kami, kami menggunakan ia menjalankan modul terakhir kami dengan "./modules/gcp"

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
}

Sama seperti modul docker, kami mentakrifkan sumber yang diperlukan untuk "google_cloud_run_service" kami memilih nama, wilayah, project_id kemudian pilih imej yang dihantar dari utama.
Jika anda memerlukan pembolehubah env luluskannya juga. 
Sumber ahli IAM ditambahkan untuk memberi kebenaran untuk penempatan pada Cloud Run.

Meletakkan Aplikasi Anda

Sekarang apabila seni bina ditetapkan dan selesai, kami melakukan langkah berikut.

1. Mulakan Terraform

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. Jalankan Skrip Shell atau tetapkan pembolehubah env anda secara manual
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
  ]
}

Untuk terraform mengakses pembolehubah .env.

  1. Pratonton perubahan dalam terraform atau gunakannya secara langsung.
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
  --member="serviceAccount:YOUR_SERVICE_ACCOUNT_EMAIL" \
  --role="roles/editor"

Jika semuanya baik, anda akan mengalami perkara seperti ini.

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

Jika komited kepada GitHub, sila ambil perhatian untuk menambah beberapa fail dalam .gitignore kerana terraform menjana artifak dan sandaran dll.

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

Kesimpulan

Walaupun IaC menambah sedikit kerumitan berbanding dengan persediaan manual, ia juga menambahkan levarage seperti yang dinyatakan sebelum ini lebih kebolehselenggaraan dan automasi terutamanya dalam interaksi antara berbilang pembekal awan dan lain-lain. Juga bagi saya secara peribadi ia memberikan lebih kuasa kepada saya sebagai pembangun! 
Repo boleh anda temui di sini.

Atas ialah kandungan terperinci Gunakan Apl Cloud Run GCP Anda dengan Mudah Menggunakan Terraform. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn