IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    从 Azure 部署生成本地 .NET 密钥

    Amy Peng发表于 2024-03-26 07:31:09
    love 0

     本文翻译于Frank Boucher的Generate Local .NET Secrets from Azure Deployments .

    通常,示例项目以一些“魔术字符串”开始,这些变量包含与部署或外部资源相关的 URL 和关键信息,我们必须更改这些信息才能使用示例。例如在 .NET 中,它可能如下所示: 

    string openAIEndpoint = "https://";
    string openAIDeploymentName = "my-ai-model";
    string openAiKey = "123456abcd789EFGH";
    // ...

    本文展示了如何从 Azure 部署自动生成 .NET 密钥以及您的 .NET 应用程序如何读取这些密钥。用户想要尝试使用您的示例时,将不必再编辑任何内容! 他们只需使用 azd up 进行部署,然后使用 dotnet run 来执行应用程序。 听起来很有趣? 下面就来实现一下。 

    整个项目的代码可以在 GitHub 上的 fboucher/hikerai 中找到。 

    准备工作 

    Bicep 是一种为要部署的 Azure 资源创建基础结构定义的语言。由于这些资源将包含端点或模型名称等信息,因此我们需要一种导出这些信息的方法,在 Bicep 中我们使用输出语法: 

    // some bicep deployment...
    
    output AZURE_OPENAI_ENDPOINT string = ai.outputs.AZURE_OPENAI_ENDPOINT
    output AZURE_OPENAI_GPT_NAME string = ai.outputs.AZURE_OPENAI_GPT_NAME
    output AZURE_OPENAI_KEY string = ai.outputs.AZURE_OPENAI_KEY

    使用 Azure Developer CLI (azd)命令 azd env get-values 返回键对值列表中的所有这些值。 PowerShell 或 Bash 脚本可以读取这些内容并使用命令 dotnet user-secrets set 创建新的 .NET secrets。 这里是脚本 postprovision.ps1。 

    function Set-DotnetUserSecrets {
        param ($path, $lines)
        Push-Location
        cd $path
        dotnet user-secrets init
        dotnet user-secrets clear
        foreach ($line in $lines) {
            $name, $value = $line -split '='
            $value = $value -replace '"', ''
            $name = $name -replace '__', ':'
            if ($value -ne '') {
                dotnet user-secrets set $name $value | Out-Null
            }
        }
        Pop-Location
    }
    
    $lines = (azd env get-values) -split "`n"
    Set-DotnetUserSecrets -path "." -lines $lines

    该脚本首先创建一个函数 Set-DotnetUserSecrets,它有两个参数。第一个参数 $path用于将脚本目录更改到该位置。这是确保在需要时创建密钥的关键步骤。第二个参数 $lines 包含所有保存键对值的子字符串(例如:VARIABLE_NAME=”variable_value”)。 该脚本循环遍历所有行以分隔名称和值,并为每行创建一个密钥dotnet user-secrets set $name $value。 

    在最后两行,脚本使用 azd env get-values 检索输出生成的环境变量,并将结果拆分为子字符串。它最终将调用之前声明的函数 Set-DotnetUserSecrets 并传递路径和行。 存储库中还提供了该脚本的 postprovision.sh 版本。 

    为了在部署后执行脚本,我们需要在 azure.yaml 文件中添加一个后配置钩子。 azure.yaml 是定义和描述项目中包含的应用程序和 Azure 资源类型的架构。 这是它的样子。 

    hooks:
      postprovision:
        windows:
          shell: pwsh
          run: ./infra/post-script/postprovision.ps1
          interactive: true
          continueOnError: true

    部署 

    使用 Azure CLI Developer CLI 命令 azd up 执行部署。 您可以使用 fboucher/hikerai 上提供的 HikerAI 代码。 克隆或下载存储库后,请确保位于根目录以部署解决方案。 

    请使用命令 dotnet user-secrets list测试是否已创建secrets。 

    result of the secrets-list command

    使用密钥 

    使用 NuGet 包 Microsoft.Extensions.Configuration,应用程序将能够读取用户密钥。 您现在可以更换这些神奇的字符串。 

    // == Retrieve the local secrets saved during the Azure deployment ==========
    using Microsoft.Extensions.Configuration;
    
    var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
    string openAIEndpoint = config["AZURE_OPENAI_ENDPOINT"];
    string openAIDeploymentName = config["AZURE_OPENAI_GPT_NAME"];
    string openAiKey = config["AZURE_OPENAI_KEY"]; 

    总结 

    本文分享了一些使用从 Azure 部署输出自动生成的用户密钥替换“魔术字符串”的技巧。您可以在您的解决方案中尝试使用它们,或者使用 HikerAI 文件夹中的 fboucher/hikerai提供的示例。 

    参考文献 

    • 所有代码来自示例 HikerAI fboucher/hikerai 
    • Azure Developer CLI 
    • 开发中的APP 密钥 

    The post 从 Azure 部署生成本地 .NET 密钥  appeared first on .NET中文官方博客.



沪ICP备19023445号-2号
友情链接