如何在IAM条件中检查Secret Manager资源的标签?
解决Secret Manager IAM条件中标签校验的问题
由于secretmanager.googleapis.com/Secret和secretmanager.googleapis.com/SecretVersion不支持通过resource.matchTag实现IAM标签校验,需要直接读取资源自身的现有标签(或注解)来实现同等功能,以下是正确的写法和说明:
针对Secret资源的IAM条件写法
直接通过resource.data.labels访问Secret的标签,比如要校验标签tag等于prod:
resource.data.labels.tag == "prod"
如果需要兼容标签不存在的场景,避免表达式报错,可以加上存在性检查:
has(resource.data.labels.tag) && resource.data.labels.tag == "prod"
针对SecretVersion资源的IAM条件写法
SecretVersion本身没有独立标签,标签存储在父Secret中,需要通过api.getAttribute获取父Secret的属性:
api.getAttribute('secretmanager.googleapis.com/Secret', resource.name.split('/versions/')[0]).labels.tag == "prod"
这里通过resource.name.split('/versions/')[0]提取父Secret的完整资源路径,再调用api.getAttribute获取其标签信息。
为什么之前的写法无效
resource.labels.tag:Secret Manager的IAM条件上下文里,resource对象的标签并非直接挂载在根节点,而是嵌套在data字段下,因此直接访问resource.labels会返回空值- 错误的
api.getAttribute调用:你之前的写法没有传入正确的父资源路径,或者路径层级错误,导致无法正确读取标签数据
内容的提问来源于stack exchange,提问作者pocesar
相关产品推荐
相关产品推荐

