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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:22