Создание членов IAM в GCP выдает ошибку Слишком большой размер политики

#google-cloud-platform #google-iam #terraform-provider-gcp #google-cloud-iam

#google-cloud-platform #google-iam #terraform-provider-gcp #google-cloud-iam

Вопрос:

Когда я пытаюсь создать нового пользователя IAM в GCP, я получаю следующую ошибку

 Request "Create IAM Members roles/dns.admin serviceAccount:dns-mngt-sa-prod@pprojectId.iam.gserviceaccount.com 
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
  

Выше показан вывод команды terraform apply. Когда я пытаюсь использовать gcloud cli, я также получаю аналогичный результат
Когда я пытаюсь создать его через консоль GCP, он просто показывает «ошибку сервера»

Комментарии:

1. Не могли бы вы поделиться кодом terraform, в котором не указана конфиденциальная информация?

Ответ №1:

Скорее всего, вы попали в одну из квот IAM. Все привязки, указанные вами в 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:user-a@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "user:user-b@example.com"
      ],
      "role": "roles/owner"
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}
  

Может быть объединено с этим:

 {
  "bindings": [
    {
      "members": [
        "user:user-b@example.com",
        "user:user-a@example.com"
      ],
      "role": "roles/owner"
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}
  

Комментарии:

1. не так очевидно, как рассчитываются ограничения. У меня было 434 привязки в соответствии с командой. Однако после удаления 2 пользователей IAM из консоли это сработало

2. Я понимаю, но вы могли бы достичь одного из других ограничений. Например, во всех привязках может быть 1500 отображений участников. Таким образом, вы также можете подсчитать все элементы в привязках, чтобы узнать, достигли ли вы максимума. Скорее всего, удаление пользователей также удаляло их из привязок, тем самым временно «устраняя симптомы».