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
我将展示从父模块到子模块的脚本,以获得更多更高阶的指南。
最有可能你会有环境变量,对我来说最方便的方法是创建带有 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"
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 变量。
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中文网其他相关文章!