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

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

Nov 02, 2024 pm 08:44 PM

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1675
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
Golang vs. Python:性能和可伸缩性 Golang vs. Python:性能和可伸缩性 Apr 19, 2025 am 12:18 AM

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

Golang和C:并发与原始速度 Golang和C:并发与原始速度 Apr 21, 2025 am 12:16 AM

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

开始GO:初学者指南 开始GO:初学者指南 Apr 26, 2025 am 12:21 AM

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

Golang vs.C:性能和速度比较 Golang vs.C:性能和速度比较 Apr 21, 2025 am 12:13 AM

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

Golang vs. Python:主要差异和相似之处 Golang vs. Python:主要差异和相似之处 Apr 17, 2025 am 12:15 AM

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

Golang和C:性能的权衡 Golang和C:性能的权衡 Apr 17, 2025 am 12:18 AM

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

表演竞赛:Golang vs.C 表演竞赛:Golang vs.C Apr 16, 2025 am 12:07 AM

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

Golang vs. Python:利弊 Golang vs. Python:利弊 Apr 21, 2025 am 12:17 AM

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

See all articles