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
より高次のガイドとして、親モジュールから子モジュールへのスクリプトを紹介します。
おそらく環境変数があると思いますが、私にとって最も便利な方法は、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 のプロビジョニングを追加することだけが必要であるため、非常に短いです。ローカルで実行し、渡された 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 を選択し、メインから渡されたイメージを選択します。
必要な環境変数がある場合は、それらも渡します。
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 変数にアクセスする場合。
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 サイトの他の関連記事を参照してください。