Description
Community Note
- Please vote on this issue by adding a 👍 reaction to the original issue to help the community and maintainers prioritize this request
- Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
- If you are interested in working on this issue or have submitted a pull request, please leave a comment. If the issue is assigned to the "modular-magician" user, it is either in the process of being autogenerated, or is planned to be autogenerated soon. If the issue is assigned to a user, that user is claiming responsibility for the issue. If the issue is assigned to "hashibot", a community member has claimed the issue already.
Description
I'm sure you know by now there is a decent amount of care required when using the *_iam_policy
and *_iam_binding
versions of IAM resources. There are a number of "be careful!" and "note" warnings in the resources that outline some of the potential pitfalls, but there are hidden dangers as well. For example, using the google_project_iam_policy
resource may inadvertently remove Google's service agents' (https://cloud.google.com/iam/docs/service-agents) IAM roles from the project. Or, the dangers of using google_storage_bucket_iam_policy
and google_storage_bucket_iam_binding
, which may remove the default IAM roles granted to projectViewers:
, projectEditors:
, and projectOwners:
of the containing project.
The largest issue I encounter with people running into the above situations is that the initial terraform plan
does not show that anything is being removed. While the documentation for google_project_iam_policy
notes that it's best to terraform import
the resource beforehand, this is in fact applicable to all *_iam_policy
and *_iam_binding
resources. Unfortunately this is tedious, potentially forgotten, and not something that you can abstract away in a Terraform module.
On the other hand, the more authoritative forms of IAM resources are beneficial for ensuring repeatability, discoverability, and security, so I prefer them over the simpler *_iam_member
resources.
I'd like to suggest that on creation the *_iam_policy
and *_iam_binding
resources act as strictly additive, similar to the *_iam_member
resources, but remain authoritative on update. Doing this will provide feedback in the next terraform plan
of IAM principles that may have accidentally been left out and would have potentially been removed.
If this is undesirable, an alternative may be to fail hard on an existing IAM policy or binding and requiring that the resource be imported, but I prefer the above suggestion.
Finally, I'd like to propose that the specific resource implementations be more opinionated in how they operate. Authoritative google_project_iam_*
resources could (optionally, of course) filter out https://cloud.google.com/iam/docs/service-agents from the diffs, as there is likely very little reason to manipulate their permissions. Similarly the authoritative google_storage_bucket_*
resources could, again optionally, preserve the bindings that are granted to projectViewers
, etc.
This may be a harder sell than the first suggestion, but I think anything that Google can do to reduce the burden on developers understanding the implicit IAM grants that their products get would be a huge benefit to many. I could potentially see Google exposing API endpoints of "expected bindings" or similar to remove the burden from the provider itself, but that is likely beyond the scope of this issue.
New or Affected Resource(s)
- google_project_iam_policy
- google_project_iam_binding
- google_storage_bucket_iam_policy
- google_storage_bucket_iam_binding
- ...
Potential Terraform Configuration
No changes, though this could be a new resource name or parameter.
References
Not exhaustive, and likely has some false postives: