在GCP中创建IAM成员会引发错误策略大小过大

问题描述

当我尝试在GCP中创建新的IAM用户时,出现以下错误

Request "Create IAM Members roles/dns.admin serviceAccount:[email protected] 
for \"project \\\"projectId\\\"\"" returned error:
 Error applying IAM policy for project "projectId": Error setting IAM policy for project "projectId": googleapi: Error 400:
 The size of the policy is too large.
 Consider removing or merging some of the bindings or if using conditions remove 
any lengthy conditions.,badRequest
@H_502_5@

上面显示的是terraform apply命令的输出。当我尝试使用gcloud cli时,我也会得到类似的输出 当我尝试通过GCP控制台创建它时,它只会显示“后端错误

解决方法

您很可能达到了IAM的quotas之一。每次执行更新或创建时,都会上载您在Terraform中指定的所有绑定。如错误所述,您可能正在创建许多可以合并在一起的绑定。我建议尝试查找您要达到的配额限制以及原因,这是一些调试命令:

iam绑定数:

gcloud projects get-iam-policy $PROJECT_ID --format=json | jq '.bindings | length'

绑定的总大小:

gcloud projects get-iam-policy $PROJECT_ID --format=json | jq '.bindings' > iam.json
ls -l iam.json

所有绑定中每个成员的出现:

gcloud projects get-iam-policy $PROJECT_ID --format=json | jq ".bindings[].members" | jq -s flatten

然后,您可以通过合并减少绑定数。例如,此绑定:

{
  "bindings": [
    {
      "members": [
        "user:[email protected]"
      ],"role": "roles/owner"
    },{
      "members": [
        "user:[email protected]"
      ],"role": "roles/owner"
    }
  ],"etag": "BwUjMhCsNvY=","version": 1
}

可以合并到此:

{
  "bindings": [
    {
      "members": [
        "user:[email protected]","user:[email protected]"
      ],"version": 1
}