ASP.NET Core WebApp未安装Azure CLI,如何编程管理Azure容器?
不用Azure CLI,用C# WebJob管理Azure容器的几种方案
刚好我之前在Azure WebApp的WebJob里做过类似的容器管理操作,默认环境确实不带Azure CLI,整理了几个靠谱的编程方案给你:
1. 使用Azure .NET SDK(最推荐)
这是C#开发者最自然的选择,直接用官方SDK调用Azure服务,完全不需要依赖外部工具。
准备步骤:
- 先安装对应的NuGet包:
Install-Package Azure.ResourceManager.ContainerInstance Install-Package Azure.Identity - 给你的WebApp启用系统分配托管身份,然后在Azure门户给这个身份分配
Container Instance Contributor(或者更细粒度的权限),这样不用在代码里硬存密钥,安全性更高。
代码示例:
删除容器实例
using Azure.Identity; using Azure.ResourceManager.ContainerInstance; using Azure.ResourceManager.Resources; var subscriptionId = "你的订阅ID"; var resourceGroupName = "目标资源组名称"; var containerGroupName = "要删除的容器组名称"; // 用托管身份完成认证,无需手动输入密钥 var armClient = new ArmClient(new DefaultAzureCredential()); SubscriptionResource subscription = await armClient.GetSubscriptionResource(new ResourceIdentifier($"/subscriptions/{subscriptionId}")).GetAsync(); ResourceGroupResource resourceGroup = await subscription.GetResourceGroupAsync(resourceGroupName); // 获取目标容器组并执行删除 ContainerGroupResource containerGroup = await resourceGroup.GetContainerGroupAsync(containerGroupName); await containerGroup.DeleteAsync(WaitUntil.Completed);
启动已停止的容器实例
// 承接上面的armClient、resourceGroup对象 ContainerGroupResource containerGroup = await resourceGroup.GetContainerGroupAsync(containerGroupName); var startOperation = await containerGroup.StartAsync(); await startOperation.WaitForCompletionAsync();
2. 直接调用Azure REST API
如果不想引入SDK的依赖,可以用C#的HttpClient直接调用Azure的REST API,核心是通过托管身份获取有效的访问令牌。
代码示例:
获取Azure访问令牌(托管身份方式)
using System.Net.Http; using System.Net.Http.Headers; using System.Text.Json; async Task<string> GetAzureManagementToken() { var httpClient = new HttpClient(); var response = await httpClient.PostAsync( "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/", null); response.EnsureSuccessStatusCode(); var jsonContent = await response.Content.ReadAsStringAsync(); using var doc = JsonDocument.Parse(jsonContent); return doc.RootElement.GetProperty("access_token").GetString(); }
删除容器实例的API调用
var token = await GetAzureManagementToken(); var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); var deleteEndpoint = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContainerInstance/containerGroups/{containerGroupName}?api-version=2023-05-01"; var response = await httpClient.DeleteAsync(deleteEndpoint); response.EnsureSuccessStatusCode();
启动容器实例的API调用
var startEndpoint = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ContainerInstance/containerGroups/{containerGroupName}/start?api-version=2023-05-01"; var response = await httpClient.PostAsync(startEndpoint, null); response.EnsureSuccessStatusCode();
3. 临时安装Azure CLI(备选应急方案)
如果你的场景必须依赖CLI命令,也可以在WebJob的PowerShell脚本里临时安装Azure CLI,但这个方案每次运行都要安装,速度慢,还可能受WebApp沙箱限制,只推荐应急用:
PowerShell脚本片段(可在C#中调用执行)
# 下载Azure CLI安装包 Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi # 静默安装,无交互 Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet' # 将CLI路径加入环境变量 $env:Path += ";C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin" # 用托管身份登录Azure az login --identity # 执行容器操作命令 az container start --resource-group 你的资源组名称 --name 容器组名称 # az container delete --resource-group 你的资源组名称 --name 容器组名称 --yes
内容的提问来源于stack exchange,提问作者wpqs
相关产品推荐
相关产品推荐

