Open10

TerraformCloud+CloudRunJobの取り掛かりメモ

tatotato

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を使うならそっちで作られるので作る必要はなかった。
tatotato

Terraformから使用するサービスのアカウントまわりを用意する。

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

Terraformでインフラ構成を記述する。

tatotato

Terraformクラウドに必要な情報を登録する。

  • Sensitive variablesはUI上で秘匿される。
  • Workspace単位とOrganization単位の2つがある。
    • どっちを使うかは、そもそもOrganization/Workspaceをどう作ったかによる。
    • 個人規模で使っていて他サービスとつなげるようなものなら、Organizationで良さそう。
  • (今回は何もしていない)
tatotato

TerraformCloudとGoogleCloudをつなぐ

tatotato

CLIからデプロイを実行して、ブラウザでCloudRunインスタンスが追加されているかを確認する。

  • と思ったらError: Unreadable module directoryといわれる。
  • WorkspaceのSetting GeneralのExecution ModeをRemoteからLocalにするといいらしい。
  • とやってみたら、ローカルだけにWorkload Identityが使えない様子...
tatotato

GitHubから自動で実行されるように準備する。

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

トラブルシューティング

  • "error":"unauthorized_client","error_description":"The given credential is rejected by the attribute condition."
    • ブラウザで、一度使用するサービス(Cloud Runのコンソール)を開く-API有効化-必要がある。
      • 「APIとサービス」からでも可能
        • Compute Engine 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
tatotato

完了、後処理。

  • サービスアカウントの権限を外す。
  • 一度ブラウザからCloudRunインスタンスを消しておく。