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

helmで行うcache設定。
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"

Workload Identityを使う。
cacheで利用するGCSに対して、KSAにバインドしたGSAに権限roles/storage.objectUserを付与する。
data "google_iam_policy" "main" {
binding {
role = "roles/storage.objectUser"
members = [
"serviceAccount:GOOGLE_CLOUD_SERVICE_ACCOUNT_EMAIL",
]
}
}

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

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

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

roles/iam.serviceAccountTokenCreator
を追加してもエラー。
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]",
]
}
}

GSAでエラーになっているのでKSA部分にGSAも追加してみる。
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",
]
}
}

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

ドキュメント