
這篇是 AWS 系列的元件線——回答「這東西是什麼、在什麼裡面、綁在什麼上」。它不講坑,坑在系列的 12 篇裡;它不講「我要做 X」,那是情境線。三條線互相指,從哪個入口進來都走得到另外兩個。
我第一次認真看一份實際專案的 AWS 架構圖(ECS + ALB + NAT + 外部金流)時,卡住的不是縮寫——縮寫查一下就有。卡住的是看不出誰在誰裡面:SG 到底綁在哪、為什麼 task 擴容不用改防火牆規則、NAT 為什麼放在 public subnet。K8s 的世界我有一張心裡的物件圖(Pod 在 Namespace 裡、NetworkPolicy 用 label 選 Pod),AWS 這張圖沒人畫給我看。這篇就是那張圖。
一、歸屬樹
先看誰裝在誰裡面。星號那一行是整張圖的關鍵。
帳號(Account) ← IAM、CloudTrail、Budgets、Organizations / SCP 都在這層
└─ Region ← 多數服務以 Region 為範圍;給 CloudFront 用的 ACM 憑證要在 us-east-1
└─ VPC ← CIDR 在這裡定,之後只能加副網段、不能改主網段
├─ Route Table ← 綁在 subnet 上,決定流量走哪扇門
├─ IGW ← 掛在 VPC 上,public subnet 對外的門
└─ AZ(可用區 = 一個機房)
└─ subnet(public / private)
├─ NAT gateway ← 放 public subnet,綁 EIP,同一個 NAT 最多 8 個 IPv4
├─ ALB 節點 ← 每個啟用的 AZ 一個節點,subnet 至少 /27 且留 8 個空 IP
├─ VPC Endpoint(Interface 型)← 本質是一張 ENI,每個 AZ 一張,按小時計費
└─ ★ ENI(網卡) ← Security Group 綁在這裡,不是綁機器、不是綁 subnet
├─ ECS task(awsvpc 模式:一個 task 一張 ENI)
├─ EC2 instance
├─ RDS instance
├─ ElastiCache 節點
└─ Lambda(接 VPC 時用 Hyperplane ENI:Lambda 代管、多個函式共用的網卡)
NACL 綁在 subnet 上——跟 SG 是兩層:NACL 在 subnet、SG 在網卡看懂這棵樹,12 篇裡好幾件事就不用背了:
- task 擴到一百個不用改 SG——因為 SG 綁網卡、規則寫的是「來源是 ALB 的 SG」,新 task 的網卡掛同一個 SG 就繼承了
- NAT 為什麼放 public subnet——它自己要能出去,所以要在有 IGW 路由的網段
- Interface endpoint 為什麼收費——它是一張網卡,網卡佔 IP、佔資源
- subnet 給
/24為什麼會不夠——ALB 節點要 IP、每個 task 要 IP、每個 endpoint 要 IP、EKS 每個 Pod 要 IP
二、三條穿過歸屬樹的軸
歸屬樹是「網路」這一面。還有三條軸從別的方向穿過去:
身分軸: IAM role ──綁到──▶ ECS task(Task Role 給程式用 / Execution Role 給 ECS 自己用)
EC2(instance profile)
Lambda(execution role)
EKS Pod(IRSA 或 Pod Identity)
GitHub Actions(OIDC 信任政策)
人的身分:Identity Center ──權限集──▶ 各帳號的 role(人不建 IAM user)
交付軸: git SHA → image → ECR → task definition(revision N,不可變)→ service → task
migration 走獨立 RunTask,不在 service 裡
觀測軸: 每層的 log 各自在哪:
ALB access log → S3 / 容器 stdout → CloudWatch Logs / API 呼叫 → CloudTrail / 網路 → VPC Flow Logs身分軸解釋了「兩個 role」為什麼會搞混——Task Role 和 Execution Role 都寫在 task definition 裡,但一個是你的程式的身分、一個是 ECS 的身分。權限加錯 role,程式拿不到東西,而你會先去懷疑錯的那個(第 8 篇)。
三、元件表
每個元件五欄:幹嘛 / 在什麼裡面 / 綁在什麼上 / 第一次會在什麼情境碰到 / 坑在哪篇。K8s 對應放最後一欄,地端對應在 Infra 自架系列。
這篇的表格會超過兩張——主題本來就是對照。
縮寫查一下就有,但有個記法能少查幾次:AWS 很多服務開頭的 E 是 Elastic(可伸縮),忽略它,看後面那個字。
- EC2 = Compute Cloud(虛擬機)——數字 2 是指兩個 C
- ECS = Container Service(容器編排)
- ECR = Container Registry(image 倉庫)
- EKS = Kubernetes Service(託管 K8s)
- EIP = IP(固定公網 IP)
- ENI = Network Interface(網卡)
下面每張表的元件欄,縮寫後面的括號多半是全名,同一個縮寫只附一次。本身不是縮寫的(像 subnet、Route Table)就沒有括號。
網路
| 元件 | 幹嘛 | 在什麼裡面 | 綁在什麼上 | 第一次碰到它 | 坑 | K8s |
|---|---|---|---|---|---|---|
| VPC(Virtual Private Cloud) | 你的私有網路 | Region | — | 開帳號第一件事;跟別的 VPC 或地端 CIDR 撞到就接不起來 | 02 | cluster 網路 |
| AZ(Availability Zone) | 同一個 Region 內實體隔離的機房 | Region | — | 建 subnet 要選 AZ;ALB、RDS subnet group 都要至少兩個 AZ | 02、11 | node 的 zone label |
| subnet | 網段。public 出得去也進得來,private 只出不進 | VPC 內的某一個 AZ | — | 決定機器放哪;放錯 public 是配置錯誤不是取捨 | 02 | node 網段 |
| IGW(Internet Gateway) | VPC 對外的門 | 掛在 VPC | — | public subnet 上不了網——Route Table 沒指向它 | 02 | — |
| Route Table | 每個 subnet 往外的流量走哪扇門 | VPC | subnet | 建了 NAT 但 task 拉不到 image——最容易忘的一步 | 02 | CNI 路由 |
| NAT gateway | 讓 private subnet 出得去、外面進不來 | public subnet | EIP(最多 8 個 IPv4) | 第三方要你報固定 IP;連線撞 55,000 上限 | 02、11 | 一樣是 NAT |
| EIP(Elastic IP) | 固定不變的公網 IP | 帳號 → Region | NAT / EC2 / NLB | 白名單要報 IP。收費:2024-02 起,公有 IPv4(含 EIP)按小時收費。綁在機器上、閒置沒用,都是同一個費率 | 02、11 | — |
| ENI(Elastic Network Interface) | 網卡。有 IP、有 SG、在某個 subnet | subnet | task / EC2 / RDS / Lambda | 你不會直接碰它,但 SG、endpoint、task 的 IP 全綁在它上;subnet IP 不夠就是它們把 IP 吃光 | 02、04 | Pod 的網卡(VPC CNI 一樣) |
| Security Group | 網卡層防火牆。只有 allow 沒有 deny,有狀態 | VPC | ENI,一張最多 5 個 | 機器開了連不上、ALB 打不到 task;來源寫 SG ID 不寫 IP | 02、04、12 | NetworkPolicy,但沒有 label selector |
| NACL(Network ACL) | subnet 層防火牆。有 deny,無狀態(進出要各寫一條) | VPC | subnet | 多數人不碰;要「整個網段擋某個 IP」或合規要求第二層時才用 | — | — |
| VPC Endpoint | VPC 內直連 AWS 服務,不經 NAT。Gateway 型(只有 S3、DynamoDB)免費;Interface 型是一張 ENI、收費 | VPC | Gateway 綁 route table;Interface 綁 subnet + SG | private subnet 的 task 拉不到 Secrets Manager;NAT 處理費太高 | 02、08、11 | — |
| VPC Peering | 兩個 VPC 點對點接起來 | 帳號內或跨帳號 | 兩個 VPC 的 route table | 兩個環境要互通;流量不能經 peering 再進 NAT 出網 | — | — |
| Transit Gateway | 多 VPC + 地端的星狀路由器 | Region | VPC / VPN attachment | VPC 超過三個、或地端要借雲端的 NAT 出去(虛擬私有閘道走不進 NAT) | 02 | — |
| Route 53 | DNS。public 給外面解、private hosted zone 給 VPC 內解 | 帳號(全球) | Alias 指 ALB | 網域指到 ALB;服務發現用內部 DNS | 04 | ExternalDNS / CoreDNS |
| CloudFront | CDN,邊緣終止 TLS、快取靜態資源 | 全球 | origin 指 ALB 或 S3 | 傳出費太高、ALB 壓力大;加了它 ALB 還是公開的,要另外鎖 | 04、11、12 | — |
入口
| 元件 | 幹嘛 | 在什麼裡面 | 綁在什麼上 | 第一次碰到它 | 坑 | K8s |
|---|---|---|---|---|---|---|
| ELB(Elastic Load Balancing) | 負載平衡器的總稱,底下是 ALB、NLB 等幾種 | Region | — | 定價頁和 CLI(aws elbv2)用的是這個名字,不是 ALB | 04 | — |
| ALB(Application Load Balancer) | 第七層負載平衡,依 host / path 分流,TLS 在這裡終止 | VPC,跨至少兩個 AZ 的 subnet | SG、listener、target group | 服務要對外;服務之間互打也常繞它 | 04 | Ingress controller |
| Listener | ALB 上「聽 443、掛這張憑證、照這些規則分流」 | ALB | 規則 → target group | 加第二個網域要加規則;規則超過 100 條要申請 | 04 | Ingress rule |
| Target Group | 流量最後送到的那一組後端 | Region | ALB(一個 ALB 最多 100 個,不可調) | 每個服務一個;藍綠部署再多一個;health check 設在這裡 | 04 | Endpoints |
| NLB(Network Load Balancer) | 第四層,只看 TCP / UDP,可綁固定 IP | VPC | EIP、target group | 對方要白名單你的入口 IP;非 HTTP 協定 | 04 | Service type LoadBalancer |
| ACM(AWS Certificate Manager) | TLS 憑證,DNS 驗證才會自動續期 | Region | listener / CloudFront | 第一次上 HTTPS;驗證用的 CNAME 刪了就不續 | 04 | cert-manager |
| WAF(Web Application Firewall) | 第七層防火牆:SQL injection、爬蟲、速率限制 | Region 或全球 | ALB / CloudFront | 被掃、被爬;先 Count 一週再 Block | 12 | ModSecurity |
| API Gateway | API 入口,限流、計量、key 管理 | Region | Lambda / ALB | Serverless 形狀的前門;預設節流 10,000 rps 比 Lambda 並行 1,000 大 | 09 | Kong / gateway |
運算
| 元件 | 幹嘛 | 在什麼裡面 | 綁在什麼上 | 第一次碰到它 | 坑 | K8s |
|---|---|---|---|---|---|---|
| ECS cluster(Elastic Container Service) | 一個有名字的分組,把 service 和 task 歸在一起;掛 capacity provider 決定 task 跑在什麼容量上。沒有 control plane 給你調、沒有 namespace | Region | capacity provider(Fargate / Fargate Spot / ASG) | 第一個 service 之前;環境隔離不靠它,靠帳號或 VPC | 03 | cluster,但砍掉一半 |
| Task Definition | 容器規格:image、CPU、記憶體、環境變數、秘密、log driver。不可變,改一個字就是新 revision | 帳號 → Region | 被 service 指向某個 revision | 第一次部署;回滾就是指回舊 revision | 03、10 | Pod template(但 K8s 是就地改) |
| Task | 最小排程單位,可含多容器(最多 10 個),一個 task 一張 ENI | cluster | task definition、ENI、SG | 跑起來的東西就是它;本地磁碟是暫時的 | 03、05 | Pod |
| Service | 維持 N 個 task、滾動更新、掛 target group | cluster | task definition、target group、capacity provider | 要常駐就用它;AWS 會退役 task,只有 service 底下的會自動補 | 03、10 | Deployment |
| RunTask | 一次性跑一個 task,跑完結束 | cluster | task definition | migration、批次 | 10 | Job |
| Fargate | 不管機器的跑法:給 CPU 和記憶體,AWS 找機器 | capacity provider | — | 預設選它;新帳號只有 6 個 vCPU 配額 | 03 | 沒有 node 的 K8s |
| EC2 launch type(Elastic Compute Cloud) | 自己開一群 EC2 註冊進 cluster 當容器主機 | cluster | ASG | 要 GPU、要 privileged、要 image 預拉秒起、要用 Spot 塞滿機器 | 03 | node group |
| ASG(Auto Scaling Group) | 一組會自動增減的 EC2 | Region,跨所選 AZ 的 subnet | launch template;被 capacity provider 引用 | 選了 EC2 launch type,容器主機要能自己長出來 | 03 | Cluster Autoscaler 管的 node group |
| Capacity Provider | 告訴 service「task 跑在哪種容量、比例多少」 | cluster | Fargate / Fargate Spot / ASG | 要混 Spot 省錢:base=1 保一個 On-Demand | 03、11 | — |
| Service Connect | ECS 的 cluster 內服務發現:服務用名字互找,不用繞 ALB | cluster + namespace(一個 namespace 最多 300 服務) | service | 服務之間互打走內部 ALB 太貴、太慢;K8s 人找 ClusterIP 找不到時 | 03、04 | ClusterIP + CoreDNS |
| ECR(Elastic Container Registry) | image 倉庫 | Region | 被 task definition 引用 | 第一次 push image;tag 要不可變 | 10 | registry |
| EKS(Elastic Kubernetes Service) | 託管的正牌 K8s | Region | VPC、node group | 團隊會 K8s 或要多雲;版本 26 個月後被強制升級 | 03 | 就是 K8s |
| Lambda | 無伺服器函式,按呼叫計費 | Region | execution role;可接 VPC | 另一種形狀;接 VPC 就沒網路 | 09 | Knative |
身分與秘密
| 元件 | 幹嘛 | 在什麼裡面 | 綁在什麼上 | 第一次碰到它 | 坑 | K8s |
|---|---|---|---|---|---|---|
| IAM role(Identity and Access Management) | 可被「assume」的身分,拿到的是幾小時就過期的臨時憑證 | 帳號(全球,不分 Region) | task / EC2 / Lambda / 外部 OIDC / 人 | 程式要呼叫 AWS;不發 access key | 01、08 | ServiceAccount |
| IAM policy | 這個身分能做什麼動作、對什麼資源 | 帳號 | 掛在 role 上 | 程式 AccessDenied;用 Access Analyzer 從實際呼叫生出最小權限 | 01 | RBAC Role |
| Task Role | 你的程式呼叫 AWS 用的身分 | task definition | task | 程式讀不到 S3、發不了 SQS | 08、12 | IRSA |
| Execution Role | ECS 自己用的:拉 image、寫 log、注入秘密 | task definition | task | task 起不來、錯誤是 AccessDenied 但 Task Role 明明對 | 08、12 | node 的 role |
| Identity Center | 人的登入。接公司身分來源,臨時憑證,離職自動失效 | Organization | 權限集 → 各帳號的 role | 第二個人要登入時;人不建 IAM user | 01、12 | kubeconfig user |
| Organizations / SCP | 多帳號管理;SCP 是「不管你是誰都不能做」的護欄 | Organization | OU / 帳號 | 第二個環境;一環境一帳號;擋沒標籤的資源 | 01、12 | — |
| OIDC provider | 讓外部身分(GitHub Actions)換 AWS 臨時憑證 | 帳號 | role 的信任政策 | CI 要部署但不想存 key | 10 | — |
| Secrets Manager | 存秘密、能自動輪替、能跨帳號分享 | Region | 被 task definition 的 secrets 引用 | DB 密碼不能放 .env;輪替後 task 拿不到新值 | 08、12 | Secret + ESO |
| Parameter Store | 存設定,SecureString 也能加密 | Region | 同上 | feature flag、endpoint URL | 08 | ConfigMap |
| KMS(Key Management Service) | 加密金鑰。RDS、S3、EBS、Secrets 的加密底層 | Region | 各服務 | 要自己管金鑰輪替;自訂 key 的秘密 Execution Role 還要 kms:Decrypt | 05、08 | — |
| SSM Session Manager(SSM 是 Systems Manager 的簡稱,Session Manager 是它底下的功能) | 不開 port、不發 key 連進機器,CloudTrail 有紀錄 | Region | instance role | 要進 EC2 除錯;取代 SSH + PEM | 03 | kubectl exec |
資料與訊息
| 元件 | 幹嘛 | 在什麼裡面 | 綁在什麼上 | 第一次碰到它 | 坑 | K8s |
|---|---|---|---|---|---|---|
| S3(Simple Storage Service) | 物件儲存。新 bucket 預設擋公開、預設加密 | Region(名字全球唯一) | — | 檔案不能留在容器裡;備份、log、靜態資源 | 05 | — |
| EBS(Elastic Block Store) | 掛在單台 EC2 上的硬碟,綁 AZ | AZ | EC2 | 只在 EC2 上跑資料庫時;根磁碟預設跟著機器一起刪、資料磁碟預設留 | 05 | PV(block) |
| EFS(Elastic File System) | 多台共用的 NFS | Region,每 AZ 一個 mount target | SG | 真的要共用檔案系統;常被誤用來解「容器要寫檔」 | 05 | PV(RWX) |
| RDS(Relational Database Service) | 託管關聯式資料庫,Multi-AZ 切換 60–120 秒 | subnet group(至少兩個 AZ) | SG | 第一個資料庫;驅動要會重連 | 06 | StatefulSet DB |
| RDS Proxy | 資料庫前的連線池。支援 MySQL、MariaDB、PostgreSQL、SQL Server(官方文件) | Region | RDS + Secrets Manager | task 擴容打爆連線數;PostgreSQL + prepared statement 幾乎沒效 | 06 | PgBouncer |
| ElastiCache | 託管 Redis。不需要 proxy(Serverless 版內建 proxy,見 06) | subnet group | SG | session 要外置、快取、鎖 | 06 | Redis operator |
| SQS(Simple Queue Service) | 佇列,一則訊息一個消費者,至少送一次 | Region | 死信佇列 | webhook 要非同步;排程要脫離單機 | 07、09 | — |
| SNS(Simple Notification Service) | 發佈訂閱。一則訊息複製一份給每個訂閱者,這叫扇出(fan-out) | Region | 訂閱者(email / SQS / Lambda) | CloudWatch Alarm、Budgets 的通知都送到它 | 07、11 | — |
| EventBridge | 事件匯流排 + 排程器(有時區參數) | Region | rule → target | 跨服務的領域事件;cron | 09、10 | CronJob + 事件匯流排 |
| Kinesis / MSK(Managed Streaming for Apache Kafka) | 串流 / 託管 Kafka。跟 SQS 佇列差在:訊息讀完不會消失,保留到期限才刪;每個消費者各自記讀到哪裡 | Region;MSK 的 broker 在 subnet 裡 | MSK 綁 SG | 同一串事件要給多個消費者各自讀 | — | 自跑的 Kafka |
觀測與治理
| 元件 | 幹嘛 | 在什麼裡面 | 綁在什麼上 | 第一次碰到它 | 坑 | K8s |
|---|---|---|---|---|---|---|
| CloudWatch Metrics / Alarms | 指標與告警。沒有分組;抑制只有 composite alarm 的 ActionsSuppressor;靜音用 Alarm Mute Rules | Region | SNS topic | 第一條告警;告症狀不告原因 | 07 | Prometheus + Alertmanager |
| CloudWatch Logs | log 儲存,預設永不過期,收三次錢 | Region | log group | 容器 stdout 進來;設保留期 | 07、11 | Loki |
| X-Ray | 分散式追蹤 | Region | sidecar | 五個服務哪個慢;Fargate 沒 DaemonSet 只能 sidecar | 07 | Tempo |
| CloudTrail | 誰在什麼時候呼叫了哪個 AWS API | 帳號,全區域 | S3 bucket(放另一個帳號) | 第一天開;查「誰砍的」 | 01、12 | audit log |
| GuardDuty | 威脅偵測 | Region | EventBridge | 一行開,每週有人看 | 12 | Falco |
| Budgets | 預算告警:實際 80%、預測 100% | 帳號 | SNS | 第一天設;帳單跳是被入侵的第一個訊號 | 11 | Kubecost |
| Cost Explorer | 帳單分析,按服務、按標籤分 | 帳號 | 成本分配標籤 | 帳單跳了要找是哪一行 | 11 | Kubecost / OpenCost 的分攤報表 |
| Service Quotas | 每個服務的配額,分可調和不可調 | 帳號 → Region | — | 壓測前查;Fargate 6 vCPU、ALB 100 target group | 03、04、09 | — |
四、怎麼用這張圖
看架構圖的時候:先找 VPC 的邊界,再找 subnet 是 public 還是 private,再問每個方塊的 ENI 掛了哪個 SG。三步之後那張圖就會說話。
出事的時候:從症狀找篇——連不上是 02、擴容慢是 04、連線爆是 06、拉不到秘密是 08、帳單跳是 11。每篇底下的「不算 / 算」表告訴你做到哪裡算解決。
要做一件事的時候:走情境線——「第三方要固定 IP」「要接金流」「流量翻十倍」各一條路徑,經過哪些元件、每個節點的決策點。第一條 流量翻十倍 已經寫好,其餘還在寫;入口在 系列目錄。
從 K8s 過來的時候:把這張歸屬樹跟你心裡那張 Pod / Namespace / Cluster 的圖並排。最大的不同有三個——SG 綁網卡不綁標籤、沒有 namespace 所以隔離往上搬到帳號、沒有 ClusterIP 所以服務發現要另外做。其他都對得上。
相關文章
- 系列入口:AWS 雲端實戰系列——三個入口在最上面
- 五個 K8s → ECS 的落差展開: EKS
- 地端對照:Infra 自架系列、K8s 實戰系列
- 跨雲的管理模型差異(帳號是牆 vs 專案是資料夾):雲端服務系列
架構圖上每一個方塊,先問三件事:它在什麼裡面、綁在什麼上、誰能連到它。答得出來,圖就看懂了。
