Open10
TerraformCloud+CloudRunJobの取り掛かりメモ

Terraform(初心)CloudRunJob(初心)で空のジョブを構成するまでを試したときのメモ(を一応残しておく)です。
ナイスな記事があったのでそちらを参考

Terraformクラウドのアカウント作成する。
- Terraform自体はクラウドを使わなくてもローカルで完結できる(ハズ?)
- その一方で、クラウドと連結することで機密情報をクラウド上においておける。
- メリット: ローカルで使用するためにチーム各員が管理する必要がない。
- デメリット: TerraformCloudに情報を諸々預けることになる。
- サインアップしたらまず「Provision example resources」を試す。
- https://developer.hashicorp.com/terraform/install
- CLIにでた案内とブラウザでのURLアクセスを行き来して、トークンを取得する。
-
.terraform.d/credentials.tfrc.json
にトークンが保存される。 -
tfc-getting-started.git
の一連は省略しても良さそう。- APIでOrganization/Workspaceを作成している様子。
- 次に「Create new organization」から進む。
- // いきなりChooseとか出るが...何が起こるのか戻せるのかわからないのが初心に響く。
- 「Version Control Workflow」
- 「CLI-Driven Workflow」
- とりあえずCLIから試すのでCLIを選ぶ。
- workspace名は
sample-cli
とした。本来はapp-dev
とかにするのが良さそう。- 追記: 後からWorkload Identityを使うならそっちで作られるので作る必要はなかった。
- workspace名は

Terraformから使用するサービスのアカウントまわりを用意する。
- GoogleCloudRun Services/Jobs
- 今回はCloudRun Jobsを構成して確認する。
- Terraformから使用するGoogleCloudのサービスアカウントを作成する。
- // GoogleCloudのサービスアカウントの説明はなんかすっと入らないが要はシステムから利用するときのアカウントを用意する。
- ロール: 「CloudRun デベロッパー」
- 追記: 後からWorkload Identityを使うならそっちで作られるので作る必要はなかった。
- ただ作られるSAはロールが「編集者」でひょっとすると広すぎるかもしれない。

Terraformでインフラ構成を記述する。
- 構成をTerraform ベストプラクティスを整理してみました。あたりにする。
-
terraform/environments/backend.tf
(仮なのでdevなど環境はない) terraform/modules/google/cloud_run_job/
-
- TerraformCloudを使うなら接続認証は環境変数GOOGLE_CREDENTIALSが自動的参照される。
- // ...手持ちのサンプルをみて探せど、tfに接続のための情報が書いてなくて路頭に迷っていたら自動参照だった。
- よって、Credentialを使う, Workload Identityを使うにしてもこの段階での考慮不要。
- CloudRun Jobsの設定
- 参考: https://tech.devopslead.jp/knowledge/gcp/cloud-run-jobs_terraform/
- memo:
backend.tf
にrequired_providers
としてGoogleを追加する。- 使うツールの宣言のようなイメージ。
- バージョンはこちら: https://registry.terraform.io/browse/providers
- memo:
privider.tf
にprovider(gcp
)の設定を追加する。- ツールで使う設定を記載するイメージ。
- regionはデフォルトを設定できる。

Terraformクラウドに必要な情報を登録する。
- Sensitive variablesはUI上で秘匿される。
- Workspace単位とOrganization単位の2つがある。
- どっちを使うかは、そもそもOrganization/Workspaceをどう作ったかによる。
- 個人規模で使っていて他サービスとつなげるようなものなら、Organizationで良さそう。
- (今回は何もしていない)

TerraformCloudとGoogleCloudをつなぐ
- TerraformCloudは環境変数GOOGLE_CREDENTIALSがあれば自動参照するので登録する。
- あるいは、Workload Identityを使う。
- こちらはTerraformに直接的にGoogleCloudの情報が渡らないので、TerraformCloudに
login
とapply
されなければ悪用されることはない。 - https://zenn.dev/google_cloud_jp/articles/e14caa5589f67e
- こちらはTerraformに直接的にGoogleCloudの情報が渡らないので、TerraformCloudに
- Workload Identiyを使う。
- 参考: https://zenn.dev/google_cloud_jp/articles/e14caa5589f67e
- tfc_workspace_nameを設定すれば、その名前でTerraformCloudにワークスペースが作成される。
- HashiCorpが提供しているサンプルがあるので使用する。
- GoogleCloud Resource Manager APIを有効にしないと403が返ってくる(
terraform plan
にて) - (いろいろmooduleに追加)
- 参考: https://zenn.dev/google_cloud_jp/articles/e14caa5589f67e

CLIからデプロイを実行して、ブラウザでCloudRunインスタンスが追加されているかを確認する。
- と思ったら
Error: Unreadable module directory
といわれる。 - WorkspaceのSetting GeneralのExecution ModeをRemoteからLocalにするといいらしい。
- とやってみたら、ローカルだけにWorkload Identityが使えない様子...

GitHubから自動で実行されるように準備する。
- 一度ブラウザからCloudRunインスタンスを消す。
- // そもそもローカル実行できなかったので省略
- GitHubにリポジトリを作成
- VersionControlからGitHub.comを選択
- ん?これ連携はリポジトリ単位ではないのかと思ったら進んだ先でリポジトリ選択が出てきた。
- ただこのためにプロダクトのコードリード権限を与えるのはちょっと抵抗感はある。
- プロダクトコードとは分けるとか。
- commit前に.gitignoreを作っておく。

トラブルシューティング
-
"error":"unauthorized_client","error_description":"The given credential is rejected by the attribute condition."
- ブラウザで、一度使用するサービス(Cloud Runのコンソール)を開く-API有効化-必要がある。
- 「APIとサービス」からでも可能
- Compute Engine APIほか
- 「APIとサービス」からでも可能
- IAMと管理-Workload Identity連携を確認(my-tfc-pool)
- ログをみると何もないが、続けて全体のエラーを見るとエラーがあった。
- "Exception calling IAM: There were concurrent policy changes. Please retry the whole read-modify-write with exponential backoff."
- リトライ => 失敗、関係なしか
- Security Token Service APIがエラーになっているのは観測できる。
- workload identityのエラーはない
- 良い情報を見つけた。
- https://handat.hatenablog.com/entry/terraform-cloud-gcp-oidc
-
プロバイダ作成時の属性条件と実行したTerraform Cloudの環境が一致していないときに表示されるエラー
- プロバイダ属性条件(GCP条件CEL)が現状と乖離していた。TerraformCloudのworkspace名を変更したためだろうorz
- ブラウザで、一度使用するサービス(Cloud Runのコンソール)を開く-API有効化-必要がある。

完了、後処理。
- サービスアカウントの権限を外す。
- 一度ブラウザからCloudRunインスタンスを消しておく。