You need to enable JavaScript to run this app. 使用经典Pulumi.Azure配置App Service访问Key Vault的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

使用经典Pulumi.Azure配置App Service访问Key Vault的实现方法

实现App Service系统托管标识与Key Vault授权的完整配置

核心实现逻辑

  • 首先为App Service开启系统分配托管标识,Pulumi会自动创建与App Service绑定的Azure AD服务主体,服务主体的对象ID会作为输出属性直接暴露在App Service资源对象上
  • 然后在Key Vault的访问策略中,直接引用App Service托管标识的对象ID、租户ID配置权限,全程不需要手动硬编码任何资源ID

修正后完整代码实现

1. 配置App Service的系统托管标识

在原App Service资源定义中,新增Identity配置块开启系统分配标识,完全等价于Azure门户中点击「On」开启托管标识的操作:

var appservice = new AppService(appserviceName, new AppServiceArgs
{
    Name = appserviceName,
    Location = _resourceGroup.Location,
    AppServicePlanId = _servicePlan.Id,
    ResourceGroupName = _resourceGroup.Name,
    // 开启系统分配托管标识
    Identity = new Pulumi.Azure.AppService.Inputs.AppServiceIdentityArgs
    {
        Type = "SystemAssigned"
    },
    SiteConfig = new Pulumi.Azure.AppService.Inputs.AppServiceSiteConfigArgs
    {
        DotnetFrameworkVersion = "v5.0",
        ScmType = "None",
    },
    Tags = { { "environment", "dev" } },
    Logs = new AppServiceLogsArgs
    {
        HttpLogs = new AppServiceLogsHttpLogsArgs
        {
            FileSystem = new AppServiceLogsHttpLogsFileSystemArgs { RetentionInDays = 14, RetentionInMb = 35 }
        }
    },
    AppSettings = appSettings
});

2. 为Key Vault新增App Service托管标识的访问策略

在原Key Vault的AccessPolicies集合中,追加基于App Service托管标识输出属性的策略条目:

var currentConfig = Output.Create(GetClientConfig.InvokeAsync());
var keyVault = new KeyVault(vaultname, new KeyVaultArgs
{
    Name = vaultname,
    Location = _resourceGroup.Location,
    ResourceGroupName = _resourceGroup.Name,
    TenantId = currentConfig.Apply(q => q.TenantId),
    SkuName = "standard",
    AccessPolicies =
    {
        // 保留原有用户自身的访问策略
        new Pulumi.Azure.KeyVault.Inputs.KeyVaultAccessPolicyArgs
        {
            TenantId = currentConfig.Apply(q => q.TenantId),
            ObjectId = currentConfig.Apply(q => q.ObjectId),
            KeyPermissions = {"get", "create", "list"},
            SecretPermissions = {"set","get","delete","purge","recover", "list"}
        },
        // 新增App Service托管标识的访问策略
        new Pulumi.Azure.KeyVault.Inputs.KeyVaultAccessPolicyArgs
        {
            // 读取托管标识所属租户ID
            TenantId = appservice.Identity.Apply(id => id.TenantId),
            // 读取托管标识的主体ID,即Key Vault授权需要的ObjectId
            ObjectId = appservice.Identity.Apply(id => id.PrincipalId),
            // 按最小权限原则配置密钥读取权限,可根据业务调整
            SecretPermissions = {"get", "list"}
        }
    }
});

注意事项

  • Pulumi会自动识别资源间的依赖关系,确保先完成App Service托管标识的创建、拿到有效的主体ID后,再应用Key Vault的访问策略,不存在空值引用问题
  • 原代码中Tags的键值environemnt为拼写错误,修正为environment避免后续标签检索异常
  • 权限配置可按需调整,若App Service需要读取Key Vault中的证书、密钥,可在策略中追加对应权限条目

内容的提问来源于stack exchange,提问作者Ole Albers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 09:54:03