使用Pulumi Azure Native的TagAtScope为已创建资源加标签报错如何解决
问题原因及解决方案
报错原因
- Azure中每个资源作用域(比如资源组、单独资源)的标签资源是全局唯一的,固定资源ID为
{作用域ID}/providers/Microsoft.Resources/tags/default,资源组创建完成时默认就会生成这个空的标签资源 - 直接实例化
TagAtScope时,Pulumi默认执行创建逻辑,检测到目标ID的资源已经存在就会抛出冲突错误 - 额外注意:在
Apply回调中创建资源属于不推荐写法,会导致pulumi preview阶段无法识别到这个标签资源,无法提前校验配置问题
解决方案
方案1:保留TagAtScope逻辑,修复冲突
如果必须后置给已创建的资源组加标签,可以调整代码如下,不需要嵌套在Apply回调中,同时添加自定义资源选项让Pulumi接管现有标签资源的更新:
// Create Resource Group var resourceGroup = new ResourceGroup("resourceGroup", new ResourceGroupArgs { ResourceGroupName = "demo-rg", Location = "japaneast" }); // Apply tags var appliedTags = new TagAtScope("demoTagAtScope", new TagAtScopeArgs { Scope = resourceGroup.Id, Properties = new TagsArgs() { Tags = { ["tagKey1"] = "value1", ["tagKey2"] = "value2" } } }, new CustomResourceOptions { // 指定导入ID,Pulumi会自动导入现有标签资源后执行更新,不会触发创建逻辑 ImportId = Output.Format($"{resourceGroup.Id}/providers/Microsoft.Resources/tags/default") });
首次执行成功后如果不需要保留导入配置,可以把CustomResourceOptions参数删掉。
方案2:直接在资源组定义中配置标签(最简便)
如果没有必须后置加标签的特殊需求,直接在资源组的初始化参数里配置Tags即可,不需要额外调用TagAtScope,不会出现资源冲突问题,也更符合Pulumi最佳实践:
var resourceGroup = new ResourceGroup("resourceGroup", new ResourceGroupArgs { ResourceGroupName = "demo-rg", Location = "japaneast", Tags = { ["tagKey1"] = "value1", ["tagKey2"] = "value2" } });
内容的提问来源于stack exchange,提问作者MD TAREQ HASSAN
相关产品推荐
相关产品推荐

