> 백엔드 개발 > Golang > Terraform을 사용하여 GCP Cloud Run 앱을 손쉽게 배포

Terraform을 사용하여 GCP Cloud Run 앱을 손쉽게 배포

Patricia Arquette
풀어 주다: 2024-11-02 20:44:03
원래의
1006명이 탐색했습니다.

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

Terraform은 IaC(Infrastructure as Code)처럼 높은 수준의 제어 유연성을 제공한다는 이유로 더욱 인기를 얻고 있습니다.

모듈을 지원하고 인프라 상태를 추적하며 프로젝트가 복잡하거나 멀티 클라우드 또는 하이브리드 환경인 경우 유용합니다.

전제 조건

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 공급자 구성을 포함합니다.
  • Variable.tf: 프로젝트에 대한 변수를 정의하는 방법을 설명하세요.
  • terraform.tfvars: * 환경에 맞는 변수 값을 설정하는 방법을 설명합니다.
  • set-prod.env.sh: TF_VAR 접두사 플래그를 사용하여 Terraform에 대한 환경 변수를 설정합니다.
  • 모듈: Docker 및 클라우드 실행 모듈을 자세히 설명하고 역할과 상호 작용 방식을 설명합니다.

IaC 스크립트

더 높은 수준의 가이드를 위해 상위 모듈에서 하위 모듈 스크립트를 선보일 예정입니다.
나에게 가장 편리한 방법은 Terraform이 인식하고 초기화된 변수를 사용하는 TF_VAR_ 접두사를 사용하여 쉘 스크립트를 생성하는 것입니다(나중에 해당).

#!/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
  ]
}
로그인 후 복사
로그인 후 복사

처음에는 GCP를 사용하면서 PaaS 공급자를 정의하고 Google이 추가되면 AWS, Azure 또는 기타 공급자를 추가할 수 있습니다. 상위 Terraform 디렉터리에 있는 json 파일로 전달하는 gcp_account_key를 클라우드 제공업체에 대한 요청을 승인하려면 자격 증명이 필수적입니다.

Effortlessly Deploy Your GCP Cloud Run App Using Terraform

위 스크린샷에서 GCP에서 서비스 계정 키를 생성하고 올바른 IAM 액세스 권한을 전달한 것을 볼 수 있습니다.

account_key.json에 올바른 IAM(ID 및 액세스 관리) 액세스 권한을 할당하는 것이 중요합니다. 그렇지 않으면 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
로그인 후 복사
로그인 후 복사

위에서는 이를 수행할 수 있는 방법을 보여줍니다.

다음 단계는 모듈을 실행하는 것입니다. GCP에서 Docker Artifact를 생성해야 하기 때문에 docker로 시작하고 완료 후에는 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에 대한 프로비저닝을 추가하는 것만 필요하다고 생각하기 때문입니다. 로컬 실행 후 전달된 grc docker 이미지 빌드 및 배포로 끝납니다. var.project_id 필요에 따라 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를 선택한 다음 기본에서 전달된 이미지를 선택합니다.
필요한 env 변수가 있는 경우 해당 변수도 전달합니다. 
Cloud Run에 배포 권한을 부여하기 위해 IAM 구성원 리소스가 추가되었습니다.

애플리케이션 배포

이제 아키텍처가 설정되고 완료되면 다음 단계를 수행합니다.

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. 셸 스크립트를 실행하거나 환경 변수를 수동으로 설정하세요.
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에 커밋하는 경우 Terraform이 아티팩트 및 백업 등을 생성하므로 .gitignore에 일부 파일을 추가하는 것이 좋습니다.

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는 수동 설정에 비해 약간의 복잡성을 추가하지만 앞서 언급한 대로 특히 여러 클라우드 제공자 간의 상호 작용에 대한 유지 관리 용이성과 자동화 측면에서 활용도도 추가합니다. 또한 개인적으로 개발자로서 나에게 더 많은 힘을 제공합니다! 
Repo는 여기서 찾을 수 있습니다.

위 내용은 Terraform을 사용하여 GCP Cloud Run 앱을 손쉽게 배포의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿