Terraform を使用して GCP Cloud Run アプリを簡単にデプロイする
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 のクレジット情報が不可欠です。
上のスクリーンショットでは、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"
- シェル スクリプトを実行するか、環境変数を手動で設定します
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 変数にアクセスする場合。
- Terraform での変更をプレビューするか、直接デプロイします。
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 は手動セットアップに比べて若干の複雑さを加えますが、前に述べたように、特に複数のクラウド プロバイダー間のやり取りなどの保守性と自動化をさらに活用することができます。また、私個人にとっても、開発者としてより多くの力を与えてくれます。
ここでリポジトリを見つけることができます。
以上がTerraform を使用して GCP Cloud Run アプリを簡単にデプロイするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

Golangは迅速な発展と同時シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを実現し、埋め込みシステム開発に適しています。

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

GolangisidealforBuildingsCalables Systemsduetoitsefficiency andConcurrency、Whilepythonexcelsinquickscriptinganddataanalysisduetoitssimplicityand vastecosystem.golang'ssignencouragesclean、readisinediteNeditinesinedinediseNabletinedinedinedisedisedioncourase
