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
더 높은 수준의 가이드를 위해 상위 모듈에서 하위 모듈 스크립트를 선보일 예정입니다.
나에게 가장 편리한 방법은 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를 클라우드 제공업체에 대한 요청을 승인하려면 자격 증명이 필수적입니다.
위 스크린샷에서 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"
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에 커밋하는 경우 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!