Azure Web应用内置PowerShell如何免传参遍历配置连接字符串
无需手动传参遍历Azure App Service连接字符串的通用实现
完全可以实现无硬编码参数的通用逻辑,所有运行所需的上下文信息、鉴权能力都由App Service运行时内置提供,代码可以直接在任意Azure App Service实例中运行,不需要针对不同环境修改参数。
核心原理
Azure App Service在启动应用时,会自动在运行环境中注入两类可直接复用的能力,不需要手动配置:
- 内置环境变量:自动注入当前实例所属的订阅ID、资源组名、站点名等上下文信息,对应调用REST API需要的三个路径参数
- 本地元数据服务:固定本地IP的元数据端点,开启系统分配托管标识后,可以直接拿到调用Azure管理REST API所需的访问令牌,不需要手动配置服务主体、密钥
关键内置信息对应关系
需要的三个参数全部可以从环境变量直接读取,不需要手动传入:
subscriptionId:对应环境变量WEBSITE_SUBSCRIPTION_IDresourceGroupName:对应环境变量WEBSITE_RESOURCE_GROUPname(应用名称):对应环境变量WEBSITE_SITE_NAME
前置准备
在应用的「标识」配置页开启系统分配托管标识即可,不需要给这个标识额外配置权限:默认情况下站点本身的托管标识就有读取自身站点配置的权限。
PowerShell 实现代码
# 1. 从内置环境变量读取REST API所需的路径参数 $subscriptionId = $env:WEBSITE_SUBSCRIPTION_ID $resourceGroup = $env:WEBSITE_RESOURCE_GROUP $siteName = $env:WEBSITE_SITE_NAME # 2. 从本地元数据服务获取管理API的访问令牌 $tokenResponse = Invoke-RestMethod -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2019-08-01&resource=https://management.azure.com/' -Headers @{Metadata = "true"} -Method Get $accessToken = $tokenResponse.access_token # 3. 拼接REST API地址,调用获取连接字符串列表 $apiUri = "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Web/sites/$siteName/config/connectionstrings/list?api-version=2022-03-01" $connStrings = Invoke-RestMethod -Uri $apiUri -Headers @{Authorization = "Bearer $accessToken"} -Method Post # 4. 遍历所有连接字符串 foreach ($conn in $connStrings.Properties.PSObject.Properties) { Write-Host "连接字符串名称:$($conn.Name)" Write-Host "连接字符串类型:$($conn.Value.type)" Write-Host "连接字符串值:$($conn.Value.value)`n" }
更简便的替代方案
如果不需要获取连接字符串的类型属性,只是要拿连接字符串的值,甚至不用调用REST API:所有配置在「Configuration -> Connection strings」下的条目,App Service都会自动注入成带前缀的环境变量,可以直接遍历环境变量拿到所有值,前缀规则如下:
- 常规SQL连接字符串:前缀
SQLCONNSTR_ - Azure SQL连接字符串:前缀
SQLAZURECONNSTR_ - MySQL连接字符串:前缀
MYSQLCONNSTR_ - PostgreSQL连接字符串:前缀
POSTGRESQLCONNSTR_ - 自定义类型连接字符串:前缀
CUSTOMCONNSTR_
注意:这种方式拿到的键名是去掉前缀后的名称,值和配置页一致,但无法直接获取配置页上选择的连接字符串类型字段。
内容的提问来源于stack exchange,提问作者NutsAndBolts
相关产品推荐
相关产品推荐

