ホームページ >バックエンド開発 >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 (Infra Structure as Code) としての高いレベルの制御の柔軟性が備わっているためです。

モジュールをサポートし、インフラストラクチャの状態を追跡し、プロジェクトが複雑なマルチクラウドまたはハイブリッド環境の場合に役立ちます。

前提条件

まだ Terraform をインストールしていない場合は、まずこのガイドに従って 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 モジュールとクラウド実行モジュールの詳細を説明し、それらの役割と相互作用方法を説明します。

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 (Identity and Access Management) アクセス権を割り当てることが重要です。割り当てないと、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 アーティファクトを作成する必要があるため、docker から始めます。それが完了したら、Cloud Run で同じことを行います。 「./modules/docker」でディレクトリにアクセスし、必要な変数を親から子 modules/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 を選択し、メインから渡されたイメージを選択します。
必要な環境変数がある場合は、それらも渡します。 
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. シェル スクリプトを実行するか、環境変数を手動で設定します
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 は手動セットアップに比べて若干の複雑さを加えますが、前に述べたように、特に複数のクラウド プロバイダー間のやり取りなどの保守性と自動化をさらに活用することができます。また、私個人にとっても、開発者としてより多くの力を与えてくれます。 
ここでリポジトリを見つけることができます。

以上がTerraform を使用して GCP Cloud Run アプリを簡単にデプロイするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。