Closed9

helmでGKEにdeployしたGitLab RunnerのCacheをGCSで実現したい

ei-showei-show

helmで行うcache設定。

value.yml
runners:
  config: |
    [[runners]]
      [runners.kubernetes]
        namespace = "{{.Release.Namespace}}"
        image = "alpine"
      [runners.cache]
        Type = "gcs"
        Path = "{{.Release.Name}}"
        Shared = true
        [runners.cache.gcs]
          BucketName = "BUCKET_NAME"
ei-showei-show

Workload Identityを使う。
cacheで利用するGCSに対して、KSAにバインドしたGSAに権限roles/storage.objectUserを付与する。

main.tf
data "google_iam_policy" "main" {
  binding {
    role = "roles/storage.objectUser"
    members = [
      "serviceAccount:GOOGLE_CLOUD_SERVICE_ACCOUNT_EMAIL",
    ]
  }
}
ei-showei-show

.gitlab-ci.ymlでcacheを設定するも失敗している。

ei-showei-show

Clould Loggingで確認すると次のエラーが出ている。

ei-showei-show

署名付きURLと聞くと、必要な権限が足りない気がしているのでroles/iam.serviceAccountTokenCreatorを追加する。

このエラーは、GitLab Runnerヘルパーが無効なURLを受信するか、リモートキャッシュにアクセスするための事前署名付きURLがない場合に発生します。config.tomlのキャッシュ関連のエントリと、プロバイダー固有のキーと値を確認します。URL構文の要件に従っていないアイテムから無効なURLが作成される可能性があります。

https://gitlab.com/gitlab-org/gitlab-runner/-/blob/main/docs-locale/ja-jp/faq/_index.md#no-url-provided-cache-will-not-be-downloaduploaded

ei-showei-show

roles/iam.serviceAccountTokenCreatorを追加してもエラー。

main.tf
data "google_iam_policy" "main" {
  binding {
    role = "roles/iam.workloadIdentityUser"
    members = [
      "serviceAccount:${data.google_client_config.default.project}.svc.id.goog[NAMESPACE/KUBERNETES_SERVICE_ACCOUNT]",
    ]
  }
  binding {
    role = "roles/iam.serviceAccountTokenCreator"
    members = [
      "serviceAccount:${data.google_client_config.default.project}.svc.id.goog[NAMESPACE/KUBERNETES_SERVICE_ACCOUNT]",
    ]
  }
}
ei-showei-show

GSAでエラーになっているのでKSA部分にGSAも追加してみる。

maintf
data "google_iam_policy" "main" {
  binding {
    role = "roles/iam.workloadIdentityUser"
    members = [
      "serviceAccount:${data.google_client_config.default.project}.svc.id.goog[NAMESPACE/KUBERNETES_SERVICE_ACCOUNT]",
    ]
  }
  binding {
    role = "roles/iam.serviceAccountTokenCreator"
    members = [
      "serviceAccount:${data.google_client_config.default.project}.svc.id.goog[NAMESPACE/KUBERNETES_SERVICE_ACCOUNT]",
      "serviceAccount:GOOGLE_CLOUD_SERVICE_ACCOUNT_EMAIL",
    ]
  }
}
ei-showei-show

cacheされました。

Restoring cache
Checking cache for 4689-protected...
WARNING: file does not exist
Failed to extract cache

Saving cache for successful job
Creating cache 4689-protected...
.terraform/: found 873 matching artifact files and directories
Uploading cache.zip to https://storage.googleapis.com/BUCKET_NAME/PATH
Created cache

このスクラップは4ヶ月前にクローズされました