iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
DevOps

30 天帶你實戰 LLMOps:從 RAG 到觀測與部署系列 第 28

Day28 - RAG FAQ Chatbot 實戰案例 II:Cloudflare + AWS 低成本架構與完整試算

  • 分享至 

  • xImage
  •  

🔹 前言

⚠️ 提醒:這篇文章是完整的雲端環境評估記錄
內容會涵蓋成本試算、安全權衡、部署方式等細節,屬於「實務考量」的展開。本文適合「想控制雲端成本」且「熟悉 AWS/Cloudflare 基礎」的讀者。如果只是想快速驗證功能,直接用 Vercel/Zeabur 更快。如果是雲端新手,建議先熟悉基礎後再閱讀。

既然這個系列放在 DevOps 分類,沒有搬到公有雲感覺就少了那一味 🥳。

所以把功能在本機跑通(Day27)後,今天我們會進入最容易「燒錢」也最常被忽略的環節:雲端環境評估。我會用最小可行(但安全)的方式,把 Demo 架構搬到雲上:

  • 計算 EC2/Redis/S3 等 AWS 成本、用 Cloudflare(Access + Worker + Tunnel) 做邊緣驗證與反向代理
  • 搭配 GitHub Actions 部署與 Grafana Cloud 監控。
  • 是把「認證、限流、CORS」前移到 Edge,大幅簡化基礎建設、壓低總持有成本,同時保留未來切換到 ALB/WAF 的升級路徑。

今天的內容會是架構評估與成本試算,明天(Day29)則是實際部署以及處理入口安全性。

本文所有價格以 2025/09–10 的官方定價為準,文末會標註我的假設與取捨。

https://ithelp.ithome.com.tw/upload/images/20251012/20120069p9nxZBKC63.png
系統架構圖(System Architecture Diagram)

🔹 費用/成本評估

在上生產線實戰環節,我會分成五個表格來羅列可能會花費的成本,分別是:AWS、Cloudflare、GitHub、Grafana Cloud 以及 OpenAI。這份表格的有效性建立在 2025 年 9 ~10月的期間,如果後續有人看到這篇文章與實際上的價目表有出入,請自行查找官方文件,以免造成費用損失。

我是部署在東京區域,以東京區域(ap-northeast-1)為準,通常北美區域的定價會是最便宜的。我這個 AWS 帳號是在 2025 年 8 月辦的,所以只有 6 個月 Free Tier / $100 Credits 可以折抵。

☁️ AWS

服務 是否有 Free Tier / 免費額度 以 RAG-FAQ-BOT 實際部署上去是否計費 備註
EC2(t4g.medium) 有 Free Tier(t4g.small),但不符合本案實際需求 💰 約 $0.0432 / 小時(東京區,Linux/按需) 2 vCPU、4 GiB RAM。適合跑 FastAPI / Python 應用,比 Free Tier 涵蓋的 t4g.small(2 GiB RAM)更穩定。若長時間執行建議搭配 Budgets 設警示。(Amazon Web Services, Inc.)
EBS(根磁碟) 30 GB 儲存 + 200 萬 I/O + 1 GB Snapshot 💰 約 $1.44 / 月(若帳號仍在 Free Tier 期間則 $0,但不在 Free Tier 的 EC2 則不會套用) 東京區 gp3 約 $0.096/GB-month;本例 15 GB × 0.096 = $1.44。Free Tier 配額合併計算,停機仍計費;刪除才歸零。(Amazon Web Services, Inc.)
ElastiCache for Redis 僅限 2025-07-15 前註冊帳號)cache.t3.micro 750 小時 / 月(12 個月) ⚠️ 帳號 2025/08 新開 → 不適用💰 約 $0.0208 / 小時(全區域通用估算) 若在 2025-07-15 之後開戶,這項 Free Tier 不一定提供。(Amazon Web Services, Inc.)
CloudWatch Metrics 免費層(多數 AWS 服務的基本指標免費) ✅ 多數情況免費,AWS 服務自帶的 metrics 是免費的 付費多集中在自訂 metrics。(Amazon Web Services, Inc.)
SSM Parameter Store(標準) Always Free(標準參數、不啟用進階) ✅ 免費 可存純文字與 KMS 加密參數;常用於取代 Secrets Manager。〔官方定價頁未集中列本項免費額度,屬 Always Free 類型〕
Secrets Manager 無 Free Tier 💰 $0.40 / secret / 月 + $0.05 / 1k API calls 若要省錢可改存 Parameter Store(自行管理 rotation)。〔官方定價頁〕
S3 5 GB 標準儲存(12 個月) ✅ 免費⚠️ 超出才收費 存 FAISS index 通常很小。〔AWS Free Tier 總覽頁〕💡S3 傳回 EC2:同區域免費;若 EC2 取 S3 檔案不會收費。
AWS Budgets Budgets 本身免費;含動作的 Budgets 前 2 個免費 ✅ 免費 建議設超額/Free Tier 用量警示。(Amazon Web Services, Inc.)
VPC 單純 VPC + Subnet + Route Table 幾乎是 0 元。⚠️ Free Tier 的 EIP(Elastic IP):若綁定並持續使用在一台執行中的 EC2 上,免費;但如果 沒綁定 / 綁定但 EC2 沒跑,就會收 $0.005/hr。 💰 $0.005 IP/hr,約 $3.65/每 IP・每月 以 730 小時計(EC2 需要綁定 Public IP 才能出網) 同一 AZ 內:免費跨 AZ:有流量費(目前大約 $0.01/GB)。
EC2 Egress 無 Free Tier 以東京區 (ap-northeast-1) 來看:✅ 前 1GB/月免費💰 1GB 之後:$0.114/GB(東京區價格,比美東貴一點) FastAPI 應用在 EC2 上回應 Cloudflare Worker 的請求,那些回應流量(HTML/JSON 給外部用戶)全部算 出網費

🌐 Cloudflare

類別 Free 計畫內容 以 RAG-FAQ-BOT實際部署上去是否計費 備註
Workers 100,000 requests / 日(每日 00:00 UTC 重置) ✅ 免費 超過即失敗或需升級;程式裡面 Error Handler 可選「fail open / fail closed」。(Cloudflare Docs)
Pages 每月 500 次 build(Free) ✅ 免費 Pages Functions 的請求會算進 Workers 配額。(Cloudflare Docs)
Zero Trust / Access 免費(適合 ≤ 50 使用者) ✅ 免費 設定 Access 規則時務必選 Service Auth(避免被導到使用者登入流程)。(Cloudflare)
Tunnel(cloudflared) 用於反向代理到內部服務 ✅ 免費(我甚至沒買域名) 建議正式使用 Named Tunnel + 自網域;Quick Tunnel 僅適合開發。〔官方建議方向〕

🐱 GitHub

項目 Free / 內含額度(Private Repo) 以 RAG-FAQ-BOT實際部署上去是否計費 備註
Actions(GitHub-hosted runners) 2,000 分鐘 / 月(Linux runner 計 1 倍;Windows ×2;macOS ×10) + 500 MB Artifacts 儲存 ✅ 免費 超過配額後依 runner 類型計價。公有 repo 無限免費;Private Repo 會消耗這 2,000 分鐘額度。自託管 runner 不吃分鐘數。(GitHub Docs)
GHCR(Container Registry) 500 MB 儲存(包含 Packages / Container Registry) ✅ 免費 公有 repo 套件免收費;Private Repo 則包含在免費 500 MB 儲存配額內,超過會依用量收費。官方文件同時提醒,單一 layer 上限 10 GB 與頻寬限制仍適用。(GitHub Docs)

📊 Grafana Cloud

項目 Free / 內含額度 以 RAG-FAQ-BOT實際部署上去是否計費 備註
Metrics 10,000 active series14 天保留期 ✅ 免費 足夠 Demo 使用;超出需升級付費方案。
Users / Teams 3 個使用者 ✅ 免費 Free Plan 最多 3 人;協作時若人數更多需升級。
Dashboards 無特別限制 ✅ 免費 主要受限於 active series / 保留期。
Integrations 包含多數常見 Cloud / App 整合(AWS、Prometheus Remote Write 等) ✅ 免費 Demo 常見需求足夠。

🧠 OpenAI

項目 免費額度 以 RAG-FAQ-BOT實際部署上去是否計費 備註
OpenAI API 無一般性 Free Tier 💰依 token 計費 例如 gpt-4o-mini$0.15 / 1M input$0.60 / 1M output(作為成本估算基準);實際以定價頁為準。(OpenAI)

💰 總成本評估:

AWS:

項目 單價 / 假設 預估月費 (USD)
EC2 t4g.medium $0.0432/hr × 720h ≈ $24.2/月 $31.104
EBS 根磁碟(gp3 15 GB) $0.096/GB-month × 15 GB ≈ $1.44/月 $1.44
ElastiCache Redis (cache.t3.micro) $0.0208/hr × 720h ≈ $15/月 $15.0
CloudWatch Metrics 只用內建(免費) $0
SSM Parameter Store (標準) Always Free $0
Secrets Manager $0.40/secret-月;假設 2–3 個 secret = $0.8–1.2 $0.8 ~ $1.2
S3 5 GB Free Tier;索引很小 → $0 $0
VPC / EIP $0.005 IP/hr * 720h = 3.6 $3.6
EC2 出網流量 (Egress) 前 100 GB 免費;超過 $0.12/GB 0(≤100GB) ~ $12(200GB)

OpneAI :

查詢量 / 月 Token 數 (平均 1k/query) 成本估算
10k queries 約 10M tokens $7.5/月
50k queries 約 50M tokens $37.5/月
100k queries 約 100M tokens $75/月

整體合併成本(含 OpenAI Token)

場景 AWS 成本 OpenAI 成本 合計/月
極輕量 Demo(< 10k 查詢、≤100GB egress $55.72 $7.5 $63.22
中等 Demo(~50k、~200GB egress $55.72 + $12 = $67.72 $37.5 $105.22
高使用 Demo(~100k、~400GB egress $55.72 + $36 = $91.72 $75 $166.72

🔹 用 Terraform 在 AWS 建立 Infrastructure 資源

本專案使用到的 Terraform IaC 程式碼也會放在 GitHub,有興趣的讀者可以拉下來研究。

⚠️ 這邊請絕對要自己去查 Free Tier 的區域和額度!實務上建立資源都很快,很多時間都是花在事前的評估和 Infrastructure 費用計算,因為 AWS 的 Free Tier Policy 有可能會變。

EC2 能支援 gp3 的 20 GB 免費不代表可以支援 RDS 的 gp3 的 20 GB,而且有沒有獨立計入 Free Tier 也要留意。

另外還有一個容易忽視的成本就是 AWS 的網路費用,特別是 egress 出網費用以及 AZ 之間的網路流量費用。所以這個 Demo 架構會把資源都放在同一個 AZ,我們先犧牲高可用換來節省費用。

  • ✅ VPC(Default VPC)
  • ✅ Public Subnet x 1
  • ✅ Private Subnet x 2 (Required by ElastiCache)
  • ✅ Route Table + IGW(出網)
  • ✅ EC2(t4g.medium, Amazon Linux 2023, 15GB gp3)+ IAM Role + SSM
  • ✅ Security Group (EC2 / ElastiCache)
  • ✅ Secrets Manager * 2 (App / ElastiCache)
  • ✅ ElastiCache for Redis(Single AZ, Redis7.0)

https://ithelp.ithome.com.tw/upload/images/20251012/20120069QU7bhDMUGg.png
AWS Infrastructure 架構圖

建立好所有 Infra 資源之後,確認一下 ec2 instance 能夠順利連線到 RDS Instance 以及 ElastiCache Instance。順便把 Budgets 設定好,不然哪天設定錯誤帳單下來會哭 🫠

https://ithelp.ithome.com.tw/upload/images/20251012/20120069wp6M8ZJECn.png
AWS Budgets Dashboard

🔹 簡單撰寫後端 API,並搞定 GitHub CI/CD

Infra 資源都建立好之後,接下來的工作就是撰寫簡單的後端 API。

如果要串 GitHub CI/CD 這邊要先做幾件事情:

  • 建立 GitHub OIDC Provider
  • 一個專用的 部署 IAM Role : 限制 repo/分支可以 AssumeRole
  • 最小必要權限:ssm:SendCommandssm:List*ec2:DescribeInstances
  • 輸出 deploy_role_arn:放在 Actions Secrets 的 AWS_ROLE_TO_ASSUME
  • 因為 GHCRprivate 的關係,稍後會需要在 Secrets Manager 存一把 PAT(read:packages)
  • 確保 EC2Instance Role 可以讀到上面的 Secret
  • 申請 GitHub PAT(classic),並且填入上面建置好的 secret

https://ithelp.ithome.com.tw/upload/images/20251012/20120069Qc2wprYeEB.png

接下來確認一下能夠把後端程式碼打包以及推到 ghcr.io,目前結構長這樣,要透過 GitHub Workflow 打包推送 :

.
├── README.md
├── backend
│   ├── Dockerfile
│   ├── app
│   │   └── main.py
│   └── requirements.txt
└── frontend
└── index.html

https://ithelp.ithome.com.tw/upload/images/20251012/20120069S9TQSat0uG.png
第一次打包會比較久是正常的

接下來要把打包好的 Image 部署到 EC2 上面,我們要先把以下值存到 GitHub RepoRepository Secrets:

  • AWS_ROLE_TO_ASSUME(gha-deploy-ssm 的 Role ARN)
  • EC2_INSTANCE_ID(EC2 ID)
  • GHCR_SECRET_ARN(Secrets Manager 裡存 PAT 的 ARN)

寫好部署腳本和 GitHub Workflow 之後,可以在 deploy 的 logs console 看到:

https://ithelp.ithome.com.tw/upload/images/20251012/20120069Ol3VBRDiwF.png

連線到 EC2 後驗證容器確實有起來:

sh-5.2$ sudo docker ps
CONTAINER ID   IMAGE                                  COMMAND                  CREATED          STATUS          PORTS                                   NAMES
6a8d07544a34   ghcr.io/hazel-shen/rag-qa-bot:latest   "uvicorn app.main:ap…"   14 minutes ago   Up 14 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   rag-qa-bot
sh-5.2$ curl -i localhost:8080
HTTP/1.1 200 OK
date: Sat, 20 Sep 2025 09:11:27 GMT
server: uvicorn
content-length: 35
content-type: application/json

{"message":"hello from rag-qa-bot"}

🔹 使用 Cloudflare 實作前端頁面入口認證加流量限制

如果是一般的 Demo 情況的話,當然可以自己實作認證的功能。但是實務上在後端加上這些邏輯不但會拉長交付時程,這些功能也不是專案的核心價值,所以我選擇外包給 Cloudflare。

認證這種高風險的基礎建設,如果自己實作不但容易出漏洞,交給 Cloudflare Access / Zero Trust,可以直接用 SSO、多因子驗證、細緻存取策略,安全性與合規水準都比自建高,重點是Cloudflare 免費方案真的有夠佛。

https://ithelp.ithome.com.tw/upload/images/20251012/20120069fb4sPlgMfI.png
Cloudflare Zero Trust 架構圖

這邊用一張表格說明上面架構圖的元件之間的關係,以及使用到的功能:

層級 範例域名 / 元件 對外狀態 保護方式
前端 (Cloudflare Pages) https://yourdomain.comhttps://project.pages.dev 🔐 公開但受保護:需 Cloudflare Access(GitHub Login) 後才可瀏覽 - Cloudflare Access(Login 規則)-(可選)限制只允許自家網域的 Origin/Referrer-Policy
Pages Functions https://project.pages.dev/api/* 🔐 受保護:與 Pages 同一組 Access - 同上(Access)- 注意:Functions 的請求會計入 Workers 配額
Worker (API Proxy) https://api.yourdomain.comhttps://api-proxy.<sub>.workers.dev 🔐 受保護:Cloudflare Access(Service Auth) 後才可呼叫 - Access(Service Token,規則置頂)- CORS 白名單(僅允許 Pages 網域)- Rate Limiting(身分/路由/租戶級)- HMAC/Nonce 驗簽、轉發時加 X-From-Worker
Tunnel 子網域(內部 API) Quick Tunnel:https://*.trycloudflare.com(開發)Named Tunnel:https://api-internal.yourdomain.com(正式) 開發:⚠️ 實務上是可被探測(隨機但對外公開)正式:🔐 僅 Worker 可用(不對外) - 正式環境:Named Tunnel + 自網域- 後端強制驗 X-From-Worker 或 mTLS(Authenticated Origin Pulls)- 不建議公開對外 DNS;若保留,需再疊 Access/WAF
EC2 後端服務 http://localhost:8080(VPC 內) 🔒 不公開:僅 cloudflared 連入 - SG不開任何入站- 僅 loopback/本機服務- 中介層驗 X-From-Worker(或 HMAC)才處理

先部署Day7 的範例前端頁面到 Cloudflare Page 上面,可以選擇匯入現有 Git:

https://ithelp.ithome.com.tw/upload/images/20251012/20120069Q5V2lMQ7Ge.png
部署完成,點開域名就可以查看頁面,要注意這邊的域名是 對外公開 的。
https://ithelp.ithome.com.tw/upload/images/20251012/201200696md6uLbT0P.png

先拿 Day7 的 Demo 頁面來部署,結果如下:
https://ithelp.ithome.com.tw/upload/images/20251012/20120069ydOX4ltQWL.png

🔑 用 Cloudflare Zero Trust 實作網頁認證

在這邊我們會需要用到 GitHub APP 作為 Cloudflare 認證的媒介:

https://ithelp.ithome.com.tw/upload/images/20251012/20120069B0eagclGRo.png

設定好了之後可以在 Cloudflare 端測試是否串接成功:

https://ithelp.ithome.com.tw/upload/images/20251012/20120069V3c4tmwi7X.png

https://ithelp.ithome.com.tw/upload/images/20251012/20120069Onz9mhrLzK.png

如果不是設定條件的帳號就會登入失敗,這邊在條件設定遇到了神秘的情況,貌似只用 email 會連自己也無法登入:

https://ithelp.ithome.com.tw/upload/images/20251012/201200691WyPr5Kebk.png

解法,把 GitHub username 寫上去包含條件:
https://ithelp.ithome.com.tw/upload/images/20251012/20120069RSirULkxmz.png

後來這個設定也可以...? 總之後面有成功。
https://ithelp.ithome.com.tw/upload/images/20251012/20120069jU5cRAeMnu.png

🔹 建立 Cloudflare Worker 作為後端 API 反向代理

在前端 Cloudflare Pages 與後端 EC2 / Container Service 之間,我們不直接暴露後端,而是透過 Cloudflare Worker 做一層反向代理(Reverse Proxy)。這樣可以:

  • ✅ 統一流量入口,讓 API 與前端在同一網域下工作
  • ✅ 加上安全控管(CORS、Header 驗證、Access 驗證)
  • ✅ 利用 Cloudflare Edge 的低延遲節點,提升體驗

為了保護我們的後端 API,會限制來源 Domain 為 https://${你的專案名字}.pages.dev 才能存取這個 URL,所以直接 curl 會得到以下結果:

❯ curl -i https://api-proxy.XXXX.workers.dev/
HTTP/2 403
...
...
...
Forbidden: invalid caller%

但是只靠 CORS 並沒有辦法防止有心人士偽造來源並存取,且 DoS / DDoS 等暴力攻擊仍然會消耗每天十萬次的免費 quota。那要如何兼顧免費又安全的需求呢?

🤝 Cloudflare Access 仍然是你最好的朋友(本文並沒有收到任何廠商贊助)

Cloudflare Access (Zero Trust) 可以在 Worker 入口 就攔截非法請求,沒帶對的 Service Token / Identity 就直接擋掉。不只可以擋掉偽造 Origin,連「根本不應該存在的請求」也不會進到 Worker。

https://ithelp.ithome.com.tw/upload/images/20251012/20120069A8ymN0g1L8.png

⚠️ 此處有坑,等等會講這張圖的坑在哪...

https://ithelp.ithome.com.tw/upload/images/20251012/20120069EQXMzPzlrB.png

加上 Access 之後就沒有辦法直接存取 reverse proxy 的域名了。

https://ithelp.ithome.com.tw/upload/images/20251012/20120069rpK6bnRTAD.png

就是這裡 🔥
請千萬要選 Service Auth,不然你會一直卡在上面人類用的 302 轉導頁面,Cloudflare 會以為你是人類要登入。

https://ithelp.ithome.com.tw/upload/images/20251012/20120069tOnhimqIi2.png

官方文件這裡有寫:You can now configure your Access applications and device enrollment permissions to accept this service token. Make sure to set the policy action to Service Auth; otherwise, Access will prompt for an identity provider login.

Response 出現 200 就是過了。

❯ curl -i -s -o -L /dev/null -w '%{http_code} %{redirect_url}\n' \
  https://api-proxy.8qrsvmh9rs.workers.dev/ping \
  -H "CF-Access-Client-Id: $CF_ACCESS_CLIENT_ID" \
  -H "CF-Access-Client-Secret: $CF_ACCESS_CLIENT_SECRET" \
  -H "x-from-pages: $PAGES_SECRET"
...
...
...
{"ok":true,"time":"2025-09-20T13:23:28.757Z","worker":true}200

Tips:

  1. Access 規則有順序,請把「Service Auth」放在最上面,避免被後面的 Login 規則覆蓋。
  2. Worker 代理到後端前,先刪掉外部來的機敏 Header(如 Authorization、Cookie),只保留你要轉發的簽章或 Service Token。

到這邊比較細心的讀者可能會想說,那假設有人剛好猜中 Service Token,或是有使用者行為比較奇特,會一直拿正確的 Service Token 重複嘗試存取 Worker 的話,我要怎麼做?

明天(Day29)在實際部署的文章中,會示範如何在 Cloudflare Pages Function 實作認證以及 Rate Limit 功能。就算是內部人員,也要防止他們的應用程式亂打(筆者親身經驗😃)。

🔹 建立 Cloudflare Tunnel,打通 EC2 以及 Cloudflare Worker

首先我們要先建立一條開發通道,連上 EC2 之後安裝 .rpm 套件:

curl -LO https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-aarch64.rpm
sudo yum install -y ./cloudflared-linux-aarch64.rpm

# 打開開發通道,Cloudflare 會給你一個臨時網址
cloudflared tunnel --url http://localhost:8080

在沒有自己的網域時,可以暫時維持 Workers 的 *.workers.dev 作為固定入口,讓外部世界始終透過同一個網址存取。實作方式是把 Quick Tunnel 隨機產生的 URL 放到 Worker 的 Secret(例如 BACKEND_ORIGIN),並在每次重啟 cloudflared 後自動更新 Secret、重新 deploy Worker,如此外界只需使用固定的 https://your-worker.xxx.workers.dev

⚠️ 不過,這種方式只是不花錢的權宜(Demo)之計

  • Quick Tunnel 本身的網址並不穩定,每次重啟都會更換。
  • 後端 Quick Tunnel 若外洩,仍可能被繞過 Worker 直接存取。
  • 官方定位 Quick Tunnel 只適合測試,不建議用於正式環境。

正式上線方案仍應該使用 Named Tunnel + 綁定自己的網域,並加上 Cloudflare Access / WAF / Rate Limit 等機制,才能確保連線的穩定性與安全性。

https://ithelp.ithome.com.tw/upload/images/20251012/20120069eYutJpN8co.png
正式 / Demo 風險比較

🔹 推送測試的 Metrics 到 Grafana Cloud 上

如果是以省錢為目標的話,自然是花錢的基礎建設能夠不要自建就不要自建。剛好之前有看到 Grafana Cloud 有一些錢包友善的 Free Plan 給獨立開發者,索性直接拿來用。

登入 Grafana Cloud Portal

https://ithelp.ithome.com.tw/upload/images/20251012/20120069vKLbohUbwz.png

不知道為什麼網站上面產生的範例呼叫會有 400 Error,改寫了一下,然後傳送測試 metrics:

# 1) 產生奈秒時間(任何環境都可)
TIME_NANO=$(python3 - <<'PY'
import time; print(int(time.time()*1_000_000_000))
PY
)
echo "timeUnixNano=$TIME_NANO"

# 2) 建 payload(注意 asInt 是數字,timeUnixNano 也是數字,沒有引號)
cat > payload.json <<EOF
{
  "resourceMetrics": [{
    "resource": { "attributes": [
      { "key": "service.name", "value": { "stringValue": "curl-demo" } }
    ]},
    "scopeMetrics": [{
      "scope": { "name": "manual" },
      "metrics": [{
        "name": "test_metric",
        "unit": "s",
        "gauge": { "dataPoints": [{
          "timeUnixNano": $TIME_NANO,
          "asInt": 1,
          "attributes": [
            { "key": "bar_label", "value": { "stringValue": "abc" } }
          ]
        }]}
      }]
    }]
  }]
}
EOF

# 3) 送出 Request
curl -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${Grafana 給你的 instance ID}:${你的 API Token}" \
  --data-binary @payload.json \
  https://${Grafana 給你的 endpoint}}$/otlp/v1/metrics

在 Grafana Cloud Console 上面看到測試資料了 🎉

https://ithelp.ithome.com.tw/upload/images/20251012/201200696rpSkINtFV.png

如果 API Token 沒有存到的話,可以回到一開始的 Console 頁面找 Access Policies:

https://ithelp.ithome.com.tw/upload/images/20251012/20120069eGpXV5HPHR.png

或是可以在 Grafana Cloud Console 找下面這個子頁面,也可以看到一樣的東西:

Home > Administration > Users and access > Cloud access policies

🔹 選型考量以及釋疑

專案的擴展性和 Log 會留待本系列最後一天(Day30)回覆。

🤔 為什麼不選擇 AWS + WAF?

從上面的架構圖來看,不難發現我的實作其實是使用 Cloudflare (Worker + Access + Rate Limit)
去模擬 ALB (反向代理) + WAF (規則/限流) + Cognito/OIDC (驗證)

以下從 成本、延遲、架構 三個面向說明我在模擬雲端生產環境時的取捨:

💰 成本

ALB 光是「開著不用(流量都還沒進來)」就有固定費(約 $20/月等級),再加上 WAF 基本費,每月硬成本大概 $25–$40。用 Cloudflare 實作,在流量不大時幾乎沒有固定費,能把 TCO(總持有成本,Total Cost of Ownership) 壓到很低。

服務 定價模式 預估月費 (低流量 Demo) 備註
ALB (Application Load Balancer) 固定時費:$0.0272/hrLCU:$0.008/LCU-hr $19.6 (固定費用) + $5~10 (LCU,取決於流量/新連線/規則數) LCU 包含:新連線數、活躍連線數、處理的規則數、流量。即使流量小,固定費用跑不掉。
WAF v2 $5 / WCU / 月$1 / rule / 月 $5–10 起 例如:1 個 WebACL (5 WCU) + 幾條規則 (3–5 條),就要 $8–10/月。流量大會再算 request 費用。
Cognito (OIDC/OAuth2 驗證) MAU (Monthly Active User) 計價:前 50k user 免費 0 如果只是內部 demo,幾十個帳號基本免費。企業大流量才開始收費。

⚡ 延遲

把驗證/限流前移到 Edge,能就近終止 TLS 與擋壞流量;有效請求雖多了極薄的邊緣處理開銷,但整體體感更快、更穩。

路徑 連線段 典型影響
直連 ALB 使用者→東京 ALB 單段往返;少一跳、理論上最短
Cloudflare(Pages/Worker/Access)→ EC2 使用者→最近邊緣 →(邊緣長連)→ 東京 EC2 邊緣終止 TLS/驗簽/快取;有效請求多 +5~15ms無效請求在邊緣就被丟棄,不進 AWS。
Cloudflare Tunnel 邊緣→EC2 走 tunnel 和直連來源相比,通常再 +數毫秒~十餘毫秒;但保持長連線、HTTP/2/壓縮,可抵銷一部分。

註:AWS WAF 綁在 ALB,能在 ALB 就擋下,不會到 EC2,但已進到 AWS 區域與 ALB

🏗️ 架構

跟認證有關的設定全部都用 worker 在 Edge 處理掉、前端與 API 同域治理,可以讓環境配置更單純一些:

面向 Cloudflare Edge(Pages + Worker + Access) AWS ALB + WAF + Cognito(傳統)
域名/SSL Pages 與 API Worker 同域,一份 SSL 前後端分域:ALB + ACM + Route53,多處配置
CORS/Headers 於 Worker 統一處理,前端/API 一致 ALB 與後端各自配置,規則重複,易錯
基建複雜度 單一控制點(Edge),配置少 三套服務協作(ALB + WAF + Cognito)

🤔 為什麼選擇 Secret Manger?

主要原因是因為筆者個人習慣用 Secret Manager,差異如下表,有版本 Stage 功能的話可以防止 Secret 更新後 App 直接連不到 DB 之類的連線中斷問題。如果是 Demo 之類的想極致省錢其實用 Parameter Store 也可以用。

功能 Parameter Store (SecureString) Secrets Manager
加密 ✅ KMS ✅ KMS
IAM 控制
CloudTrail 紀錄
Rotation(自動換密碼) ❌ 自己寫 ✅ 內建 RDS/Aurora、自訂 Lambda
版本 Stage (AWSCURRENT / AWSPREVIOUS) ❌ 沒有 ✅ 有
定位 泛用參數抽屜 專門密碼保險箱

Parameter Store vs Secret Manager

OpenAI 幫忙畫了一張圖(?)

https://ithelp.ithome.com.tw/upload/images/20251012/20120069oYr5lRoBCL.png

🔹 小結

今天做了三件事,把「能跑」推進到「能上雲」:

  1. 盤點成本:AWS/Cloudflare/GitHub/Grafana/OpenAI 的花費,圈出最小產線 Demo 的月費範圍。
  2. 前移安全:用 Cloudflare Edge(Access+Worker+Rate Limit)取代自建認證/WAF/反向代理,在邊緣先擋壞流量。
  3. 收斂架構:交付可重複使用的 最小生產化架構(同域控管、SSM 管理、指標上拋 Grafana),並保留未來切換 ALB/WAF 的升級路徑。

這篇不是「怎麼跑起來」,而是「怎麼花小錢、保留升級路徑地跑起來」。
如果想讓 Demo 更接近生產水準,Day28 就是那第一道上雲門檻。

明天(Day29) 會把 Day27 的後端透過 GitHub CI/CD 搬上 EC2,補上自動化與安全細節。

📚 引用來源文章

AWS(費用與政策)

Cloudflare(Workers / Pages / Zero Trust / Tunnel)

GitHub(Actions / GHCR)

Grafana Cloud(免費方案)

OpenAI(模型單價)


上一篇
Day27 - RAG FAQ Chatbot 實戰案例 I:功能驗收全紀錄(檢索 × 快取 × 安全 × 監控)
系列文
30 天帶你實戰 LLMOps:從 RAG 到觀測與部署28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言