terraform を使って Cloud Run を管理するまでのメモ。
前提
- terraform がインストールされている
- gcloud cli がインストールされてる
- GCPのプロジェクトを作成し、
gcloud projects list
を叩いたときに作成したプロジェクトが表示されている
① GCPの設定
基本的にコンソール画面を叩くのではなく、gcloud コマンドを使って操作していきます。
gcloud コマンドでプロジェクトをアクティブにする
まず初めにterraformで扱うプロジェクトをアクティブにしておきましょう。
gcloud config set project [PROJECT_ID]
実行できたらアクティブになっているか確認しましょう。下記コマンドを叩くと、現在設定されているデフォルトのGCPプロジェクトIDを返します。
gcloud config get-value project
terraform用のサービスアカウント(SA)を作る
terraform 用にGCPのサービスアカウントを作成します。下記コマンドを実行することでサービスアカウントが作成できます。
gcloud iam service-accounts create サービスアカウントの名前 \
--description="説明文(任意)" \
--display-name="表示名"
SAに対して権限を付与する
先ほど作成したサービスアカウントに対して権限を付与します。
gcloud projects add-iam-policy-binding プロジェクトID \
--member="serviceAccount:作成したサービスアカウントの名前@プロジェクトID.iam.gserviceaccount.com" \
--role="roles/editor"
SA のキーを取得する
作成したサービスアカウントのキー(jsonファイル)を取得します。
gcloud iam service-accounts keys create 任意のパス/key.json \
--iam-account 作成したサービスアカウントの名前@プロジェクトID.iam.gserviceaccount.com
② Docker イメージをプッシュ
Cloud Runでアプリケーションを実行する時に必要になるDockerイメージを、GCR(Google Container Registry)にプッシュしておきましょう。今回は最低限のGo言語のアプリとDockerfile を作成します。
# Goの公式イメージをベースにする
FROM golang:1.20 AS build-env
# 作業ディレクトリを設定
WORKDIR /app
# 必要なGoのモジュールをコピー
COPY go.mod .
COPY go.sum .
# 依存関係をダウンロード
RUN go mod download
# ソースコードをコピー
COPY . .
# バイナリをビルド
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
# ランタイムイメージのステージ
FROM gcr.io/distroless/base-debian10
# ビルドされたバイナリをコピー
COPY --from=build-env /app/main /app/main
# ポート8080を公開
EXPOSE 8080
# アプリケーションを実行
CMD ["/app/main"]
アプリケーションのコードは下記をご参照ください。
次に作成した Docker イメージをローカルでビルドします。Dockerfile が存在するディレクトリで実行してください。
docker build -t sample-app-001 .
イメージにタグを付けます。
docker tag sample-app-001 asia.gcr.io/sample-pro-395702/sample-app-001
イメージを GCR にプッシュします。
docker push asia.gcr.io/プロジェクトID/sample-app-001
イメージがプッシュされたか確認しておきましょう。下記コマンドを叩くとプッシュしたイメージが表示されるはずです。
gcloud container images list --repository=asia.gcr.io/プロジェクトID
③ terraform を使って扱うリソースを記述&デプロイ
ここまでできたらようやくインフラのコード化に取り掛かります。ディレクトリ構成は下記のようにしてます。
└── infrastructure-project
├── main.tf
└── variables.tf
まず variable.tf
に変数を定義します。今回はプロジェクトIDとリージョンを定義しておきます。
variable "project_id" {
description = "project id"
type = string
default = "プロジェクトID"
}
variable "default_region" {
description = "The default region for resources"
default = "asia-southeast1"
}
次に main.tf
にGCP用のgoogleプロバイダを設定します。ちなみにプロバイダとは特定のクラウドサービスやインフラストラクチャ技術を操作・管理するためのプラグインです。
provider "google" {
credentials = file("path/key.json") // 「SA のキーを取得する」で生成したkey.jsonまでのパスを指定
project = var.project_id // variable.tf を参照してる
region = var.default_region
}
ここまでできたら terraform init
を実行して初期化します。
terraform init
成功すると下記のようなログが出力されます。
Terraform has been successfully initialized!
次に Cloud Run のリソースの定義を記述します。main.tf
のプロバイダーの下に追記します。
resource "google_cloud_run_service" "sample-app-001" {
name = var.project_id
location = var.default_region
template {
spec {
containers {
image = "asia.gcr.io/${var.project_id}/sample-app-001"
}
}
}
traffic {
percent = 100
latest_revision = true
}
}
ちなみに asia.gcr.io/${var.project_id}/sample-app-001
は②で作成したDockerイメージを指定してください。
設定できたら terrafrom apply
を実行します。
terrafrom apply
Cloud Run へのデプロイが成功したらコンソール画面から作成できているか確認しましょう。
おしまい。