BeautifulSoup 從 OWASP 官網提取非結構化數據。/data)還是在 GCP(存入 GCS)。-platform linux/amd64:解決 M-series 晶片與雲端伺服器之間的架構相容性問題。Cloud run可分為 service與job, 還有function
service可以當作一個持續的服務像是一個網站 像我們的bff就是此類
job則是被一次性觸發的任務 像是爬蟲, 通常會手動或是定期的安排觸發, 而且他的超時限制極長(timeout, 可以到24小時)很適合處理大量數據
function則是被事件驅動的任務, 好比說上傳圖片後會進行標準化, 縮圖, 以及自動下標籤這種因為有圖片新增而驅動的任務
還有需要考量的是gcs的費用 gcs有四種存放的class: standard, nearline, coldline, archive
由前到後是熱到冷 有存放就會收費, 由熱到冷收費也是越便宜, 需考量資料的使用頻率
gcs和其他家服務不同的是 不同class讀取速度並沒有差異, 不過需注意提取費用與早刪費
(幣別為美金)
而早刪費則是說 檔案會收取的存取費用 不同class有不同的最小收費時間
standard是沒有minimum, nearline是30天, coldline是90天 archive是一年
也就是如果我存入一個archive檔案 但我隔天就刪掉, 還是需要支付一年的存放費用
以下列出GCS需要考慮的操作費用
1. 儲存費 (Storage Price) —— 「租金」
這是最主要的費用。只要資料存在裡面,不論你有沒有去讀它,都要付錢。
• 計算方式:按 GB/月 計費。
• 你的情況:假設你的 OWASP 爬蟲抓了 100MB 的文字檔存進去。
◦ 標準儲存 (Standard Storage) 在台灣區域大約是 0.023 USD / GB。
◦ $0.1 \text{GB} \times 0.023 \approx 0.0023 \text{USD}$(大約 台幣 0.07 元)。
◦ 沒錯,這就是為什麼我說它非常便宜。
2. 操作費 (Operations) —— 「搬運工費」
當你對 GCS 進行「動作」時產生的費用。
• Class A 操作:新增、覆寫、列出檔案(例如:爬蟲存入資料)。
• Class B 操作:讀取檔案(例如:BFF 讀取資料)。
• 費用:通常是每 10,000 次操作收幾塊錢台幣。除非你的爬蟲每秒鐘都在存幾萬個小檔案,否則這部分幾乎是免費的。
3. 流量費 (Network Egress) —— 「出關費」
這部分是你最需要注意的 「陷阱」:
• 同一區域內 (Free):如果你的 Cloud Run (BFF) 和 GCS 都在同一個區域(例如 asia-east1 台灣),互相讀取資料是 $0$ 元。
• 跨區域或出公網:如果你從家裡的電腦把 GCS 裡的 10GB 影片抓下來,這就會產生流量費。
4. 檢索與早刪費 (Retrieval & Early Deletion) —— 「違約金」
如果你為了省錢選擇了「冷儲存 (Coldline/Archive)」,但你卻頻繁讀取它,或者存不到 30 天就刪掉,Google 會收額外的費用。
• 建議:開發階段一律用 Standard Storage,最彈性且沒有隱藏雜費。
爬蟲
我們除了會去owasp爬資料外 還會進行分類處理留下metadata, 方便向量化與分片
category 是 A01。.txt。建議存成 JSONL (JSON Lines) 或 JSON。本日實作
在repo中新增 /crawler 資料夾
裡面會新增爬蟲和打包的腳本 檔案有點多 就參照repo中的資料夾吧
main.py會執行對owasp top10/2025的內容進行內容爬蟲
README中有 在local設定python環境, 在local觸發爬蟲進行測試
以及在local打包爬蟲image上傳到gcr的命令
記得指令都要在cd到crawler後執行

如果設定好 執行打包 gcloud builds submit --tag gcr.io/chat-bot-484615/bank-crawler:latest
(這個指令會打包原始碼成為一個壓縮檔傳給gcp, 會啟動暫時的vm, 使用dockerfile打包成image 存入gcr)
好了之後應該可以在registery看到

另外在 /terraform 中新增 crawler.tf
# (Bucket 已經在 database.tf 中的 excel_storage 定義了,不需要重複建立)
# 2. 定義 Cloud Run Job
resource "google_cloud_run_v2_job" "crawler_job" {
name = "bank-crawler-job"
location = "asia-east1"
template {
template {
# 連結我們建立的 Service Account (具有存取 GCS 的權限)
service_account = google_service_account.chatbot_bff_sa.email
# 重要:加入 VPC Connector,否則爬蟲不會透過 NAT 使用固定 IP 出外網
vpc_access {
connector = google_vpc_access_connector.main_connector.id
egress = "ALL_TRAFFIC" # 強制對外網路也走 VPC 隧道
}
containers {
image = "gcr.io/chat-bot-484615/bank-crawler:latest" # 使用我們剛打包的 Image
env {
name = "GCS_BUCKET_NAME"
value = google_storage_bucket.excel_storage.name # 使用 database.tf 中的 bucket
}
resources {
limits = {
cpu = "1"
memory = "512Mi"
}
}
}
# 設定執行超時 (爬蟲通常很快,5分鐘綽綽有餘)
timeout = "300s"
}
}
}
這邊我們會assign之前的service account與vpc access給爬蟲
並且指定打包後的image, 和用來觸發他的cloud run job
注意這邊有兩層template, 第一層是執行階段 第二層是容器層級與存取設定
執行 terraform plan , terraform apply 應該可以把cloud run job新增上gcp
此時我們就可以在cloud run jobs中看到job

點進新增的job 執行 execute

job會執行一陣子

如果執行失敗 點進去log看看訊息 問問gemini (像我第一次是這個job沒有存取gcs bucket權限)

job完成後去cloud storage > buckets看看

這裡就可以看到爬回來的資料
應該和local爬到結果一樣, 也可以下載來看 不過下載就是有小量讀取費