You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术咨询:如何在Azure资源组下用Azure Function App运行az graph query并存储输出至存储/Key Vault

解决方案:在Azure Function App中运行az graph query并存储输出

我来分享一个亲测可行的完整方案,分步骤帮你搞定在指定资源组的Function App里运行Azure Graph查询,再把结果存到存储服务或Key Vault的需求:

一、先搞定权限配置(重中之重!)

别上来就写代码,先给Function App配置安全的身份权限——用系统分配托管标识,不用存任何密钥,Azure会自动帮你处理身份验证:

  • 先在Function App的「身份」选项卡启用系统托管标识;
  • 给这个标识分配对应权限(按需选择):
    • 对Azure Resource Graph分配Reader角色(足够执行查询操作);
    • 如果要存到Blob存储:给目标存储账户分配Storage Blob Data Contributor角色;
    • 如果要存到Key Vault:给目标Key Vault分配Key Vault Secrets Officer角色(支持创建/更新机密)。

怎么加角色?去对应资源的「访问控制(IAM)」→「添加角色分配」,搜索你的Function App名称(托管标识的名字和Function App同名),选好角色保存即可。

二、创建Function并编写代码(以PowerShell为例)

我选PowerShell触发器(定时/HTTP触发都可以,这里用定时触发器举例),因为运行az命令最方便,而且默认Function App环境已经预装了Azure CLI。

1. 编写Function代码

直接把下面的代码粘进去,替换掉占位符就行:

using namespace System.Net

param($Timer)

# 记录当前时间,用来给结果文件命名
$currentTime = (Get-Date).ToUniversalTime().ToString('yyyyMMddHHmmss')

# 运行Azure Graph查询,替换成你的目标资源组名称
$graphQuery = "resources where resourceGroup == 'your-target-resource-group' | project name, type, location"
$queryResult = az graph query -q $graphQuery | ConvertFrom-Json

# 把查询结果转成格式化的JSON字符串
$outputContent = $queryResult.data | ConvertTo-Json -Depth 10

# --- 选项1:把结果存到Azure Blob存储 ---
$storageAccount = "your-storage-account-name"
$containerName = "query-results-container"
$blobName = "graph-result-$currentTime.json"

# 用托管标识自动登录Azure CLI(无需密码)
az login --identity
# 上传结果到Blob
az storage blob upload --account-name $storageAccount --container-name $containerName --name $blobName --content-type "application/json" --file <(echo $outputContent)

# --- 选项2:把结果存到Azure Key Vault机密 ---
# 注意:Key Vault机密最大只能存25KB,结果过大的话不建议用这个方式!
$keyVaultName = "your-key-vault-name"
$secretName = "graph-query-latest-result"
# 创建/更新机密
az keyvault secret set --vault-name $keyVaultName --name $secretName --value $outputContent

# 输出日志方便调试
Write-Host "Graph query executed successfully. Result saved to Blob: $blobName / Key Vault Secret: $secretName"

2. 关键替换点

  • your-target-resource-group:换成你要查询的目标资源组名称;
  • your-storage-account-name、query-results-container:换成你的存储账户和容器名称;
  • your-key-vault-name、graph-query-latest-result:换成你的Key Vault名称和自定义机密名称。

三、更高效的替代方案:用Azure SDK(无需调用CLI)

如果你追求更好的性能和稳定性,也可以直接用Azure PowerShell模块,不用依赖az命令,代码更简洁:

using namespace System.Net

param($Timer)

# 导入必要的模块
Import-Module Az.ResourceGraph, Az.Storage, Az.KeyVault

# 运行Graph查询
$query = "resources where resourceGroup == 'your-target-resource-group' | project name, type, location"
$result = Invoke-AzGraph -Query $query
$outputJson = $result.Data | ConvertTo-Json -Depth 10

# 存到Blob存储
$storageContext = (Get-AzStorageAccount -ResourceGroupName "your-rg" -Name "your-storage-account").Context
Set-AzStorageBlobContent -Context $storageContext -Container "query-results-container" -Blob "graph-result.json" -Value $outputJson -Force

# 存到Key Vault机密
Set-AzKeyVaultSecret -VaultName "your-key-vault-name" -Name "graph-query-result" -SecretValue (ConvertTo-SecureString $outputJson -AsPlainText -Force)

这个方式直接调用原生Azure模块,在Function App环境中运行更稳定,避免了CLI调用的额外开销。

四、调试和验证

  • 写完代码后,在Function App的「监测」→「日志」里查看执行情况,排查是否有报错;
  • 去存储账户的容器里检查Blob是否生成,或者去Key Vault的「机密」列表里查看目标机密是否更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:29:05