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.
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
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
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.
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.
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"
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.
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.
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 ] }
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!