首页 >后端开发 >Golang >使用 Terraform 轻松部署您的 GCP Cloud Run 应用

使用 Terraform 轻松部署您的 GCP Cloud Run 应用

Patricia Arquette
Patricia Arquette原创
2024-11-02 20:44:031000浏览

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

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 文件传递​​。

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

在上面的屏幕截图中,您可以看到我已在 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"
  1. 运行 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 变量。

  1. 预览 terraform 中的更改或直接部署它。
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
  --member="serviceAccount:YOUR_SERVICE_ACCOUNT_EMAIL" \
  --role="roles/editor"

如果一切顺利,你最终会得到这样的结果。

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

如果提交到 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn