Azure 部署教學:.NET 應用程式部署實戰【2025 完整指南】

Azure 部署教學:.NET 應用程式部署實戰

「公司用 Microsoft 全家桶,老闆說要把系統搬上 Azure,但我完全不知道從哪開始...」

如果你的工作環境是 Windows + Visual Studio + .NET,那 Azure 絕對是最順手的雲端選擇。Azure 與 Microsoft 生態系的整合度無人能比,從開發到部署幾乎是無縫接軌。

這篇文章會帶你認識 Azure 的主要部署服務,並實際動手完成 App Service 和 Azure Functions 的部署,最後還會介紹如何用 Azure DevOps 實現自動化部署。


Azure 部署服務介紹

Azure 的服務多到眼花撩亂,但對於應用程式部署,主要關注這三個就夠了。

Azure App Service

App Service 是 Azure 最經典的 PaaS 服務,專門用來部署 Web 應用程式。

主要特色:
- 多語言支援:.NET、Node.js、Python、Java、PHP、Ruby
- 自動擴展:根據流量自動增減實例
- 整合 GitHub/Azure DevOps:推送程式碼就自動部署
- 內建 SSL:免費的 HTTPS 憑證
- 部署位置(Slots):支援 staging 環境,零停機部署

App Service 最適合傳統的 Web 應用程式,尤其是 ASP.NET Core 專案。

Azure Functions

Azure Functions 是 Azure 的 Serverless 運算服務,類似 AWS Lambda 或 GCP Cloud Functions。

主要特色:
- 事件驅動:HTTP、定時器、佇列、Blob 觸發
- 按執行計費:沒執行就不收錢
- 快速開發:專注在商業邏輯,不管基礎設施
- 與 Azure 服務整合:輕鬆連接 Cosmos DB、Service Bus 等

適合場景:API 端點、Webhook、排程任務、事件處理。

Azure Container Apps

Container Apps 是 Azure 較新的容器化 Serverless 服務,定位類似 GCP Cloud Run。

主要特色:
- 容器優先:支援任何可以打包成 Docker 的應用
- 自動擴展到零:沒流量就不收錢
- 內建服務網格:微服務架構的好選擇
- Dapr 整合:簡化分散式應用開發

如果你已經熟悉 Docker 和 Kubernetes 概念,Container Apps 會是個好選擇。

Azure 部署服務總覽圖:App Service、Functions、Container Apps 三種服務的定位與適用情境

服務選擇建議

你的情況 推薦服務
傳統 ASP.NET / Node.js Web App App Service
單一 API 端點或 Webhook Azure Functions
已有 Docker 容器 Container Apps
需要完整 VM 控制 Virtual Machines
微服務架構 Container Apps 或 AKS

對於大多數 .NET 開發者,App Service 是最佳起點,因為與 Visual Studio 的整合最完善。

想了解更多部署基礎知識,可以參考 程式部署完整指南


實戰:App Service 部署 .NET 應用

接下來我們實際動手,把一個 ASP.NET Core Web API 部署到 App Service。

建立 App Service 資源

方法一:透過 Azure Portal(網頁介面)

  1. 登入 Azure Portal
  2. 點選「建立資源」→ 搜尋「App Service」
  3. 填寫基本設定:
設定項目 建議值
訂閱 你的訂閱
資源群組 建立新的,例如 rg-myapp-prod
名稱 myapp-api(會成為 myapp-api.azurewebsites.net)
發佈 程式碼
執行階段堆疊 .NET 8 (LTS)
作業系統 Linux(較便宜)或 Windows
區域 East Asia 或離用戶最近的區域
方案 Free F1(測試用)或 Basic B1(正式環境)
  1. 點選「檢閱 + 建立」→「建立」

Azure Portal 建立 App Service 的設定畫面

方法二:透過 Azure CLI

# 登入 Azure
az login

# 建立資源群組
az group create --name rg-myapp-prod --location eastasia

# 建立 App Service 方案
az appservice plan create \
  --name plan-myapp \
  --resource-group rg-myapp-prod \
  --sku B1 \
  --is-linux

# 建立 Web App
az webapp create \
  --name myapp-api \
  --resource-group rg-myapp-prod \
  --plan plan-myapp \
  --runtime "DOTNET|8.0"

設定部署來源(GitHub)

App Service 支援多種部署方式,最方便的是直接連結 GitHub:

  1. 在 App Service 頁面,點選「部署中心」
  2. 來源選擇「GitHub」
  3. 授權 Azure 存取你的 GitHub 帳號
  4. 選擇 Repository 和 Branch
  5. 建置提供者選擇「GitHub Actions」
  6. 儲存設定

App Service 部署流程圖:從 GitHub 到自動部署的完整流程

設定完成後,Azure 會自動在你的 Repository 建立 .github/workflows/ 目錄,裡面有 GitHub Actions 的設定檔。之後每次 push 到該 branch,就會自動觸發部署。

手動部署(使用 CLI)

如果不想連結 GitHub,也可以手動部署:

# 在專案目錄執行
dotnet publish -c Release -o ./publish

# 壓縮並部署
cd publish
zip -r ../deploy.zip .
cd ..

az webapp deployment source config-zip \
  --resource-group rg-myapp-prod \
  --name myapp-api \
  --src deploy.zip

環境變數與連線字串

不要把機密資訊寫死在程式碼裡!App Service 提供安全的方式管理設定。

設定應用程式設定(環境變數)

az webapp config appsettings set \
  --resource-group rg-myapp-prod \
  --name myapp-api \
  --settings API_KEY=your-api-key ENVIRONMENT=Production

在 .NET 程式碼中讀取:

var apiKey = Environment.GetEnvironmentVariable("API_KEY");
// 或使用 IConfiguration
var apiKey = configuration["API_KEY"];

設定連線字串(資料庫)

az webapp config connection-string set \
  --resource-group rg-myapp-prod \
  --name myapp-api \
  --connection-string-type SQLAzure \
  --settings DefaultConnection="Server=..."

在 .NET 中使用:

var connectionString = configuration.GetConnectionString("DefaultConnection");

連線字串會自動對應到 ConnectionStrings:DefaultConnection

自訂網域與 SSL

預設網址是 myapp-api.azurewebsites.net,如果要用自己的網域:

  1. 在 App Service 點選「自訂網域」
  2. 點選「新增自訂網域」
  3. 輸入你的網域,例如 api.yourdomain.com
  4. 依照指示在 DNS 新增 CNAME 或 A 記錄
  5. 驗證網域所有權

免費 SSL 憑證

App Service 提供免費的受控憑證:

  1. 點選「TLS/SSL 設定」
  2. 點選「私密金鑰憑證」→「建立 App Service 受控憑證」
  3. 選擇你的自訂網域
  4. 回到「繫結」頁面,為網域新增 SSL 繫結

整個過程不用自己處理憑證申請和更新,Azure 全自動處理。

💡 App Service 設定遇到問題? Azure 的設定選項確實很多,第一次用難免卡關。如果你在部署過程中遇到困難,讓 VibeFix 幫你處理,我們有豐富的 Azure 部署經驗。


實戰:Azure Functions 部署

如果你只需要幾個 API 端點,Azure Functions 會比 App Service 更輕量。

建立 Function App

透過 Azure Portal

  1. 建立資源 → 搜尋「Function App」
  2. 填寫設定:
設定項目 建議值
函數應用程式名稱 myapp-functions
執行階段堆疊 .NET 8 Isolated
區域 East Asia
作業系統 Linux
方案類型 取用(Serverless)
  1. 建立並等待部署完成

透過 Azure CLI

# 建立儲存體帳戶(Functions 需要)
az storage account create \
  --name myappfuncstorage \
  --resource-group rg-myapp-prod \
  --location eastasia \
  --sku Standard_LRS

# 建立 Function App
az functionapp create \
  --name myapp-functions \
  --resource-group rg-myapp-prod \
  --storage-account myappfuncstorage \
  --consumption-plan-location eastasia \
  --runtime dotnet-isolated \
  --runtime-version 8 \
  --os-type Linux

本機開發與測試

Azure Functions 有很棒的本機開發體驗。

安裝 Azure Functions Core Tools

# macOS
brew tap azure/functions
brew install azure-functions-core-tools@4

# Windows
npm install -g azure-functions-core-tools@4

# 或使用 Chocolatey
choco install azure-functions-core-tools-4

建立新專案

# 建立新的 Functions 專案
func init MyFunctionsApp --dotnet-isolated

cd MyFunctionsApp

# 新增一個 HTTP 觸發的 Function
func new --name HelloWorld --template "HTTP trigger"

程式碼範例

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using System.Net;

public class HelloWorld
{
    private readonly ILogger _logger;

    public HelloWorld(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<HelloWorld>();
    }

    [Function("HelloWorld")]
    public HttpResponseData Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]
        HttpRequestData req)
    {
        _logger.LogInformation("C# HTTP trigger function processed a request.");

        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/json");
        response.WriteString("{\"message\": \"Hello from Azure Functions!\"}");

        return response;
    }
}

本機執行測試

func start

Azure Functions 本機開發環境:VS Code 與 Azure Functions Core Tools

瀏覽器打開 http://localhost:7071/api/HelloWorld 就能測試。

部署到 Azure

方法一:使用 Azure Functions Core Tools

# 發佈到 Azure
func azure functionapp publish myapp-functions

方法二:使用 Visual Studio

  1. 右鍵點選專案 → 發佈
  2. 選擇「Azure」→「Azure Function App (Linux)」
  3. 選擇或建立 Function App
  4. 點選「發佈」

方法三:使用 GitHub Actions

# .github/workflows/azure-functions.yml
name: Deploy to Azure Functions

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '8.0.x'

      - name: Build
        run: dotnet build --configuration Release

      - name: Publish
        run: dotnet publish -c Release -o ./output

      - name: Deploy to Azure Functions
        uses: Azure/functions-action@v1
        with:
          app-name: myapp-functions
          package: ./output
          publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}

其他雲端平台的對比,可以參考 AWS 部署教學GCP 部署教學


Azure DevOps 整合

如果你的團隊使用 Azure DevOps,可以建立完整的 CI/CD Pipeline。

CI/CD Pipeline 設定

建立 Azure Pipeline

  1. 登入 Azure DevOps
  2. 建立或選擇專案
  3. 點選「Pipelines」→「建立 Pipeline」
  4. 選擇程式碼來源(Azure Repos 或 GitHub)
  5. 選擇「ASP.NET Core」範本

azure-pipelines.yml 範例

trigger:
  - main

pool:
  vmImage: 'ubuntu-latest'

variables:
  buildConfiguration: 'Release'
  azureSubscription: 'Your-Azure-Subscription'
  webAppName: 'myapp-api'

stages:
  - stage: Build
    displayName: 'Build Stage'
    jobs:
      - job: Build
        steps:
          - task: UseDotNet@2
            inputs:
              packageType: 'sdk'
              version: '8.0.x'

          - task: DotNetCoreCLI@2
            displayName: 'Restore'
            inputs:
              command: 'restore'

          - task: DotNetCoreCLI@2
            displayName: 'Build'
            inputs:
              command: 'build'
              arguments: '--configuration $(buildConfiguration)'

          - task: DotNetCoreCLI@2
            displayName: 'Test'
            inputs:
              command: 'test'
              arguments: '--configuration $(buildConfiguration)'

          - task: DotNetCoreCLI@2
            displayName: 'Publish'
            inputs:
              command: 'publish'
              publishWebProjects: true
              arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)'

          - task: PublishBuildArtifacts@1
            inputs:
              pathToPublish: '$(Build.ArtifactStagingDirectory)'
              artifactName: 'webapp'

  - stage: Deploy
    displayName: 'Deploy Stage'
    dependsOn: Build
    jobs:
      - deployment: Deploy
        environment: 'Production'
        strategy:
          runOnce:
            deploy:
              steps:
                - task: AzureWebApp@1
                  inputs:
                    azureSubscription: '$(azureSubscription)'
                    appType: 'webAppLinux'
                    appName: '$(webAppName)'
                    package: '$(Pipeline.Workspace)/webapp/**/*.zip'

自動化部署流程

Azure DevOps CI/CD Pipeline 流程圖:從程式碼提交到自動部署

部署位置(Deployment Slots)

App Service 的 Staging Slot 功能可以實現零停機部署:

# 先部署到 staging
- task: AzureWebApp@1
  inputs:
    azureSubscription: '$(azureSubscription)'
    appName: '$(webAppName)'
    slotName: 'staging'
    package: '$(Pipeline.Workspace)/webapp/**/*.zip'

# 驗證 staging 沒問題後,交換到 production
- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '$(azureSubscription)'
    Action: 'Swap Slots'
    WebAppName: '$(webAppName)'
    SourceSlot: 'staging'

流程是:
1. 程式碼推送到 main branch
2. Pipeline 自動建置並執行測試
3. 部署到 staging slot
4. (可加入手動核准步驟)
5. 交換 staging 和 production

這樣就算部署出問題,也能快速交換回去。

想深入了解 CI/CD 流程,可以參考 Build and Deploy 實戰


FAQ 常見問題

App Service 的免費方案 (F1) 有什麼限制?

Free F1 方案的限制:
- 每天 60 分鐘 CPU 時間
- 1 GB 記憶體
- 不支援自訂網域
- 不支援 SSL
- 會在閒置後停止

適合開發測試,但正式環境建議至少用 Basic B1。

Azure Functions 消費方案要多少錢?

消費方案(Consumption Plan)的計費:
- 每月前 100 萬次執行免費
- 每月前 400,000 GB-秒免費
- 超過後約 $0.20/百萬次執行

對於小型專案,通常都在免費額度內。

如何從 AWS 或 GCP 遷移到 Azure?

主要步驟:
1. 評估現有架構,找到對應的 Azure 服務
2. 設定 Azure 環境和資源
3. 修改程式碼中的雲端服務 SDK
4. 遷移資料
5. 測試並切換流量

Azure 有提供遷移評估工具和文件,可以參考 Azure Migrate

App Service 可以跑 Docker 容器嗎?

可以!App Service 有「Web App for Containers」選項,可以直接部署 Docker 映像。如果你需要更多容器功能,可以考慮 Azure Container Apps 或 AKS。

Visual Studio 可以直接部署到 Azure 嗎?

可以,這是最簡單的方式:
1. 右鍵點選專案 → 發佈
2. 選擇「Azure」
3. 選擇 App Service 或 Functions
4. 登入 Azure 帳號
5. 點選「發佈」

一鍵搞定,非常適合開發階段。


結語

Azure 是 .NET 開發者的最佳雲端選擇,主要優勢:

  • 無縫整合:Visual Studio、GitHub、Azure DevOps 完美配合
  • 企業級功能:Active Directory、合規性、全球資料中心
  • 完整生態系:從開發到監控的一站式解決方案

部署方式選擇建議:

情境 推薦方案
傳統 Web App App Service
單一 API/Webhook Azure Functions
容器化應用 Container Apps
需要 CI/CD Azure DevOps Pipeline

如果你是第一次用 Azure,建議從 App Service 開始,因為學習曲線最平緩,之後再根據需求擴展到其他服務。

重點整理:

  1. 選對服務:App Service 適合大多數 Web 應用
  2. 善用 GitHub 整合:設定一次,自動部署
  3. 安全管理機密:使用應用程式設定,不要寫死在程式碼
  4. 考慮 Staging Slot:實現零停機部署

🔧 雲端部署搞不懂? Azure 的服務選項很多,加上 DevOps 流程的設定,確實需要一些時間摸索。如果你在選擇服務或設定 CI/CD 時遇到困難,讓 VibeFix 協助你規劃 Azure 架構,我們熟悉 Microsoft 生態系,能幫你找到最適合的部署方案。

分享文章:
V

VibeFix

專門解決 AI Vibe Coding 後的疑難雜症,讓你的專案順利上線。

這篇文章有幫到你嗎?

如果還有問題,讓我們直接幫你解決!

聯繫我們