雲端基礎概念(IaaS / PaaS / SaaS)

是什麼?

雲端服務依照「你管多少 vs 雲端商管多少」分為三種模式:IaaS 提供基礎設施、PaaS 提供開發平台、SaaS 提供完整應用程式。選擇取決於你需要多少控制權和願意承擔多少維運工作。

ℹ️雲端 vs 地端

地端(On-Premises):自己買伺服器、自己建機房、自己維護一切。雲端:用多少付多少(Pay-as-you-go),彈性擴縮(Scale),全球部署。雲端不一定比地端便宜,但在彈性和速度上有巨大優勢。

核心觀念

常見誤區

⚠️常見誤區

  • 雲端一定比較便宜:小規模或穩定負載的應用,地端 TCO(Total Cost of Ownership)可能更低。雲端的優勢是彈性,不是絕對價格
  • 上雲就等於高可用:雲端機器也會掛。你必須自己做多 AZ 部署、健康檢查、自動回復才能達到高可用
  • PaaS 沒有 Vendor Lock-in 問題:深度使用特定 PaaS 服務(如 Azure Functions 的 Binding)會讓你很難遷移到其他雲。評估 Lock-in 風險

流程/步驟

1

評估需求

需要多少控制權?團隊有多少維運能力?

2

選擇服務模式

需要完全控制用 IaaS,專注開發用 PaaS,現成工具用 SaaS

3

選擇雲端商

Azure、AWS、GCP 各有優勢,考量價格、生態系、地理位置

4

設計架構

選擇 Region、規劃 Network、設定 IAM 權限

5

成本優化

用 Reserved Instance 省錢、設定預算警報、定期清理閒置資源

流程解讀:從需求評估開始,決定要多少控制權。選擇服務模式後挑選雲端商,考量的不只是價格,還有團隊技術棧和雲端商的區域覆蓋。架構設計時注意高可用和安全,上線後持續做成本優化。

程式碼範例

C# 版本

csharp
// Azure SDK — 用程式碼管理雲端資源
using Azure.Identity;
using Azure.ResourceManager;
 
// 認證 — 用 DefaultAzureCredential(支援本機開發和雲端環境)
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
 
// 列出所有 Resource Group
var subscription = await armClient.GetDefaultSubscriptionAsync();
await foreach (var rg in subscription.GetResourceGroups())
{
    Console.WriteLine($"Resource Group: {rg.Data.Name}, Location: {rg.Data.Location}");
}
 
// 環境設定 — 不同環境用不同的雲端服務
// appsettings.Development.json → 本機 Docker
// appsettings.Staging.json → Azure App Service (PaaS)
// appsettings.Production.json → Azure App Service + Redis + SQL
builder.Configuration
    .AddJsonFile("appsettings.json")
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    .AddAzureKeyVault(new Uri(vaultUri), credential); // 從 Key Vault 取密鑰

TypeScript 版本

typescript
// AWS SDK v3 — 管理雲端資源
import { EC2Client, DescribeInstancesCommand } from "@aws-sdk/client-ec2";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
 
// 列出 EC2 Instance(IaaS)
const ec2 = new EC2Client({ region: "us-east-1" });
const instances = await ec2.send(new DescribeInstancesCommand({}));
instances.Reservations?.forEach((r) =>
  r.Instances?.forEach((i) =>
    console.log(`Instance: ${i.InstanceId}, State: ${i.State?.Name}`)
  )
);
 
// 上傳檔案到 S3(Storage)
const s3 = new S3Client({ region: "us-east-1" });
await s3.send(
  new PutObjectCommand({
    Bucket: "my-app-bucket",
    Key: "uploads/photo.jpg",
    Body: fileBuffer,
    ContentType: "image/jpeg",
  })
);

Python 版本

python
# Azure SDK — Python
from azure.identity import DefaultAzureCredential
from azure.mgmt.resource import ResourceManagementClient
 
credential = DefaultAzureCredential()
subscription_id = "your-subscription-id"
 
# 列出 Resource Group
resource_client = ResourceManagementClient(credential, subscription_id)
for rg in resource_client.resource_groups.list():
    print(f"Resource Group: {rg.name}, Location: {rg.location}")
 
# Boto3 — AWS Python SDK
import boto3
 
# 列出 S3 Bucket
s3 = boto3.client("s3")
response = s3.list_buckets()
for bucket in response["Buckets"]:
    print(f"Bucket: {bucket['Name']}")

架構圖/概念圖

You (Developer)
always manage
Application Code
PaaS manages below
Runtime / Middleware
IaaS manages below
OS
VM / Network / Storage
cloud always manages
Physical Hardware

由上到下,Application Code 永遠是你的責任。PaaS 幫你管 Runtime 和 OS。IaaS 只管實體硬體和虛擬化層,OS 以上都是你的。理解這個分界線是選擇服務模式的關鍵。

實戰補充

Q: 新專案應該選 IaaS 還是 PaaS?

A: 預設選 PaaS,除非有明確的理由需要控制 OS(如特殊驅動程式、效能調校)。PaaS 讓你專注在業務邏輯,維運成本低很多。等到 PaaS 真的限制了你,再考慮降級到 IaaS。

Q: 如何避免 Vendor Lock-in?

A: (1) 核心業務邏輯不要依賴雲端特定 API,用抽象層隔離。(2) 資料格式用標準格式(JSON、Parquet),不用雲端專屬格式。(3) 容器化應用程式,Docker Image 跨雲皆可執行。

Q: 多雲(Multi-Cloud)值得嗎?

A: 大多數中小團隊不值得。多雲增加架構複雜度、團隊學習成本、且無法享受單一雲端的深度整合和量大折扣。除非有法規要求(資料落地)或極高可用需求,否則先專注單一雲端。

理解測驗

🤔 PaaS 和 IaaS 的核心差異是什麼?

🤔 雲端的 Shared Responsibility Model 指的是什麼?

🤔 以下哪個是選擇 PaaS 而非 IaaS 的好理由?

重點整理

💡一句話記住

IaaS 全自己管、PaaS 專注寫 Code、SaaS 開了就用。 口訣:「越懶越 SaaS,越控越 IaaS」

| 模式 | 你管什麼 | 雲端管什麼 | 範例 | |------|---------|-----------|------| | IaaS | OS + Runtime + App | 硬體 + 虛擬化 | Azure VM, EC2 | | PaaS | App + Data | OS + Runtime + 硬體 | App Service, Beanstalk | | SaaS | 設定 + 使用 | 全部 | M365, Salesforce |

你可能也想看

運算服務選擇

按 ← → 鍵切換課程