使用 Terraform 轻松部署您的 GCP Cloud Run 应用
Terraform 越来越受欢迎是有原因的,因为它提供了高水平的控制灵活性,如 IaC(基础设施即代码)
支持模块,跟踪基础设施的状态,如果您的项目是复杂的、多云或混合环境,那么它会很有帮助。
先决条件
首先,如果您尚未安装 Terraform,请务必遵循本指南进行操作,并且确保已设置 GCP 帐户。
您应该已经通过其他方式(例如 CLI)预先部署了应用程序,以了解部署过程、基线配置、增量过渡等。
我在下面添加了手动部署的相关博客??
https://blog.stackademic.com/how-to-deploy-a-go-service-to-gcp-cloud-run-694d01cab5b5
项目结构
对于我的项目结构,我有这些文件和目录结构。
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:包括所需的提供程序和 Google 提供程序配置。
- Variables.tf:描述如何为您的项目定义变量。
- terraform.tfvars:解释如何设置特定于您的环境的变量值。
- set-prod.env.sh:使用 TF_VAR 前缀标志设置 terraform 的环境变量。
- 模块:详细介绍 docker 和 cloud-run 模块,解释它们的角色以及它们如何交互。
IaC 脚本
我将展示从父模块到子模块的脚本,以获得更多更高阶的指南。
最有可能你会有环境变量,对我来说最方便的方法是创建带有 TF_VAR_ 前缀的 shell 脚本,Terraform 将识别并使用初始化的变量(但稍后会提到)。
#!/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."
我也在模块级别设置的变量,但父级通常会包含所有这些变量,但在模块级别我只是传递了正确的变量。
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 }
我创建的其他脚本文件不包含可以轻松修改的私钥或秘密密钥值,并且对于您的 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"
我们来谈谈?在房间里我们的 main.tf 脚本。
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 ] }
一开始,我定义了 PaaS 提供商,因为我使用 GCP 谷歌,您可以添加 AWS、Azure 或其他提供商。信用对于批准您向任何云提供商的请求至关重要,您将 gcp_account_key 作为我在父 terraform 目录中的 json 文件传递。
在上面的屏幕截图中,您可以看到我已在 GCP 中创建了一个服务帐户密钥并传递了正确的 IAM 访问权限。
为 account_key.json 分配正确的 IAM(身份和访问管理)访问权限至关重要,否则在尝试运行 Terraform 时将会遇到不同的权限问题。角色查看器、编辑器、storage.admin、cloudrun.admin、Docker 工件。
还有一种选择,可以通过 IaC 分配角色和权限,但对我来说,至少在我更加熟悉它之前,这比较麻烦。
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
上面说明了如何做到这一点。
接下来的步骤是运行您的模块,我从 docker 开始,因为需要在 GCP 中创建 Docker Artifact,完成后我使用 Cloud Run 执行相同的操作。请记住,我使用“./modules/docker”访问目录,并将所需的变量从父模块传递到子模块/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 非常短,因为我们只需要定义从 container_registry_api 开始使用的资源,然后 docker_build_push 添加配置本地执行并通过传入 var.project_id 构建和部署 grc docker 镜像来结束它,并添加它依赖于 container_registry_api 作为其需要。
最后在我们的 IaC 中,我们使用“./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 }
与 docker 模块相同,我们定义“google_cloud_run_service”所需的资源,我们选择名称、区域、project_id,然后选择从 main 传递的映像。
如果您需要环境变量,也可以传递它们。
添加 IAM 成员资源以授予部署到 Cloud Run 的权限。
部署您的应用程序
现在,当架构设置并完成后,我们将执行以下步骤。
1.初始化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"
- 运行 Shell 脚本或手动设置环境变量
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 ] }
让 terraform 访问 .env 变量。
- 预览 terraform 中的更改或直接部署它。
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="serviceAccount:YOUR_SERVICE_ACCOUNT_EMAIL" \ --role="roles/editor"
如果一切顺利,你最终会得到这样的结果。
如果提交到 GitHub,请注意在 .gitignore 中添加一些文件,因为 terraform 会生成工件和备份等。
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 ] }
结论
虽然与手动设置相比,IaC 增加了一些复杂性,但它也增加了前面提到的更多可维护性和自动化程度,特别是多个云提供商之间的交互等。对于我个人来说,它为我作为开发人员提供了更多权力!
您可以在这里找到回购协议。
以上是使用 Terraform 轻松部署您的 GCP Cloud Run 应用的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang适合快速开发和并发场景,C 适用于需要极致性能和低级控制的场景。1)Golang通过垃圾回收和并发机制提升性能,适合高并发Web服务开发。2)C 通过手动内存管理和编译器优化达到极致性能,适用于嵌入式系统开发。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t
