技术咨询:如何在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角色(支持创建/更新机密)。
- 对Azure Resource Graph分配
怎么加角色?去对应资源的「访问控制(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
相关产品推荐
相关产品推荐

