cover

這篇是 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 撞到就接不起來02cluster 網路
AZ(Availability Zone)同一個 Region 內實體隔離的機房Region—建 subnet 要選 AZ;ALB、RDS subnet group 都要至少兩個 AZ02、11node 的 zone label
subnet網段。public 出得去也進得來,private 只出不進VPC 內的某一個 AZ—決定機器放哪;放錯 public 是配置錯誤不是取捨02node 網段
IGW(Internet Gateway)VPC 對外的門掛在 VPC—public subnet 上不了網——Route Table 沒指向它02—
Route Table每個 subnet 往外的流量走哪扇門VPCsubnet建了 NAT 但 task 拉不到 image——最容易忘的一步02CNI 路由
NAT gateway讓 private subnet 出得去、外面進不來public subnetEIP(最多 8 個 IPv4)第三方要你報固定 IP;連線撞 55,000 上限02、11一樣是 NAT
EIP(Elastic IP)固定不變的公網 IP帳號 → RegionNAT / EC2 / NLB白名單要報 IP。收費:2024-02 起,公有 IPv4(含 EIP)按小時收費。綁在機器上、閒置沒用,都是同一個費率02、11—
ENI(Elastic Network Interface)網卡。有 IP、有 SG、在某個 subnetsubnettask / EC2 / RDS / Lambda你不會直接碰它,但 SG、endpoint、task 的 IP 全綁在它上;subnet IP 不夠就是它們把 IP 吃光02、04Pod 的網卡(VPC CNI 一樣)
Security Group網卡層防火牆。只有 allow 沒有 deny,有狀態VPCENI,一張最多 5 個機器開了連不上、ALB 打不到 task;來源寫 SG ID 不寫 IP02、04、12NetworkPolicy,但沒有 label selector
NACL(Network ACL)subnet 層防火牆。有 deny,無狀態(進出要各寫一條)VPCsubnet多數人不碰;要「整個網段擋某個 IP」或合規要求第二層時才用——
VPC EndpointVPC 內直連 AWS 服務,不經 NAT。Gateway 型(只有 S3、DynamoDB)免費;Interface 型是一張 ENI、收費VPCGateway 綁 route table;Interface 綁 subnet + SGprivate subnet 的 task 拉不到 Secrets Manager;NAT 處理費太高02、08、11—
VPC Peering兩個 VPC 點對點接起來帳號內或跨帳號兩個 VPC 的 route table兩個環境要互通;流量不能經 peering 再進 NAT 出網——
Transit Gateway多 VPC + 地端的星狀路由器RegionVPC / VPN attachmentVPC 超過三個、或地端要借雲端的 NAT 出去(虛擬私有閘道走不進 NAT)02—
Route 53DNS。public 給外面解、private hosted zone 給 VPC 內解帳號(全球)Alias 指 ALB網域指到 ALB;服務發現用內部 DNS04ExternalDNS / CoreDNS
CloudFrontCDN,邊緣終止 TLS、快取靜態資源全球origin 指 ALB 或 S3傳出費太高、ALB 壓力大;加了它 ALB 還是公開的,要另外鎖04、11、12—

入口

元件幹嘛在什麼裡面綁在什麼上第一次碰到它坑K8s
ELB(Elastic Load Balancing)負載平衡器的總稱,底下是 ALB、NLB 等幾種Region—定價頁和 CLI(aws elbv2)用的是這個名字,不是 ALB04—
ALB(Application Load Balancer)第七層負載平衡,依 host / path 分流,TLS 在這裡終止VPC,跨至少兩個 AZ 的 subnetSG、listener、target group服務要對外;服務之間互打也常繞它04Ingress controller
ListenerALB 上「聽 443、掛這張憑證、照這些規則分流」ALB規則 → target group加第二個網域要加規則;規則超過 100 條要申請04Ingress rule
Target Group流量最後送到的那一組後端RegionALB(一個 ALB 最多 100 個,不可調)每個服務一個;藍綠部署再多一個;health check 設在這裡04Endpoints
NLB(Network Load Balancer)第四層,只看 TCP / UDP,可綁固定 IPVPCEIP、target group對方要白名單你的入口 IP;非 HTTP 協定04Service type LoadBalancer
ACM(AWS Certificate Manager)TLS 憑證,DNS 驗證才會自動續期Regionlistener / CloudFront第一次上 HTTPS;驗證用的 CNAME 刪了就不續04cert-manager
WAF(Web Application Firewall)第七層防火牆:SQL injection、爬蟲、速率限制Region 或全球ALB / CloudFront被掃、被爬;先 Count 一週再 Block12ModSecurity
API GatewayAPI 入口,限流、計量、key 管理RegionLambda / ALBServerless 形狀的前門;預設節流 10,000 rps 比 Lambda 並行 1,000 大09Kong / gateway

運算

元件幹嘛在什麼裡面綁在什麼上第一次碰到它坑K8s
ECS cluster(Elastic Container Service)一個有名字的分組,把 service 和 task 歸在一起;掛 capacity provider 決定 task 跑在什麼容量上。沒有 control plane 給你調、沒有 namespaceRegioncapacity provider(Fargate / Fargate Spot / ASG)第一個 service 之前;環境隔離不靠它,靠帳號或 VPC03cluster,但砍掉一半
Task Definition容器規格:image、CPU、記憶體、環境變數、秘密、log driver。不可變,改一個字就是新 revision帳號 → Region被 service 指向某個 revision第一次部署;回滾就是指回舊 revision03、10Pod template(但 K8s 是就地改)
Task最小排程單位,可含多容器(最多 10 個),一個 task 一張 ENIclustertask definition、ENI、SG跑起來的東西就是它;本地磁碟是暫時的03、05Pod
Service維持 N 個 task、滾動更新、掛 target groupclustertask definition、target group、capacity provider要常駐就用它;AWS 會退役 task,只有 service 底下的會自動補03、10Deployment
RunTask一次性跑一個 task,跑完結束clustertask definitionmigration、批次10Job
Fargate不管機器的跑法:給 CPU 和記憶體,AWS 找機器capacity provider—預設選它;新帳號只有 6 個 vCPU 配額03沒有 node 的 K8s
EC2 launch type(Elastic Compute Cloud)自己開一群 EC2 註冊進 cluster 當容器主機clusterASG要 GPU、要 privileged、要 image 預拉秒起、要用 Spot 塞滿機器03node group
ASG(Auto Scaling Group)一組會自動增減的 EC2Region,跨所選 AZ 的 subnetlaunch template;被 capacity provider 引用選了 EC2 launch type,容器主機要能自己長出來03Cluster Autoscaler 管的 node group
Capacity Provider告訴 service「task 跑在哪種容量、比例多少」clusterFargate / Fargate Spot / ASG要混 Spot 省錢:base=1 保一個 On-Demand03、11—
Service ConnectECS 的 cluster 內服務發現:服務用名字互找,不用繞 ALBcluster + namespace(一個 namespace 最多 300 服務)service服務之間互打走內部 ALB 太貴、太慢;K8s 人找 ClusterIP 找不到時03、04ClusterIP + CoreDNS
ECR(Elastic Container Registry)image 倉庫Region被 task definition 引用第一次 push image;tag 要不可變10registry
EKS(Elastic Kubernetes Service)託管的正牌 K8sRegionVPC、node group團隊會 K8s 或要多雲;版本 26 個月後被強制升級03就是 K8s
Lambda無伺服器函式,按呼叫計費Regionexecution role;可接 VPC另一種形狀;接 VPC 就沒網路09Knative

身分與秘密

元件幹嘛在什麼裡面綁在什麼上第一次碰到它坑K8s
IAM role(Identity and Access Management)可被「assume」的身分,拿到的是幾小時就過期的臨時憑證帳號(全球,不分 Region)task / EC2 / Lambda / 外部 OIDC / 人程式要呼叫 AWS;不發 access key01、08ServiceAccount
IAM policy這個身分能做什麼動作、對什麼資源帳號掛在 role 上程式 AccessDenied;用 Access Analyzer 從實際呼叫生出最小權限01RBAC Role
Task Role你的程式呼叫 AWS 用的身分task definitiontask程式讀不到 S3、發不了 SQS08、12IRSA
Execution RoleECS 自己用的:拉 image、寫 log、注入秘密task definitiontasktask 起不來、錯誤是 AccessDenied 但 Task Role 明明對08、12node 的 role
Identity Center人的登入。接公司身分來源,臨時憑證,離職自動失效Organization權限集 → 各帳號的 role第二個人要登入時;人不建 IAM user01、12kubeconfig user
Organizations / SCP多帳號管理;SCP 是「不管你是誰都不能做」的護欄OrganizationOU / 帳號第二個環境;一環境一帳號;擋沒標籤的資源01、12—
OIDC provider讓外部身分(GitHub Actions)換 AWS 臨時憑證帳號role 的信任政策CI 要部署但不想存 key10—
Secrets Manager存秘密、能自動輪替、能跨帳號分享Region被 task definition 的 secrets 引用DB 密碼不能放 .env;輪替後 task 拿不到新值08、12Secret + ESO
Parameter Store存設定,SecureString 也能加密Region同上feature flag、endpoint URL08ConfigMap
KMS(Key Management Service)加密金鑰。RDS、S3、EBS、Secrets 的加密底層Region各服務要自己管金鑰輪替;自訂 key 的秘密 Execution Role 還要 kms:Decrypt05、08—
SSM Session Manager(SSM 是 Systems Manager 的簡稱,Session Manager 是它底下的功能)不開 port、不發 key 連進機器,CloudTrail 有紀錄Regioninstance role要進 EC2 除錯;取代 SSH + PEM03kubectl exec

資料與訊息

元件幹嘛在什麼裡面綁在什麼上第一次碰到它坑K8s
S3(Simple Storage Service)物件儲存。新 bucket 預設擋公開、預設加密Region(名字全球唯一)—檔案不能留在容器裡;備份、log、靜態資源05—
EBS(Elastic Block Store)掛在單台 EC2 上的硬碟,綁 AZAZEC2只在 EC2 上跑資料庫時;根磁碟預設跟著機器一起刪、資料磁碟預設留05PV(block)
EFS(Elastic File System)多台共用的 NFSRegion,每 AZ 一個 mount targetSG真的要共用檔案系統;常被誤用來解「容器要寫檔」05PV(RWX)
RDS(Relational Database Service)託管關聯式資料庫,Multi-AZ 切換 60–120 秒subnet group(至少兩個 AZ)SG第一個資料庫;驅動要會重連06StatefulSet DB
RDS Proxy資料庫前的連線池。支援 MySQL、MariaDB、PostgreSQL、SQL Server(官方文件)RegionRDS + Secrets Managertask 擴容打爆連線數;PostgreSQL + prepared statement 幾乎沒效06PgBouncer
ElastiCache託管 Redis。不需要 proxy(Serverless 版內建 proxy,見 06)subnet groupSGsession 要外置、快取、鎖06Redis 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事件匯流排 + 排程器(有時區參數)Regionrule → target跨服務的領域事件;cron09、10CronJob + 事件匯流排
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 RulesRegionSNS topic第一條告警;告症狀不告原因07Prometheus + Alertmanager
CloudWatch Logslog 儲存,預設永不過期,收三次錢Regionlog group容器 stdout 進來;設保留期07、11Loki
X-Ray分散式追蹤Regionsidecar五個服務哪個慢;Fargate 沒 DaemonSet 只能 sidecar07Tempo
CloudTrail誰在什麼時候呼叫了哪個 AWS API帳號,全區域S3 bucket(放另一個帳號)第一天開;查「誰砍的」01、12audit log
GuardDuty威脅偵測RegionEventBridge一行開,每週有人看12Falco
Budgets預算告警:實際 80%、預測 100%帳號SNS第一天設;帳單跳是被入侵的第一個訊號11Kubecost
Cost Explorer帳單分析,按服務、按標籤分帳號成本分配標籤帳單跳了要找是哪一行11Kubecost / OpenCost 的分攤報表
Service Quotas每個服務的配額,分可調和不可調帳號 → Region—壓測前查;Fargate 6 vCPU、ALB 100 target group03、04、09—

四、怎麼用這張圖

看架構圖的時候:先找 VPC 的邊界,再找 subnet 是 public 還是 private,再問每個方塊的 ENI 掛了哪個 SG。三步之後那張圖就會說話。

出事的時候:從症狀找篇——連不上是 02、擴容慢是 04、連線爆是 06、拉不到秘密是 08、帳單跳是 11。每篇底下的「不算 / 算」表告訴你做到哪裡算解決。

要做一件事的時候:走情境線——「第三方要固定 IP」「要接金流」「流量翻十倍」各一條路徑,經過哪些元件、每個節點的決策點。第一條 流量翻十倍 已經寫好,其餘還在寫;入口在 系列目錄。

從 K8s 過來的時候:把這張歸屬樹跟你心裡那張 Pod / Namespace / Cluster 的圖並排。最大的不同有三個——SG 綁網卡不綁標籤、沒有 namespace 所以隔離往上搬到帳號、沒有 ClusterIP 所以服務發現要另外做。其他都對得上。

相關文章


架構圖上每一個方塊,先問三件事:它在什麼裡面、綁在什麼上、誰能連到它。答得出來,圖就看懂了。