【问题标题】:Validate that resource exists before retrieving keys在检索密钥之前验证资源是否存在
【发布时间】:2021-06-03 04:43:19
【问题描述】:

我创建了一个资源组和一个数据库帐户:

// Create resourceGroup:
var rg= new ResourceGroup("myRG",
            new ResourceGroupArgs
            {
                Name = "myRG",
                Location = "westeurope"
            });
// Create DBAccount:
var account = new DatabaseAccount(accountName, new Pulumi.AzureNextGen.DocumentDB.Latest.DatabaseAccountArgs
            {
                AccountName = "myAcc",
                DatabaseAccountOfferType = DatabaseAccountOfferType.Standard,
                Location = "WestEurope",
                ResourceGroupName = rg.GetResourceName()
            });

完成此操作后,我想检索主键:

var keys = ListDatabaseAccountKeys.InvokeAsync(new ListDatabaseAccountKeysArgs
{
  AccountName = account.GetResourceName(),
  ResourceGroupName = rg.GetResourceName()
});
var cosmosWriteKey = Output.Create(keys).Apply(q => q.PrimaryMasterKey);

在没有任何资源组且“pulumi up”的空白订阅上首次启动时,我收到一个错误

服务返回错误。 Status=404 Code="ResourceGroupNotFound" Message="找不到资源组'myRG'。

我目前通过设置环境变量在第一次运行时禁用“Key”-Part 并在创建 ResourceGroup 后再次运行代码来解决此问题。但也许有更聪明的方法来确保在检索密钥之前创建资源组?

【问题讨论】:

    标签: c# azure pulumi


    【解决方案1】:

    您应该通过在其构造函数中使用rg.Name 将帐户链接到资源组,并将您的ListDatabaseAccountKeys 调用放在Apply 中:

    var account = new DatabaseAccount(accountName, new DatabaseAccountArgs
    {
        AccountName = "myAcc",
        DatabaseAccountOfferType = DatabaseAccountOfferType.Standard,
        Location = "WestEurope",
        ResourceGroupName = rg.Name
    });
    
    var cosmosWriteKey = account.Name.Apply(async name =>
    {
        var keys = await ListDatabaseAccountKeys.InvokeAsync(new ListDatabaseAccountKeysArgs
        {
            AccountName = name,
            ResourceGroupName = "myRG"
        });
        return keys.PrimaryMasterKey;
    });
    

    这样,只有在创建帐户并且解析了Name 输出后才会调用。

    如果你迁移到Azure-Native,你可以使用自动命名:

    var rg = new ResourceGroup("myRG");
    
    var account = new DatabaseAccount(accountName, new DatabaseAccountArgs
    {
        DatabaseAccountOfferType = DatabaseAccountOfferType.Standard,
        ResourceGroupName = rg.Name
    });
    
    var cosmosWriteKey = Output.Tuple(rg.Name, account.Name).Apply(async values =>
    {
        var keys = await ListDatabaseAccountKeys.InvokeAsync(new ListDatabaseAccountKeysArgs
        {
            ResourceGroupName = values[0],
            AccountName = values[1]
        });
        return keys.PrimaryMasterKey;
    });
    

    【讨论】:

    • 我可能过于简化了我的示例,抱歉。我已经使用 GetResourceName() 来检索真实示例中的名称。更新了我的问题
    • 这不会改变任何事情。您不应该为此使用GetResourceName():它检索逻辑名称并且不等待资源创建。
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多