# AWS 相關

# 【AWS】Day 2：AWS 的基本知識

# Day 2：AWS 的基本知識

上一篇文章我們大致介紹了什麼是雲端服務，並且認識了幾個主流的雲端服務商，像是 AWS、GCP、Azure……等等。

這篇文章則會來介紹 AWS（Amazon Web Services）裡面的一些基本概念，包括：

- AWS 的 Region 和 Availability Zone（簡稱 AZ）
- AWS 上的資源範圍（Region、AZ、Global）
- 管理 AWS 資源的方法有哪些

---

## Region 和 Availability Zone 是什麼？

AWS 和 GCP 一樣，也使用了類似的概念來區分地理區域，他們稱作：

- **Region（區域）**
- **Availability Zone（可用區）**

### Region（區域）

Region 就是地理位置的概念，例如：

- 台灣最近的是 **Asia Pacific (Tokyo)**，代碼是 `ap-northeast-1`
- 新加坡是 `ap-southeast-1`
- 美國東岸的維吉尼亞北部是 `us-east-1`（也是最多 AWS 服務最早上線的 Region）

截至 2023 年，AWS 在全球已經有超過 **30 個以上的 Region**，每個 Region 都是 AWS 自建的實體資料中心群。

### Availability Zone（AZ，可用區）

每一個 Region 底下會有多個 Availability Zones（通常 2~6 個），可以想像成是一個個獨立的資料中心（不同大樓、不同電力、不同網路線路），目的是增加可靠性。

舉例來說：

- `us-east-1` 底下就有 `us-east-1a`、`us-east-1b`、`us-east-1c`……等 AZ
- `ap-southeast-1`（新加坡）底下有 `ap-southeast-1a`、`ap-southeast-1b`、`ap-southeast-1c`

AZ 是 AWS 用來實現高可用（High Availability）的基本單位。服務部署在多個 AZ，可以避免單一機房故障造成整個應用中斷。

---

## 資源範圍：Region / AZ / Global 的區分

在 AWS 上，每一種服務在建立時都有自己的作用範圍，分為三種：

### 🔹 以 AZ 為單位的服務

像是 EC2（虛擬機）、EBS（區塊儲存）就是屬於這一類。

- 在建立 EC2 時，你需要選擇一個 AZ，像是 `ap-northeast-1a`
- EBS 只能掛載在同一個 AZ 裡的 EC2
- 如果你要做高可用，就要部署在多個 AZ，並自己設計 failover 機制

### 🔸 以 Region 為單位的服務

像是 S3（物件儲存）、RDS（資料庫）、Elastic Load Balancer、VPC 網路等等，都是 Region 級別的服務。

- 在一個 Region 中建立的 S3 bucket，可以讓這個 region 內的資源共同使用
- RDS 則可以設定 Multi-AZ（跨 AZ 高可用）

### 🌐 以 Global 為單位的服務

有些服務是全域性的，例如：

- IAM（身份與權限管理）
- Route 53（DNS 服務）
- CloudFront（CDN 服務）

這些服務在建立時不會要求你選擇 Region，它們的作用範圍就是「整個 AWS 帳號或全球網路」。

---

## 管理 AWS 的四種方式

![](https://docs.aws.amazon.com/assets/images/aws-management-tools.png)

在 AWS 上，我們有四種主要方式可以操作與管理服務：

### 1. AWS Management Console（管理主控台）

透過瀏覽器進入 [https://console.aws.amazon.com](https://console.aws.amazon.com)，就可以用圖形化介面來操作各種資源。

是最簡單、最直覺的操作方式。

### 2. AWS CLI（Command Line Interface）

透過終端機安裝 CLI 工具（`aws` 指令），可以用命令列操作 AWS 的服務。

適合自動化部署、寫腳本、CI/CD 等情境。

### 3. AWS SDKs

AWS 提供多種語言的開發套件（Java, Python, Node.js, Go…等），可以直接透過程式碼呼叫 AWS API。

適合建構自動化應用或將 AWS 整合進你自己的系統。

### 4. AWS Mobile App

AWS 官方也有提供手機 App，可以用來查看服務狀態、成本、帳單、甚至手動操作某些資源。

---

## 小結

這篇文章我們介紹了 AWS 中的基本概念，包括：

- Region 和 Availability Zone 的差別
- 服務根據作用範圍可以分為 AZ 級、Region 級與 Global 級
- 常見的四種管理 AWS 的方法

理解這些概念之後，會對後續的服務操作更容易上手，也比較知道為什麼某些設定不能跨 AZ 或跨 Region。

---

那麼下一篇文章，我們就會進一步來介紹，在 AWS 中的帳號與 Project 結構（包含 Account、Organization、OU、Tagging 等觀念），幫助你理解大型團隊怎麼管理 AWS 資源。

我們下篇見啦～👋

# 【AWS】Day 3：AWS 中的帳號與資源管理架構

上一篇我們介紹了 AWS 的基本概念，包括什麼是 Region、Availability Zone，以及怎麼操作 AWS 的幾種方式。

那這篇文章，我們要來聊聊一個很多人初學 AWS 時會感到困惑的問題：**AWS 裡面的資源，到底是怎麼被組織與管理的？**

---

## 為什麼要有架構？

當你只是個人開一個帳號、開幾台機器、弄幾個服務，帳號的資源大致上不會太複雜，console 點一點都還可以處理。

但當你是企業使用者、跨部門團隊、有多個環境（dev / uat / prod）、多個專案、甚至上百個服務時，就會遇到一堆問題：

- 權限怎麼分？
- 帳單怎麼分？
- 誰能看？誰能用？
- 怎麼防止誤刪 / 誤操作？

這時候就會用到 AWS 提供的資源管理架構囉～

---

## AWS 的三層資源管理架構

在 GCP 中，我們常會提到 **Project** 的概念。但在 AWS 裡面，這樣的概念其實是被拆成以下幾層來實現的：

### 🔑 1. Account（AWS 帳號）

AWS 帳號是最基本的管理單位。每個帳號就是一個獨立的資源空間，擁有自己的：

- IAM 設定（權限、角色）
- 資源與服務（EC2、S3、RDS 等等）
- 帳單與計費紀錄

可以想像成一個帳號就是一間房間，裡面什麼資源你都自己負責。

👉 很多企業會用多帳號來隔離環境，例如：

- 一個帳號放開發環境（dev）
- 一個帳號放測試環境（uat）
- 一個帳號放生產環境（prod）

這樣的好處是資源更隔離、權限更清楚、帳單也更容易拆分。

---

### 🏢 2. AWS Organizations（組織）

AWS Organizations 是一個多帳號的管理工具，讓你可以統一控管多個 AWS 帳號，並集中管理費用與權限。

使用 Organizations 後，可以做到：

- 建立帳號之間的層級架構（像是 OU = 組織單位）
- 統一帳單（Consolidated Billing）
- 實作 SCP（Service Control Policies）來限制某些帳號能用的服務

👉 這就像是你開了一間公司，然後底下開了一堆子公司，每個子公司有自己的帳號，但你這個總部可以看所有分公司的帳單，也能下政策規定大家不能亂搞。

---

### 🏷️ 3. Resource Tag（資源標籤）

這個就是 AWS 用來補足「Project」概念的做法。

因為 AWS 沒有像 GCP 的 Project 架構，所以會建議大家在建立資源時，**養成加上標籤（Tag）的習慣**！

常見的標籤包含：

- `Project`: live-api、momo-shop、data-pipeline
- `Env`: dev、uat、prod
- `Owner`: treeman、team-data、ops-team
- `CostCenter`: 90123、IT-Backend、Marketing

透過 Tag：

- 可以更清楚知道這台機器是做什麼的
- 可以用在 **成本分析**（Cost Explorer）
- 可以配合 IAM 權限做限制（例如只能操作特定 Project 的資源）
- 還能透過工具（如 Config、Budgets）追蹤管理

---

## 小結

這篇文章我們介紹了 AWS 的資源管理架構，總結如下：

<div id="bkmrk-%E6%A6%82%E5%BF%B5%E5%90%8D%E7%A8%B1-%E5%B0%8D%E6%87%89%E7%94%A8%E9%80%94-account-%E8%B3%87%E6%BA%90"><button class="hover:bg-token-main-surface-secondary text-token-text-secondary pointer-events-auto rounded-lg px-1 py-1 opacity-0 transition-opacity duration-200 group-focus-within:opacity-100 group-hover:opacity-100"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><div><table class="min-w-full" data-end="1805" data-start="1576"><thead data-end="1620" data-start="1576"><tr data-end="1620" data-start="1576"><th data-end="1595" data-start="1576">概念名稱</th><th data-end="1620" data-start="1595">對應用途</th></tr></thead><tbody data-end="1805" data-start="1674"><tr data-end="1714" data-start="1674"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1697" data-start="1674">**Account**</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1714" data-start="1697">資源與權限的邊界、計費單位</td></tr><tr data-end="1759" data-start="1715"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1738" data-start="1715">**Organizations**</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1759" data-start="1738">多帳號統一管理架構</td></tr><tr data-end="1805" data-start="1760"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1783" data-start="1760">**Tag**</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1805" data-start="1783">資源標記，模擬 Project 分類</td></tr></tbody></table>

</div></div>其實 AWS 的架構雖然比 GCP 稍微複雜一點，但也因為彈性大，更能符合企業或大型專案的需求。

---

那麼下一篇文章，我們就正式進入 **AWS 的運算服務介紹** 啦！包括 EC2、Lambda、ECS、EKS、App Runner……每一種服務適合什麼情境、優缺點是什麼，我們下一篇文章再慢慢拆解！

我們 Day 4 再見啦 👋

# 【AWS】Day 4：AWS 運算服務簡介

# Day 4：AWS 運算服務簡介

在上一篇我們認識了 AWS 中的資源管理架構，包括 Account、Organizations、以及 Tag 的概念。

接下來我們要進入一個非常重要的主題：**AWS 的運算服務（Compute Services）**

所謂「運算服務」，指的就是你在雲端上 **執行應用程式、後端系統、作業流程** 的基礎設施，也就是「跑程式碼的地方」。

---

## AWS 運算服務的類型有哪些？

AWS 提供非常多樣化的運算服務，為了對應不同的使用情境與技術需求，主要可以分成以下幾大類：

<div id="bkmrk-%E5%88%86%E9%A1%9E-%E8%AA%AA%E6%98%8E-%E4%BB%A3%E8%A1%A8%E6%9C%8D%E5%8B%99-iaas-%E8%87%AA%E5%B7%B1%E7%AE%A1%E7%90%86"><button class="hover:bg-token-main-surface-secondary text-token-text-secondary pointer-events-auto rounded-lg px-1 py-1 opacity-0 transition-opacity duration-200 group-focus-within:opacity-100 group-hover:opacity-100"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><div><table class="min-w-full" data-end="759" data-start="328"><thead data-end="403" data-start="328"><tr data-end="403" data-start="328"><th data-end="339" data-start="328">分類</th><th data-end="382" data-start="339">說明</th><th data-end="403" data-start="382">代表服務</th></tr></thead><tbody data-end="759" data-start="488"><tr data-end="554" data-start="488"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="501" data-start="488">**IaaS**</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="533" data-start="501">自己管理作業系統、網路、防火牆</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="554" data-start="533">EC2（虛擬機）</td></tr><tr data-end="625" data-start="555"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="568" data-start="555">**PaaS**</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="600" data-start="568">自動幫你處理 OS、佈署、監控等事情</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="625" data-start="600">Elastic Beanstalk</td></tr><tr data-end="696" data-start="626"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="639" data-start="626">**FaaS**</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="671" data-start="639">無伺服器架構，只有 Function 和事件觸發</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="696" data-start="671">Lambda</td></tr><tr data-end="759" data-start="697"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="713" data-start="697">**Container**</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="736" data-start="713">使用容器技術來執行應用程式，彈性、可擴展</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="759" data-start="736">ECS、EKS、App Runner</td></tr></tbody></table>

</div></div>---

## 為什麼 AWS 有這麼多種運算方式？

因為每個團隊的需求都不同：

- 有些團隊希望像過去一樣，有主機、有 OS 可以自己裝軟體（像 EC2）
- 有些人只想部署應用，不想管基礎架構（像 App Runner、Elastic Beanstalk）
- 有些系統用事件驅動設計，希望快速反應且省錢（像 Lambda）
- 有些公司習慣使用 Docker，需要容器編排平台（像 ECS、EKS）

---

## 各服務適合的情境簡介

### EC2（Amazon Elastic Compute Cloud）

- 適合需要高度自訂的作業系統、網路、軟體安裝情境
- 就像租一台雲端主機，從頭開始建系統
- 最自由，但也最需要自己管理

### Elastic Beanstalk

- 適合快速部署 Web 應用（Java、Python、Node.js…）
- 幫你處理 load balancer、autoscaling、OS patching
- 很適合快速上線產品 MVP，但自訂空間有限

### Lambda

- 適合小型服務、事件驅動邏輯（例如上傳圖片後自動轉換）
- 沒有伺服器的概念，你只要寫 function，AWS 幫你跑
- 非常適合做 event-driven 架構、backend for frontend

### ECS / EKS / App Runner

- ECS：適合熟悉容器的團隊，整合 AWS 生態系好
- EKS：Kubernetes 愛好者的最愛，管理成本略高
- App Runner：讓你用最少設定就能跑 Docker 應用，近似 Heroku 使用體驗

---

## 如何選擇？

以下是簡單的選擇指南：

<div id="bkmrk-%E4%BD%BF%E7%94%A8%E6%83%85%E5%A2%83-%E6%8E%A8%E8%96%A6%E6%9C%8D%E5%8B%99-%E8%87%AA%E5%B7%B1%E6%8E%8C%E6%8E%A7%E4%B8%80%E5%88%87%E3%80%81%E7%94%A8%E4%B9%85%E7%BF%92"><button class="hover:bg-token-main-surface-secondary text-token-text-secondary pointer-events-auto rounded-lg px-1 py-1 opacity-0 transition-opacity duration-200 group-focus-within:opacity-100 group-hover:opacity-100"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><div><table class="min-w-full" data-end="1853" data-start="1505"><thead data-end="1551" data-start="1505"><tr data-end="1551" data-start="1505"><th data-end="1532" data-start="1505">使用情境</th><th data-end="1551" data-start="1532">推薦服務</th></tr></thead><tbody data-end="1853" data-start="1607"><tr data-end="1649" data-start="1607"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1626" data-start="1607">自己掌控一切、用久習慣了</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1649" data-start="1626">EC2</td></tr><tr data-end="1705" data-start="1650"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1671" data-start="1650">想快速部署、不管底層</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1705" data-start="1671">Elastic Beanstalk / App Runner</td></tr><tr data-end="1749" data-start="1706"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1726" data-start="1706">要做簡單的資料處理任務</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1749" data-start="1726">Lambda</td></tr><tr data-end="1800" data-start="1750"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1774" data-start="1750">已有 Docker 經驗的團隊</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1800" data-start="1774">ECS / EKS / App Runner</td></tr><tr data-end="1853" data-start="1801"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1830" data-start="1801">想玩 Kubernetes</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1853" data-start="1830">EKS</td></tr></tbody></table>

</div></div>---

## 小結

這篇文章我們簡單認識了 AWS 中的運算服務全貌，理解了不同服務的設計思路與適用場景：

- EC2 是最基礎的運算單位
- Lambda 是最極致的 serverless
- Elastic Beanstalk 與 App Runner 是簡化部署流程的幫手
- ECS / EKS 則是容器化架構的核心

---

下一篇我們將正式進入第一個 AWS 運算服務的詳細介紹 —— **EC2（虛擬主機）**，看看這個最經典、最通用的服務到底可以怎麼用。

Day 5 再見！👋

# 【AWS】Day0 AWS 系列文：從實務出發的雲端探索之旅（共 30 篇）

#### **1. AWS 簡介**

- **Day 1：認識 AWS（Amazon Web Services）**
- **Day 2：AWS 的基本知識與優勢**
- **Day 3：AWS 中的帳號、Organization 與 Project 架構（Account、OU、Tag）**

---

#### **2. AWS 中的運算服務**

- **Day 4：AWS 運算服務總覽**
- **Day 5：IaaS, PaaS, FaaS, SaaS 在 AWS 的對應與比較**
- **Day 6：EC2（虛擬機服務）**
- **Day 7：Elastic Beanstalk（簡化部署平台）**
- **Day 8：Lambda（Serverless 函式）**
- **Day 9：EKS（Elastic Kubernetes Service）**
- **Day 10：AWS App Runner &amp; ECS（Container 運行環境）**
- **Day 11：AWS 運算服務總結與選擇建議**

---

#### **3. AWS 的數據儲存服務**

- **Day 12：AWS 儲存服務總覽**
- **Day 13：S3（物件儲存服務）**
- **Day 14：RDS（關聯式資料庫）**
- **Day 15：Aurora（高效能資料庫引擎）**
- **Day 16：DynamoDB（NoSQL 資料庫）**
- **Day 17：Amazon Redshift &amp; DocumentDB &amp; ElastiCache**
- **Day 18：AWS 儲存服務總結與應用情境比較**

---

#### **4. AWS 的 API 管理服務**

- **Day 19：API 管理與整合概觀**
- **Day 20：API Gateway（全面 API 管理服務）**
- **Day 21：AppSync（GraphQL 服務）**
- **Day 22：Amazon CloudFront + Lambda@Edge（API 加速與轉換）**
- **Day 23：API 管理服務總結與實戰應用**

---

#### **5. AWS 的 Message Queue 與事件服務**

- **Day 24：SQS、SNS、EventBridge 介紹與比較**

---

#### **6. AWS 的權限與身份管理**

- **Day 25：AWS 權限系統概觀**
- **Day 26：IAM（身份與角色）**
- **Day 27：AWS Cognito &amp; IAM Identity Center（登入與使用者管理）**
- **Day 28：IAM 實作範例與最佳實踐**

---

#### **7. AWS 的帳單與費用控制**

- **Day 29：AWS 成本結構、帳單管理與費用控管（含 Cost Explorer、Budgets）**

---

#### **8. AWS 總結與應用建議**

- **Day 30：AWS 總結、常見架構與選型建議**

# 【AWS】Day 5：IaaS、PaaS、FaaS、SaaS 的差別

在進入 AWS 各項運算服務前，我們先來搞懂幾個在雲端世界中常見的術語：  
**IaaS、PaaS、FaaS、SaaS**。

這些都是「服務模型（Service Model）」的分類，代表你在使用雲端時，需要負責的事情有多少、而雲端服務商（像 AWS）又幫你負責了多少。

---

## 雲端服務模型的基本觀念

以下這張表可以幫助你快速了解四種模型的差別：

<div id="bkmrk-%E7%AE%A1%E7%90%86%E5%B0%8D%E8%B1%A1%2F%E6%A8%A1%E5%9E%8B-%E8%87%AA%E6%9E%B6%E4%B8%BB%E6%A9%9F-iaas-pa"><button class="hover:bg-token-main-surface-secondary text-token-text-secondary pointer-events-auto rounded-lg px-1 py-1 opacity-0 transition-opacity duration-200 group-focus-within:opacity-100 group-hover:opacity-100"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><div><table class="min-w-full" data-end="993" data-start="303"><thead data-end="401" data-start="303"><tr data-end="401" data-start="303"><th data-end="313" data-start="303">管理對象/模型</th><th data-end="320" data-start="313">自架主機</th><th data-end="339" data-start="320">IaaS</th><th data-end="358" data-start="339">PaaS</th><th data-end="378" data-start="358">FaaS</th><th data-end="401" data-start="378">SaaS</th></tr></thead><tbody data-end="993" data-start="512"><tr data-end="609" data-start="512"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="525" data-start="512">硬體設備</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="535" data-start="525">✅ 自己買</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="552" data-start="535">❌ AWS 提供</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="569" data-start="552">❌ AWS 提供</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="587" data-start="569">❌ AWS 提供</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="609" data-start="587">❌ AWS 提供</td></tr><tr data-end="705" data-start="610"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="623" data-start="610">作業系統</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="633" data-start="623">✅ 自己裝</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="648" data-start="633">✅ 自己裝/管理</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="665" data-start="648">❌ AWS 管理</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="683" data-start="665">❌ AWS 管理</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="705" data-start="683">❌ AWS 管理</td></tr><tr data-end="803" data-start="706"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="725" data-start="706">中介軟體（DB、Runtime）</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="734" data-start="725">✅ 自建</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="751" data-start="734">✅ 自建</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="766" data-start="751">❌ AWS 幫你配好</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="782" data-start="766">❌ AWS 幫你配好</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="803" data-start="782">❌ AWS 幫你配好</td></tr><tr data-end="898" data-start="804"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="815" data-start="804">應用程式邏輯</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="825" data-start="815">✅ 自己寫</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="842" data-start="825">✅ 自己寫</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="859" data-start="842">✅ 自己寫</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="877" data-start="859">✅ 自己寫</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="898" data-start="877">❌ 你不需要寫</td></tr><tr data-end="993" data-start="899"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="911" data-start="899">維運、監控</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="920" data-start="911">✅ 全部自己</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="936" data-start="920">✅ 自己負責</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="953" data-start="936">⚠️ 半自動</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="970" data-start="953">❌ AWS 自動處理</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="993" data-start="970">❌ AWS 處理</td></tr></tbody></table>

</div></div>---

## 各種服務模型的說明與範例

### 1️⃣ IaaS：Infrastructure as a Service（基礎設施即服務）

- 你租用虛擬機與網路，但其他都自己來
- 最大彈性、也最麻煩，需要自己維運
- 常見服務：**Amazon EC2、VPC、EBS、ELB**

適合對象：

- 有自己建系統的需求
- 對運維有經驗、需高度自訂環境
- 例：自行部署 Apache + PHP + MySQL 的網站架構

---

### 2️⃣ PaaS：Platform as a Service（平台即服務）

- AWS 幫你準備好 OS、環境、runtime，只要上傳應用程式即可
- 不用管架設，但彈性較小
- 常見服務：**Elastic Beanstalk、App Runner**

適合對象：

- 想快速上線服務，不想煩基礎建設細節
- MVP、新創、團隊快速開發部署階段

---

### 3️⃣ FaaS：Function as a Service（函數即服務）

- 只負責一段段程式碼（function），不需要啟動伺服器
- 事件觸發執行、自動擴展、極度省錢
- 常見服務：**AWS Lambda**

適合對象：

- 事件驅動架構、簡單自動任務（如圖片轉換、排程任務）
- 想實作 Serverless 架構

---

### 4️⃣ SaaS：Software as a Service（軟體即服務）

- 使用者什麼都不用管，只要「使用」就好
- 全部由供應商管理、維運、升級
- 常見服務：**Amazon WorkMail、QuickSight、Google Workspace、Slack、Notion、Zoom**

適合對象：

- 只想「用服務」，不想管任何底層系統
- 想要穩定、成熟的產品解決問題

---

## AWS 各服務分類對照表

<div id="bkmrk-%E6%A8%A1%E5%9E%8B-aws-%E5%B8%B8%E8%A6%8B%E6%9C%8D%E5%8B%99-iaas-ec2"><button class="hover:bg-token-main-surface-secondary text-token-text-secondary pointer-events-auto rounded-lg px-1 py-1 opacity-0 transition-opacity duration-200 group-focus-within:opacity-100 group-hover:opacity-100"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><div><table class="min-w-full" data-end="2093" data-start="1803"><thead data-end="1847" data-start="1803"><tr data-end="1847" data-start="1803"><th data-end="1808" data-start="1803">模型</th><th data-end="1847" data-start="1808">AWS 常見服務</th></tr></thead><tbody data-end="2093" data-start="1899"><tr data-end="1946" data-start="1899"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1906" data-start="1899">IaaS</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1946" data-start="1906">EC2、EBS、VPC、ELB</td></tr><tr data-end="1996" data-start="1947"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1954" data-start="1947">PaaS</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="1996" data-start="1954">Elastic Beanstalk、App Runner</td></tr><tr data-end="2046" data-start="1997"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2004" data-start="1997">FaaS</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2046" data-start="2004">AWS Lambda、Step Functions</td></tr><tr data-end="2093" data-start="2047"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2054" data-start="2047">SaaS</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2093" data-start="2054">WorkMail、QuickSight、Chime、Honeycode</td></tr></tbody></table>

</div></div>---

## 小結

透過這篇文章，我們理解了 IaaS、PaaS、FaaS、SaaS 的差異，並知道：

- 不同模型代表「管理責任」的差異
- 彈性 vs 管理負擔 是互相拉扯的
- 在 AWS 裡幾乎各種模型的服務都有對應可選

---

下一篇開始，我們就會進入實際的運算服務操作介紹 —— 先從最核心、最經典的 **EC2（Elastic Compute Cloud）虛擬機服務）** 開始探索！

我們 Day 6 再見～

# 【AWS】Day 6：運算服務 - Amazon EC2（虛擬機服務）

在前幾篇中，我們介紹了各種運算服務的分類方式，像是 IaaS、PaaS、FaaS 等等。

今天就從 AWS 中最經典、最基礎的 IaaS 服務開始介紹 —— **Amazon EC2（Elastic Compute Cloud）**

這個服務幾乎是所有 AWS 使用者早期接觸雲端的第一站，也是許多架構的基石。

---

## 什麼是 EC2？

EC2 就是一台 **雲端的虛擬機器（Virtual Machine）**。

可以想像成你在資料中心租了一台電腦，你可以選擇要用 Linux 還是 Windows，要幾核心、幾 GB 記憶體，要多大的硬碟，要不要固定 IP……這些你都可以自己決定。

建立 EC2 之後，就能連進去安裝軟體、跑應用、開 Web Server、跑排程、架設資料庫……什麼都行。

---

## EC2 的核心概念

### 1️⃣ Instance（執行個體）

每一台 EC2 就是一個 Instance，你可以開很多個、關掉它、重新啟動，甚至做 snapshot 備份。

### 2️⃣ AMI（Amazon Machine Image）

AMI 是一種映像檔，可以理解成 EC2 的「作業系統＋預設環境」模板。  
常見的 AMI 包含：

- Amazon Linux
- Ubuntu
- Debian
- Windows Server
- 自己製作的 AMI

### 3️⃣ Instance Type（機型）

AWS 提供各種 instance type 給你選擇，依照用途分類，例如：

<table id="bkmrk-%E9%A1%9E%E5%9E%8B%E4%BB%A3%E8%99%9F-%E7%94%A8%E9%80%94-%E4%BB%A3%E8%A1%A8%E5%9E%8B%E8%99%9F-t-%E7%B3%BB%E5%88%97-%E4%B8%80%E8%88%AC"><thead><tr><th>類型代號</th><th>用途</th><th>代表型號</th></tr></thead><tbody><tr><td>t 系列</td><td>一般型、低成本</td><td>t3.micro、t4g.nano</td></tr><tr><td>m 系列</td><td>平衡型</td><td>m6i.large</td></tr><tr><td>c 系列</td><td>計算密集型</td><td>c7g.medium</td></tr><tr><td>r 系列</td><td>記憶體密集型</td><td>r6g.large</td></tr><tr><td>g 系列</td><td>GPU 運算型</td><td>g5.xlarge</td></tr></tbody></table>

---

## 建立 EC2 的流程簡介

1. **選擇 AMI**：決定你要用哪一種作業系統
2. **選擇 Instance Type**：例如 `t3.micro`（免費方案支援）
3. **設定 Key Pair**：建立 SSH 金鑰，用來連線 EC2
4. **設定 Network（VPC）與 Security Group（防火牆）**
5. **設定磁碟（EBS）大小**
6. **啟動 EC2！**

完成後你會拿到一組 Public IP，就可以用 SSH 連進去使用了。

---

## 價格與計費方式

EC2 的價格組成會根據幾個項目決定：

<table id="bkmrk-%E9%A0%85%E7%9B%AE-%E8%AA%AA%E6%98%8E-instance-type-"><thead><tr><th>項目</th><th>說明</th></tr></thead><tbody><tr><td>Instance Type</td><td>不同型號每小時價格不同</td></tr><tr><td>計費模式</td><td>On-Demand / Spot / Reserved</td></tr><tr><td>使用時間</td><td>每秒或每小時計費</td></tr><tr><td>是否有附加儲存</td><td>EBS 空間也另外計費</td></tr><tr><td>傳輸流量</td><td>Outbound（出站）會收費</td></tr></tbody></table>

---

## EC2 的使用情境

EC2 適合用在哪些情況呢？以下列舉幾個常見案例：

- 需要完整控制環境與作業系統
- 要安裝自訂軟體或中介軟體（middleware）
- 部署高效能或特殊架構的應用（如容器主機、資料庫伺服器）
- 架設 CI/CD 服務、自架 Git、Redis、RabbitMQ
- 建立可手動調整、監控的後台系統

---

## 小結

EC2 是 AWS 中最基礎的運算服務，具備極大的彈性與控制權：

- 可以自由選擇作業系統與機型
- 適合習慣傳統主機操作的團隊
- 計費彈性、整合其他 AWS 服務方便

---

# EC2 進階篇：實戰操作與進階應用

在上一篇我們介紹了 EC2 的基本觀念與用途，這篇會帶大家進一步實作：

- 如何登入 EC2？
- 如何開放 port（像是 80、443）讓外部可以訪問？
- 怎麼設定開機自動執行程式？
- EC2 如何實作自動擴展（Auto Scaling）？

---

## 一、登入 EC2 實例（Linux）

當你啟動好一台 EC2 Linux 實例後，登入方式如下：

### ✅ 準備工作

- 確保當初有建立 Key Pair，下載了 `.pem` 檔案
- 開啟 Security Group 的 TCP port 22（SSH）
- 有 Public IP 或 Public DNS（可在 EC2 頁面查看）

### 💻 登入指令

```bash
chmod 400 my-key.pem
ssh -i my-key.pem ec2-user@<你的 Public IP>

```

> 不同 AMI 登入帳號不同：
> 
> - Amazon Linux 用 `ec2-user`
> - Ubuntu 用 `ubuntu`
> - Debian 用 `admin` 或 `debian`

---

## 二、開放 HTTP / HTTPS 連線

如果你要讓外部可以訪問你的 EC2，例如跑 Web server，需要設定 **Security Group**。

### ✅ 開啟常見 port：

- HTTP：80
- HTTPS：443
- 自定服務：你用什麼就開什麼（例如 3000、8080）

### 操作步驟：

1. 到 EC2 頁面點選「Security Group」
2. 找到你 EC2 所使用的 security group
3. 編輯「Inbound rules」
4. 新增：
    
    
    - 類型：HTTP、HTTPS
    - 來源：0.0.0.0/0（所有人都可以連）或限制特定 IP

---

## 三、設定開機後自動執行程式（User Data）

你可以在建立 EC2 時加入 **User Data**，當機器第一次啟動時會自動執行這段腳本。

### 範例：自動安裝 Nginx 並啟動 Web Server

```bash
#!/bin/bash
yum update -y
yum install -y nginx
systemctl enable nginx
systemctl start nginx
echo "Hello from EC2!" > /usr/share/nginx/html/index.html

```

> ✅ 注意：User Data 只能在 EC2 **首次啟動時執行一次**。  
> ✅ 如果想修改已存在的 User Data，需要重新建立新的 EC2 或自己寫開機指令。

---

## 四、設定 Auto Scaling Group（自動擴展）

Auto Scaling 是 EC2 強大的特點之一，可以根據負載自動增減 EC2 數量。

### 使用場景：

- 使用者流量增加，自動開新機器
- 流量低時自動縮減節省成本
- 保證服務有固定最少機器數（High Availability）

### 建立流程簡略：

1. 建立一個 Launch Template（定義要開什麼樣的 EC2）
2. 設定 Auto Scaling Group：
    
    
    - 定義最小 / 最大 EC2 數量
    - 設定 Scaling Policy（例如 CPU &gt; 60% 時新增 1 台）
3. 可結合 Load Balancer，讓所有流量平均分配到所有 EC2 上

---

## 五、備份與還原

EC2 本身不會自動備份，要使用以下方式保護資料：

### 快照（Snapshot）

- 可對 EBS 磁碟建立快照
- 快照可以還原成新的 EBS 磁碟掛回 EC2

### 建立 AMI

- 對目前 EC2 建立 AMI 映像檔
- 可隨時用這個 AMI 快速建立新機器（帶所有設定）

---

## 小結

這篇進階實作帶你實際操作 EC2，包括：

- 使用 SSH 登入實例
- 開放外部連線 port
- 利用 User Data 自動化設定
- 設定 Auto Scaling Group 自動擴展
- 建立快照與 AMI 做備份

EC2 的強大在於它的彈性與可控性，從個人專案到大型分散式系統，都能發揮作用。

---

下一篇，我們將來看看如果你不想自己處理作業系統、網路設定、磁碟掛載這些瑣事時，AWS 有沒有更輕鬆的方案？  
**Day 7：Elastic Beanstalk - 全自動部署的神隊友！**，我們不見不散！

# 【AWS】Day 7：運算服務 - Elastic Beanstalk（自動化部署服務）

在前幾篇，我們介紹了 EC2，了解了怎麼自己開一台雲端主機、自己設定環境、自己管防火牆、自己擴展、自己備份。

但如果你覺得自己管這些基礎建設很麻煩，希望可以更專注在「寫程式」跟「部署應用程式」上面，那 AWS 其實也有更方便的選擇：  
今天要介紹的就是 —— **Elastic Beanstalk**

---

## 什麼是 Elastic Beanstalk？

Elastic Beanstalk 是 AWS 提供的一種 **PaaS（平台即服務）**。

它的目標很簡單：

- 你只要準備好應用程式
- 把應用程式丟給 Beanstalk
- Beanstalk 幫你處理所有底層繁瑣的事情

包括：

- 建好 EC2 instance
- 建好負載平衡器（Load Balancer）
- 建好 Auto Scaling
- 建好 Security Group、防火牆設定
- 幫你佈署、監控、收集日誌
- 還可以一鍵回滾版本

你專注在開發跟部署，AWS 幫你顧好其他基礎設施。

---

## 支援的應用類型

Elastic Beanstalk 支援超多種語言與平台：

- Node.js
- Python
- Java
- Ruby
- PHP
- .NET
- Go
- Docker（完整支援 Container）
- 靜態網站（HTML/CSS/JS）

如果你是 Web 應用開發者，基本上都可以直接使用 Beanstalk 部署。

---

## Elastic Beanstalk 的架構概念

雖然 Beanstalk 幫你管理底層資源，但其實背後還是會幫你建立 AWS 其他服務，包括：

- EC2（跑你的應用）
- Elastic Load Balancer（分流）
- Auto Scaling Group（自動擴展）
- CloudWatch（監控、日誌）
- RDS（如果有需要資料庫）

這些資源都是 Beanstalk 幫你「托管」，你可以選擇要不要深入調整。

> ✅ 你仍然可以進入 EC2 頁面看到自己應用用到的實例，但建議不要直接手動修改，避免破壞 Beanstalk 的管理邏輯。

---

## 建立 Elastic Beanstalk 應用的流程

1. 進入 AWS Console，打開 Elastic Beanstalk
2. 點選「Create Application」
3. 填入：
    
    
    - Application Name（應用名稱）
    - Platform（選語言與環境）
    - Upload your code（上傳程式碼壓縮檔）
4. 設定部署設定（可以預設）
5. 點下「Create Application」

幾分鐘後，AWS 就會幫你建好整個環境，還會提供一個 URL，直接可以訪問你的應用！

---

## 部署更新與版本管理

Elastic Beanstalk 很貼心地內建了「版本管理」功能：

- 每次部署新程式碼，都會建立一個新的版本
- 可以快速回滾（Rollback）到前一個版本
- 可以在不同環境（例如 dev、prod）快速切換程式版本

---

## 常見 Elastic Beanstalk 的使用情境

- 快速啟動 MVP、小型專案
- 開發階段測試不同版本部署
- 中小型團隊的 Web 應用架設
- 需要簡單 Auto Scaling、Load Balancing 但不想自己架設

---

## 注意事項

- **不是完全免維運**：雖然簡化很多，但還是要稍微理解 VPC、Security Group 等 AWS 基本概念
- **資源會產生費用**：Beanstalk 本身不收費，但底層建立的 EC2、RDS、S3 等都會收費
- **適合標準架構**：如果應用有非常特殊的環境需求（例如自訂作業系統 kernel）可能還是要回去用 EC2 自己建

---

## 小結

Elastic Beanstalk 是 AWS 上手最簡單的運算服務之一：

- 幫你管理底層基礎建設
- 讓你快速部署、快速擴展、快速回滾
- 適合中小型 Web 應用，也適合剛開始學 AWS 的人嘗試

當然可以！這裡直接幫你補上  
**Elastic Beanstalk 簡易實作教學（以 Node.js 舉例）**，延續前面文章的語氣與結構，實作內容也保持簡單明瞭，讓讀者可以直接跟著做。

---

# Elastic Beanstalk 簡易實作教學（以 Node.js 範例）

剛剛介紹了 Elastic Beanstalk 是什麼，接下來就實際帶大家操作一次：

- 我們會快速做出一個 Node.js 小應用
- 壓成 ZIP 檔
- 部署到 Elastic Beanstalk 上

目標是：**10 分鐘內完成一個雲端 Web App！**

---

## 1. 建立一個簡單的 Node.js 專案

首先，在你的電腦上開一個新資料夾，例如 `eb-demo-app`，然後建立最基本的 Node.js 應用。

```bash
mkdir eb-demo-app
cd eb-demo-app
npm init -y
npm install express

```

接著建立一個 `app.js`，內容如下：

```javascript
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.send('Hello from Elastic Beanstalk!');
});

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

```

這樣就完成了最基本的 Node.js Web 應用。

注意：這裡我們用 `process.env.PORT` 是 Elastic Beanstalk 的部署要求，讓它自動分配正確的 port。

---

## 2. 建立必要的設定檔

Elastic Beanstalk 在 Node.js 環境中，需要有一個叫做 `package.json` 的設定檔（剛剛 `npm init` 已經自動生成），還需要明確標出啟動指令。

請確認 `package.json` 中有這一段：

```json
"scripts": {
  "start": "node app.js"
}

```

如果沒有，手動加上去，這樣 Elastic Beanstalk 才知道要怎麼啟動你的應用程式。

---

## 3. 壓縮成 ZIP 檔案

回到 `eb-demo-app` 目錄，將所有檔案壓縮成一個 `.zip` 檔。

注意：**不要把整個資料夾壓縮進去！**

- ZIP 檔裡面應該是直接包含 `app.js`、`package.json`，不是包一層資料夾！

例如正確的內容：

```
app.js
package.json
node_modules/

```

如果你想省空間，其實可以只壓 `app.js` 和 `package.json`，讓 Elastic Beanstalk 自己在雲端跑 `npm install`。

---

## 4. 登入 AWS Elastic Beanstalk 控制台

打開 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)

1. 點選「Create Application」
2. 填上：
    
    
    - **Application name**：例如 `demo-node-app`
    - **Platform**：選 `Node.js`
    - **Application code**：選擇「Upload your code」上傳剛剛的 `.zip` 檔
3. 點選「Create Application」

接下來 AWS 會自動：

- 建 EC2
- 建 Load Balancer
- 建 Auto Scaling Group
- 佈署你的應用程式

大概 3-5 分鐘後，就可以從 Elastic Beanstalk 頁面拿到一個網址，直接訪問你的應用！

---

## 5. 驗證部署結果

打開 Elastic Beanstalk 頁面給你的 URL，比如：

```
http://demo-node-app.ap-northeast-1.elasticbeanstalk.com/

```

你應該會看到網頁上寫著：

```
Hello from Elastic Beanstalk!

```

部署成功 🎉！

---

## 小結

這就是最簡單的 Elastic Beanstalk 實作流程，總結一下步驟：

1. 建立應用（Node.js / Python / etc）
2. 加好 `start` 指令
3. 壓成 ZIP 檔
4. 上傳到 Elastic Beanstalk
5. 幾分鐘內自動建立並上線

對於想快速上線 MVP 或測試環境的人來說，Elastic Beanstalk 真的是一個超省力的好選擇！

---

沒問題！這裡幫你補上  
**Elastic Beanstalk 簡易實作教學（Python / Flask 範例）**  
延續剛剛 Node.js 範例的風格和節奏，一樣清楚、快速能跟著做！

---

# Elastic Beanstalk 簡易實作教學（以 Python / Flask 範例）

如果你是使用 **Python** 的開發者，想要快速把 Flask App 部署到 Elastic Beanstalk，也是非常簡單的！

這篇教學會帶你從零建立一個最簡單的 Flask App，並且成功部署到 Elastic Beanstalk 上運行。

---

## 1. 建立一個 Flask 專案

首先，在你的電腦上新建一個資料夾，例如 `eb-python-demo`：

```bash
mkdir eb-python-demo
cd eb-python-demo
python3 -m venv venv
source venv/bin/activate  # Windows 用 venv\Scripts\activate
pip install flask

```

接著新增一個 `application.py`（注意：**檔名是 `application.py`，Elastic Beanstalk 預設會找這個名字**）

```python
from flask import Flask

application = Flask(__name__)

@application.route("/")
def hello():
    return "Hello from Elastic Beanstalk with Python!"

if __name__ == "__main__":
    application.run(host='0.0.0.0', port=5000)

```

這樣就完成一個超簡單的 Flask Web App！

---

## 2. 建立 requirements.txt

Elastic Beanstalk 需要知道要安裝哪些套件，所以要建立一個 `requirements.txt` 檔案，內容如下：

```
Flask

```

（未來如果有更多套件，就加在這個檔案裡。）

指令快速產生：

```bash
pip freeze > requirements.txt

```

---

## 3. 建立 `.ebextensions` 設定檔（可選）

如果你想在 Elastic Beanstalk 上做更多進階設定（例如自動安裝系統套件），可以用 `.ebextensions`。  
不過這次我們簡單部署，這步可以先跳過。

---

## 4. 壓縮成 ZIP 檔案

跟剛剛 Node.js 一樣，把你的檔案壓縮成一個 `.zip` 檔案。

⚡ **注意**：

- ZIP 裡面應該包含：`application.py`、`requirements.txt`
- 不要壓整個資料夾進去

正確的結構是：

```
application.py
requirements.txt

```

---

## 5. 部署到 Elastic Beanstalk

打開 [AWS Elastic Beanstalk Console](https://console.aws.amazon.com/elasticbeanstalk)

操作步驟：

1. 點選「Create Application」
2. 填寫：
    
    
    - **Application name**：例如 `demo-python-app`
    - **Platform**：選 **Python**
    - **Platform Branch**：例如 Python 3.11
3. 上傳剛剛壓好的 `.zip` 檔案
4. 點選「Create Application」

Elastic Beanstalk 會自動：

- 幫你建立 EC2
- 幫你佈署 Flask
- 幫你設定 Load Balancer

大約 3-5 分鐘部署完成。

---

## 6. 驗證部署結果

部署好之後，Elastic Beanstalk 會給你一個 URL，比如：

```
http://demo-python-app.ap-northeast-1.elasticbeanstalk.com/

```

打開之後應該會看到：

```
Hello from Elastic Beanstalk with Python!

```

大成功！🎉

---

## 小結

Python / Flask 的 Elastic Beanstalk 快速部署流程：

1. 建好 Flask 應用（注意 `application.py`）
2. 建立 `requirements.txt`
3. 打包成 `.zip`
4. 上傳到 Elastic Beanstalk
5. 等待幾分鐘，直接有一個可以訪問的 Web App

---

# Elastic Beanstalk 進階教學

（環境變數、eb CLI 部署、自動串接 RDS）

---

## 一、設定環境變數（Environment Variables）

在實際應用中，很常需要讓應用程式讀取一些敏感資訊（像資料庫連線字串、API 金鑰等等），這些不適合硬寫在程式碼裡。  
這時就需要使用「環境變數」。

### ✅ 在 Elastic Beanstalk 上設定環境變數

操作步驟：

1. 打開 Elastic Beanstalk Console，進入你的應用 Environment
2. 左邊選單找到「Configuration」
3. 找到「Software」，按下「Edit」
4. 在 Environment properties 區塊新增你的變數，例如：

<table id="bkmrk-key-value-db_host-my"><thead><tr><th>Key</th><th>Value</th></tr></thead><tbody><tr><td>`DB_HOST`</td><td>mydb.xxxxxxxxx.rds.amazonaws.com</td></tr><tr><td>`DB_USER`</td><td>admin</td></tr><tr><td>`DB_PASSWORD`</td><td>supersecure123</td></tr></tbody></table>

儲存後，Elastic Beanstalk 會自動重啟環境，讓你的應用可以透過環境變數讀取設定。

---

### ✅ 在程式中讀取環境變數（Python Flask 範例）

```python
import os

db_host = os.getenv('DB_HOST')
db_user = os.getenv('DB_USER')
db_password = os.getenv('DB_PASSWORD')

```

這樣就能安全地使用環境設定，不用把敏感資訊寫死在程式碼裡！

---

## 二、使用 eb CLI 進行快速部署

如果你覺得每次都開 Console 點來點去很煩，AWS 提供了專門給 Elastic Beanstalk 用的指令工具：  
**Elastic Beanstalk CLI (eb CLI)**

可以直接從 Terminal 完成初始化、部署、查看環境狀態等等，非常方便！

### ✅ 安裝 eb CLI

先安裝 AWS EB CLI：

```bash
pip install awsebcli --upgrade

```

> 有時候 MacOS 或 Linux 需要加上 `--user`，或用 virtualenv 安裝。

安裝好後，試試：

```bash
eb --version

```

如果能正常顯示版本號，代表安裝成功。

---

### ✅ eb CLI 操作基本流程

1. 登入 AWS（要先設定好 AWS CLI credentials）

```bash
aws configure

```

2. 初始化 eb 專案

在你的應用資料夾內：

```bash
eb init

```

過程中會問你：

- 要使用哪個 Region？
- 是哪個 Platform？（Node.js、Python 等）
- 是否需要設定 SSH？

3. 建立 Environment

```bash
eb create dev-env

```

（可以自己取環境名字）

4. 部署更新

```bash
eb deploy

```

5. 查看環境資訊

```bash
eb status

```

6. 開啟瀏覽器查看應用

```bash
eb open

```

超級方便，可以完全不開網頁直接部署更新！

---

## 三、自動串接 RDS 資料庫（一起建立）

如果你的應用需要資料庫（例如 MySQL、PostgreSQL），Elastic Beanstalk 可以在建立 Environment 時**順便幫你建立 RDS**！

### ✅ 如何設定

1. 建立 Environment 時，選擇「Configure more options」
2. 找到「Database」選項，點選「Edit」
3. 選擇：
    
    
    - 資料庫引擎（MySQL、PostgreSQL）
    - 資料庫版本
    - 使用者名稱、密碼
    - 硬碟空間大小

建立好後：

- Elastic Beanstalk 會自動把 RDS 與你的應用放在同一個 VPC、Security Group
- 會自動把資料庫連線資訊存到環境變數（`RDS_HOSTNAME`、`RDS_USERNAME`、`RDS_PASSWORD`、`RDS_PORT`）

你的 Flask / Node.js 應用只要讀取這些環境變數，就能連上資料庫！

---

### ✅ Flask 範例（連接 Elastic Beanstalk RDS）

```python
import os
import pymysql

db_host = os.getenv('RDS_HOSTNAME')
db_user = os.getenv('RDS_USERNAME')
db_password = os.getenv('RDS_PASSWORD')
db_name = os.getenv('RDS_DB_NAME')

conn = pymysql.connect(
    host=db_host,
    user=db_user,
    password=db_password,
    database=db_name
)

```

就可以在應用程式中直接操作資料庫啦！

---

## 小結

Elastic Beanstalk 除了快速部署應用，進階玩法還可以：

- 設定環境變數，安全管理敏感資訊
- 使用 eb CLI，極速 Terminal 部署
- 一起建立 RDS，讓應用直接串接雲端資料庫

---

# Elastic Beanstalk 常見錯誤排除指南

Elastic Beanstalk 幫我們自動化了很多事，但實際使用過程中還是很容易遇到一些常見錯誤。

這篇幫大家整理了：

- 常見的 Elastic Beanstalk 部署問題
- 原因說明
- 解決方法

給你一份遇到問題時能快速排雷的工具包！

---

## 1. 部署後出現 502 Bad Gateway

### 問題現象

- 部署成功，但一打開應用的網址就跳出 502 Bad Gateway
- 或者頁面載入超級慢然後 timeout

### 常見原因

- **應用程式沒有正常啟動**
- **聽錯了 Port**（Elastic Beanstalk 預設會轉送到 80 或由 proxy pass）

### 解決方法

✅ 檢查你的應用程式是否有監聽正確的 Port：

- Node.js / Flask / Django 等應用，要監聽環境變數給定的 port
- 例如 Flask：

<div id="bkmrk-python-%E8%A4%87%E8%A3%BD%E7%B7%A8%E8%BC%AF-applicat"><div>python</div><div><div><div><span class="" data-state="closed"><button aria-label="複製" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>複製</button></span><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>編輯</button></span></div></div></div><div>`application.run(host=<span class="hljs-string">'0.0.0.0'</span>, port=<span class="hljs-built_in">int</span>(os.environ.get(<span class="hljs-string">'PORT'</span>, <span class="hljs-number">5000</span>)))`</div></div>✅ 查看 Logs：

- Elastic Beanstalk Console → Logs → Request logs → Last 100 lines
- 查看應用啟動過程是否有錯誤訊息，例如 module not found、port 綁定錯誤等

---

## 2. 部署失敗，顯示「Instance deployment failed」

### 問題現象

- 上傳 ZIP 包後，環境 Health 直接變紅色
- console 顯示 deployment failed

### 常見原因

- 上傳的 ZIP 包結構錯誤
- 必要檔案（像 `application.py` 或 `package.json`）缺少或錯誤
- requirements.txt 有誤（例如版本衝突、缺失）

### 解決方法

✅ 確認 ZIP 檔內部是正確的結構：

<div id="bkmrk-%E8%A4%87%E8%A3%BD%E7%B7%A8%E8%BC%AF-application.py-"><div></div><div><div><div><span class="" data-state="closed"><button aria-label="複製" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>複製</button></span><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>編輯</button></span></div></div></div><div>`application.pyrequirements.txt（不要包一層資料夾）`</div></div>✅ 如果是 Python，確保有 `requirements.txt`，且內容正確。

✅ 部署失敗可以看 Instance logs：

- Console → Logs → Instance logs → 全部下載下來
- 查看 `/var/log/eb-engine.log` 或 `/var/log/web.stdout.log` 裡的錯誤訊息

---

## 3. 無法 SSH 連線到 EC2

### 問題現象

- 按下「Connect」或者手動 SSH 連線失敗
- 卡在 timeout，無法進去 Instance

### 常見原因

- Security Group 沒有開放 port 22
- 沒有設定 Key Pair
- 錯誤使用 Public IP 或 DNS 名稱

### 解決方法

✅ 確認 Environment → Configuration → Security → EC2 Key Pair 有設定。

✅ Security Group 要開 TCP 22 port，允許你的 IP 連進去。

✅ 連線指令正確，例如：

<div id="bkmrk-bash-%E8%A4%87%E8%A3%BD%E7%B7%A8%E8%BC%AF-ssh--i-my-"><div>bash</div><div><div><div><span class="" data-state="closed"><button aria-label="複製" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>複製</button></span><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>編輯</button></span></div></div></div><div>`ssh -i my-key.pem ec2-user@your-public-dns.amazonaws.com`</div></div>---

## 4. 資源遺留：環境刪掉但 EC2、RDS 還在

### 問題現象

- 刪除 Elastic Beanstalk 環境後
- 發現 EC2、RDS、Security Group、EBS Volume 還殘留在帳號中

### 常見原因

- 預設刪除環境時，只會刪除 Beanstalk 直接管理的資源
- 外掛式 RDS、手動建立的資源不會跟著刪

### 解決方法

✅ 手動到 EC2、RDS、VPC 頁面，檢查並刪除殘留的資源。

✅ 未來建立環境時，如果有開 RDS，**選「內嵌式 RDS」**（跟環境生命週期綁在一起），才會自動清掉。

---

## 5. 更新應用程式後，環境變紅，回不去

### 問題現象

- 部署新版本應用後
- Elastic Beanstalk 環境變成 Severe（紅色）
- 想緊急回滾但不知道怎麼做

### 常見原因

- 新版程式出錯，導致服務無法正常啟動
- Elastic Beanstalk 的 Health Check 判定失敗

### 解決方法

✅ 使用 Elastic Beanstalk 的 **版本回滾功能**：

- Console → Application → Versions
- 找到上一個成功部署的版本，按「Deploy」

✅ 部署失敗時，通常 Console 會自動記錄上一次成功的狀態，可以快速 Rollback。

---

## 6. 頻繁超過資源限制（Instance CPU 爆表、Memory 爆滿）

### 問題現象

- Elastic Beanstalk 環境 Health 不穩
- 應用載入變慢或直接掛掉

### 常見原因

- Instance 選太小（例如 t2.micro 記憶體太小）
- 程式設計有記憶體洩漏（Memory Leak）
- 同一台機器上負載過高

### 解決方法

✅ 調整 Instance Type：

- 將 EC2 Instance 換成 t3.medium、t3.large 或更高階型號
- Elastic Beanstalk 支援一鍵調整 Scaling 設定

✅ 設定 Auto Scaling Policy：

- 當 CPU &gt; 60% 自動擴展一台
- 當 CPU &lt; 30% 自動縮減

✅ 用 CloudWatch 監控 CPU、Memory 使用率，設通知（Alarm）

---

# 小結

Elastic Beanstalk 雖然大幅降低了管理負擔，但遇到問題時：

- **善用 Logs**
- **善用 Environment Health Status**
- **善用版本控制回滾機制**

這三個是最快速排除問題的關鍵！

---

下一篇，我們將進入 AWS 的 **Serverless 運算世界 —— Lambda！**  
看看如果連 EC2、Load Balancer 都不想管，只想「寫 function」，AWS 能怎麼幫你做到！

Day 8 再見 👋

# 【AWS】【Elastic Beanstalk】 常見部署結構推薦指南&費用最佳化建議

# Elastic Beanstalk 常見部署結構推薦指南

Elastic Beanstalk 很方便，但如果搭配得好，會讓你的應用又穩又省錢；搭配得不好，可能會出現：

- 資源不足導致當機
- 成本過高
- 擴展緩慢等問題

這篇針對不同情境，推薦最佳部署結構與選型建議。

---

## 1. 小型網站 / MVP 初版

### 適用情境

- 一般公司網站
- 初版產品 Demo
- 內部管理系統
- 低流量 Web API

### 推薦設定

<table id="bkmrk-%E9%A0%85%E7%9B%AE-%E5%BB%BA%E8%AD%B0%E5%80%BC-instance-type"><thead><tr><th>項目</th><th>建議值</th></tr></thead><tbody><tr><td>Instance Type</td><td>`t3.micro` 或 `t3.small`（免費額度或低價）</td></tr><tr><td>Instance 數量</td><td>最小 1 台，最大 1 台（不開 Auto Scaling）</td></tr><tr><td>Database</td><td>內嵌式 RDS 或直接外接小型 DB（如 Lightsail）</td></tr><tr><td>Load Balancer</td><td>不使用（單台直接對外即可）</td></tr><tr><td>部署方式</td><td>單一環境，使用 Rolling 更新</td></tr></tbody></table>

### 原因分析

- 成本極低（每月不到 10 美金）
- 流量低，單台就夠
- 部署簡單，維運容易
- 適合快速迭代、驗證市場

---

## 2. 中型後端服務 / API Server

### 適用情境

- 中等流量的 Web API
- 手機 App 的後端
- 需要支援突發高峰流量

### 推薦設定

<table id="bkmrk-%E9%A0%85%E7%9B%AE-%E5%BB%BA%E8%AD%B0%E5%80%BC-instance-type-0"><thead><tr><th>項目</th><th>建議值</th></tr></thead><tbody><tr><td>Instance Type</td><td>`t3.medium` 或 `t3.large`</td></tr><tr><td>Instance 數量</td><td>最小 2 台，最大 4 台（開啟 Auto Scaling）</td></tr><tr><td>Database</td><td>外接獨立 RDS（例如 db.t3.medium）</td></tr><tr><td>Load Balancer</td><td>啟用 Application Load Balancer (ALB)</td></tr><tr><td>部署方式</td><td>Rolling with additional batch（保證不中斷）</td></tr></tbody></table>

### 原因分析

- 2 台機器可避免單點故障
- Auto Scaling 可以因應突發性流量（例如促銷活動）
- 獨立 RDS 提高資料庫效能與可管理性
- ALB 可支援 HTTPS 與多目標健康檢查

---

## 3. 高流量大型網站 / 高併發應用

### 適用情境

- 電商網站
- 多人即時服務（如聊天室、直播）
- 高 API 併發應用

### 推薦設定

<table id="bkmrk-%E9%A0%85%E7%9B%AE-%E5%BB%BA%E8%AD%B0%E5%80%BC-instance-type-1"><thead><tr><th>項目</th><th>建議值</th></tr></thead><tbody><tr><td>Instance Type</td><td>`m6i.large` 或 `c6g.large`（效能型）</td></tr><tr><td>Instance 數量</td><td>最小 4 台，最大 10 台（Auto Scaling）</td></tr><tr><td>Database</td><td>專屬大型 RDS（或 Aurora Serverless）</td></tr><tr><td>Load Balancer</td><td>Application Load Balancer（或加上 CloudFront）</td></tr><tr><td>部署方式</td><td>Immutable deployment（零中斷更新）</td></tr></tbody></table>

### 原因分析

- 使用效能型機器降低單位併發成本
- 多台擴展配合 Auto Scaling 可應付大幅波動
- Immutable 部署方式可避免更新失敗影響現有線上服務
- Load Balancer 可搭配 CDN 提升全球加速

---

## 4. Serverless + Beanstalk 混合模式（Hybrid）

### 適用情境

- 需要兼顧複雜計算與 Serverless 架構
- 某些任務使用 Lambda 執行（如影像處理、寄信）
- 主系統仍以 Beanstalk EC2 部署

### 推薦設定

- 核心 API / Web server 放在 Elastic Beanstalk
- 背景工作（cron job、queue consumer）用 AWS Lambda + EventBridge
- File upload / Static Content 用 S3 + CloudFront
- Serverless 服務與 EC2 協作，共用 IAM role / VPC

### 原因分析

- 彈性最佳化：主服務 EC2 高效能、子任務 Lambda 靈活啟動
- 成本控制佳，避免小工作佔用大型主機資源
- 容錯能力提升，Lambda 失敗也不影響主要 API

---

# 小結

不同規模、不同需求下，Elastic Beanstalk 最佳部署建議：

<table id="bkmrk-%E8%A6%8F%E6%A8%A1-instance%E5%BB%BA%E8%AD%B0-auto-s"><thead><tr><th>規模</th><th>Instance建議</th><th>Auto Scaling</th><th>Load Balancer</th><th>Database建議</th></tr></thead><tbody><tr><td>小型</td><td>1台小機器</td><td>❌</td><td>❌</td><td>內嵌 RDS 或外接小型 DB</td></tr><tr><td>中型</td><td>2-4台中型機器</td><td>✅</td><td>✅</td><td>獨立 RDS</td></tr><tr><td>大型</td><td>4-10台高效能機器</td><td>✅</td><td>✅（加 CDN）</td><td>大型 RDS 或 Aurora Serverless</td></tr><tr><td>混合</td><td>Beanstalk + Lambda</td><td>✅</td><td>✅</td><td>跨服務組合</td></tr></tbody></table>

Elastic Beanstalk 的強大就在於  
**從個人開發到企業級系統，都可以靈活搭配出適合自己的方案！**

---

# Elastic Beanstalk 費用最佳化建議

（含 Auto Scaling 節省技巧）

Elastic Beanstalk 本身不收管理費，**真正產生費用的是底層的 EC2、Load Balancer、RDS、S3、傳輸流量**等資源。

所以如果想讓 Beanstalk 部署既穩定又省錢，關鍵在於：

- 控制 EC2 成本
- 適當調整擴展策略
- 避免無意義的浪費

這篇就帶你掌握 Elastic Beanstalk 最有效的省錢方法！

---

## 1. 使用 Reserved Instance（RI）

### ✅ 做法

如果你的應用是「穩定長期運行」（例如公司網站、後端 API），  
建議購買 **Reserved Instances**（RI）來取代 On-Demand。

- 可省下 **最高 72%** 成本（依付款方案而定）
- 1 年期或 3 年期，分為 All Upfront / Partial Upfront / No Upfront 付款選項

> 📌 注意：RI 是鎖定在「Region + Instance Type family」（例如 t3 family）

### ✅ 適用時機

- 流量穩定的長期應用
- 預期至少持續使用 1 年以上

---

## 2. 配合 Auto Scaling 使用 Spot Instances

### ✅ 做法

Elastic Beanstalk 的 Auto Scaling Group 可以設定混合策略：

- 混合使用 On-Demand 與 Spot Instances
- 例如：
    
    
    - 30% On-Demand 保底
    - 70% Spot 便宜又彈性擴展

在環境設定裡選擇：

> Capacity → Auto Scaling → Instances → Purchase Options → "Combine purchase options and instance types"

這樣可以極大降低「額外擴展台數」的費用。

Spot 便宜很多（常常是 On-Demand 價格的 10%~30%），超適合做大量讀取、彈性擴展的情境！

### ✅ 適用時機

- 流量不穩定、會爆量但可以短期容忍失敗（如直播、促銷活動）
- 不要求 100% 可用性的非關鍵服務（如統計、備援服務）

---

## 3. 適當設定 Auto Scaling 門檻

Auto Scaling 是節省資源的重要機制，但如果設定不當，反而可能讓你爆量開機器！

### ✅ 推薦設定策略

- **Scaling Up（擴展）**：CPU 使用率 &gt; 60% 才新增機器
- **Scaling Down（縮減）**：CPU 使用率 &lt; 30% 才關閉機器
- **Cooldown Time**（冷卻時間）：
    
    
    - 擴展冷卻時間：180 秒
    - 縮減冷卻時間：300 秒

這樣可以避免瞬間小波動就導致無謂的開關機，  
減少 Auto Scaling 的震盪效應（flapping）。

---

## 4. 選擇適合的 Instance Type

不要一開始就開很大的機器，建議從小型機型開始測試：

- 小型 / 中型服務：選 `t3.medium` 或 `t4g.medium`（ARM 架構更便宜）
- 記憶體吃重服務：選 `r6g.large`
- 計算密集服務：選 `c6g.large`

**t 系列機型**特別便宜，還有 **CPU Credit** 機制，非常適合大部分輕中量應用。

> 📌 如果有資格使用 AWS Savings Plan，搭配起來成本又能再下降！

---

## 5. 適時關閉閒置資源

Elastic Beanstalk 的環境如果沒有在使用，底層資源（EC2、EBS、ALB）還是會一直產生費用！

### ✅ 建議

- 測試環境（staging / dev）用完記得直接 **terminate**。
- 用 Lifecycle Policy 自動清除超過 30 天未使用的 Application Versions。
- RDS 如果是測試用，也記得關掉（RDS 比 EC2 還貴！）。

---

## 6. 用 CloudFront 做流量加速，減少 ALB 費用

如果你的 Elastic Beanstalk 是做靜態檔案 / API Server，  
流量高峰期可以前面加一層 **CloudFront CDN**，減少直接打到 Load Balancer 的次數。

- 減少 ALB Request 數量 ➔ 降低 ALB 成本
- 加速全球存取速度
- 保護背後應用不被 DDoS 打爆（搭配 AWS Shield）

---

# 小結

Elastic Beanstalk 節省費用重點整理：

<table id="bkmrk-%E6%96%B9%E6%B3%95-%E6%A0%B8%E5%BF%83%E6%95%88%E6%9E%9C-reserved-ins"><thead><tr><th>方法</th><th>核心效果</th></tr></thead><tbody><tr><td>Reserved Instances</td><td>穩定運作環境省錢最大化（&gt;50%）</td></tr><tr><td>Spot Instances混搭</td><td>彈性負載環境大幅降低成本</td></tr><tr><td>正確設 Auto Scaling</td><td>避免不必要的機器啟動/關閉</td></tr><tr><td>選對 Instance Type</td><td>減少過度規格浪費</td></tr><tr><td>定期清理閒置資源</td><td>減少測試環境與多餘資源費用</td></tr><tr><td>加上 CloudFront</td><td>減少 ALB 成本與提高存取效率</td></tr></tbody></table>

Elastic Beanstalk 不只是簡單，  
只要稍微搭配得好，也能做到「低成本、高可靠、高效能」的部署！

---

# 【AWS】Day 8：運算服務 - AWS Lambda（Serverless 運算服務）

從前幾篇我們一路看了 EC2（自己管主機）、Elastic Beanstalk（半自動化部署）。

但如果你希望：

- 完全不用開伺服器
- 完全不用自己處理機器、網路、Scaling
- 只要專心「寫功能」就好

那 AWS Lambda 正是為了這樣的世界而生的！

今天正式進入 AWS Serverless 世界 —— **Lambda**！

---

## 什麼是 AWS Lambda？

**AWS Lambda** 是一個「事件驅動」的計算服務。

你只需要撰寫小段的**程式碼 Function**，告訴 AWS：

- 什麼時候要執行（例如 API 呼叫、排程時間、檔案上傳）
- 要執行什麼邏輯（你的程式碼）
- 設定好記憶體、超時時間

剩下的：

- 執行環境（OS、Patch、Security）
- 擴展（Scaling up &amp; down）
- 負載均衡
- 日誌收集
- 資源回收

全部 AWS 幫你自動處理。

你只要負責寫功能，其他都不用煩惱！

---

## Lambda 的基本特性

<table id="bkmrk-%E9%A0%85%E7%9B%AE-%E8%AA%AA%E6%98%8E-%E9%81%8B%E7%AE%97%E5%96%AE%E4%BD%8D-function%EF%BC%88"><thead><tr><th>項目</th><th>說明</th></tr></thead><tbody><tr><td>運算單位</td><td>Function（函數）</td></tr><tr><td>部署方式</td><td>上傳程式碼（ZIP）或直接在 Console 編輯</td></tr><tr><td>支援語言</td><td>Node.js, Python, Java, Go, .NET, Ruby…</td></tr><tr><td>記憶體設定</td><td>128MB ~ 10GB（每64MB為單位）</td></tr><tr><td>執行時間限制</td><td>最長 15 分鐘</td></tr><tr><td>價格模式</td><td>依執行次數 + 記憶體用量 + 執行時間計價</td></tr><tr><td>自動擴展</td><td>是（幾乎無上限，橫向自動擴展）</td></tr></tbody></table>

---

## Lambda 的典型使用情境

- API Gateway ➔ Lambda ➔ 回應 Web API
- S3 上傳檔案 ➔ Lambda 處理轉檔（圖片縮圖、影片轉檔）
- DynamoDB 資料異動 ➔ Lambda 處理後續邏輯
- 排程任務（類似 crontab） ➔ 用 EventBridge 觸發 Lambda
- 輕量型後端服務（例如 Form submit、小型 Game Server）

---

## Lambda 的基本運作流程

以「API Server」為例：

1. 使用 **API Gateway** 建立 API Endpoint
2. 當使用者呼叫 API 時，API Gateway 觸發 Lambda
3. Lambda 執行你的程式邏輯（例如查資料庫、處理資料）
4. Lambda 執行完畢，把結果回傳給 API Gateway，再傳給使用者

整個過程中：

- 沒有 EC2
- 沒有 Load Balancer
- 沒有固定伺服器
- 自動擴展，不需要自己設定台數

---

## Lambda 的計費方式

Lambda 的收費方式非常彈性，也很適合小量或突發性使用的場景。

計費公式：

> **總費用 = 呼叫次數 +（記憶體用量 × 執行時間）**

詳細來說：

- **每個月前 1M 次請求免費**
- **每個月 400,000 GB-seconds 免費**
- 超出後，依照實際用量超便宜的單位收費

簡單說就是：

- 程式小、執行快，超便宜
- 不執行，不收費（真正的 pay-as-you-go）

---

## Lambda 的限制與注意事項

雖然 Lambda 很香，但也有一些天然限制要注意：

<table id="bkmrk-%E9%99%90%E5%88%B6%E9%A0%85%E7%9B%AE-%E8%AA%AA%E6%98%8E-%E6%9C%80%E5%A4%A7%E5%9F%B7%E8%A1%8C%E6%99%82%E9%96%93-15-%E5%88%86%E9%90%98"><thead><tr><th>限制項目</th><th>說明</th></tr></thead><tbody><tr><td>最大執行時間</td><td>15 分鐘</td></tr><tr><td>單次部署包大小上限</td><td>250MB（含 layer）</td></tr><tr><td>同步觸發最大負載</td><td>預設 1000 concurrency（可申請提升）</td></tr><tr><td>須設計無狀態</td><td>每次執行是全新環境，不保留記憶體資料</td></tr></tbody></table>

---

## 小結

今天介紹了 AWS Lambda 的核心概念：

- 完全免維護伺服器
- 按次計費、真正用多少付多少
- 適合 API、小型運算任務、背景作業
- 超級擴展性，適合不確定流量的應用

Lambda 完全顛覆了傳統開發部署方式，讓開發者能更專注在**功能本身**，而不是維護伺服器！

---

好！這裡直接幫你產出  
**AWS Lambda 實作教學（Hello World + API Gateway 快速串接）**  
讓讀者可以跟著馬上做出第一個 Lambda Function，並且用瀏覽器呼叫成功！

---

# AWS Lambda 實作教學（Hello World + API Gateway 快速串接）

前一篇我們認識了什麼是 AWS Lambda。  
這一篇直接來實戰，帶你：

- 建立一個 Hello World Lambda
- 用 API Gateway 快速串接
- 用瀏覽器直接呼叫！

超簡單，只需要 10 分鐘 🚀

---

## 1. 建立第一個 Lambda Function

登入 AWS Console  
打開 [AWS Lambda Console](https://console.aws.amazon.com/lambda/)

1. 點選「Create function」
2. 選擇「Author from scratch」
3. 填寫基本資訊：

<table id="bkmrk-%E9%A0%85%E7%9B%AE-%E8%A8%AD%E5%AE%9A-function-name-"><thead><tr><th>項目</th><th>設定</th></tr></thead><tbody><tr><td>Function name</td><td>`hello-world-lambda`</td></tr><tr><td>Runtime</td><td>Node.js 18.x（或 Python 3.11 也可）</td></tr><tr><td>Architecture</td><td>x86\_64（預設即可）</td></tr><tr><td>Permissions</td><td>建議選「Create a new role with basic Lambda permissions」</td></tr></tbody></table>

4. 點選「Create Function」

幾秒鐘後，一個新的 Lambda 就建立好了！

---

## 2. 編輯 Lambda 程式碼

在 Lambda Console 的編輯器中，把預設程式碼改成這樣：

### Node.js 版

```javascript
exports.handler = async (event) => {
    return {
        statusCode: 200,
        body: JSON.stringify('Hello from AWS Lambda!'),
    };
};

```

### Python 版

```python
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'Hello from AWS Lambda!'
    }

```

編輯完後，記得按下「Deploy」！

這樣 Lambda 程式就設定完成了 🎯

---

## 3. 建立 API Gateway 串接 Lambda

接下來，我們讓這個 Lambda 能夠用 HTTP API 被呼叫。

1. 在 Lambda Function 頁面上方，點選「Add trigger」
2. 選擇「API Gateway」
3. 設定：

<table id="bkmrk-%E9%A0%85%E7%9B%AE-%E8%A8%AD%E5%AE%9A-api-type-http-"><thead><tr><th>項目</th><th>設定</th></tr></thead><tbody><tr><td>API type</td><td>HTTP API（比較簡單快速）</td></tr><tr><td>Security</td><td>Open（不設驗證，之後可以補強）</td></tr><tr><td>API Name</td><td>自動生成或自己命名也可以</td></tr></tbody></table>

4. 點選「Add」

AWS 會自動幫你建立一個 HTTP API，並串好 Lambda！

完成後，Lambda 頁面會顯示一個 API Endpoint，例如：

```
https://xxxxx12345.execute-api.ap-northeast-1.amazonaws.com/

```

---

## 4. 測試 API 呼叫

打開你的瀏覽器，直接輸入剛剛那個 URL！

你應該會看到畫面顯示：

```
"Hello from AWS Lambda!"

```

恭喜 🎉  
你的第一個 Lambda + API Gateway 已經成功部署！

---

## 5. 小結

這次的流程總結：

<table id="bkmrk-%E6%AD%A5%E9%A9%9F-%E8%AA%AA%E6%98%8E-%E5%BB%BA%E7%AB%8B-lambda-%E6%92%B0%E5%AF%AB-h"><thead><tr><th>步驟</th><th>說明</th></tr></thead><tbody><tr><td>建立 Lambda</td><td>撰寫 Hello World 程式碼</td></tr><tr><td>建立 API Gateway Trigger</td><td>快速建立 HTTP API 串接 Lambda</td></tr><tr><td>測試呼叫</td><td>瀏覽器直接打 API URL 測試結果</td></tr></tbody></table>

透過 Lambda + API Gateway，可以超快速上線一個基本 API，  
而且完全不用管 EC2、Scaling、Load Balancer 等基礎設施！

---

太好了！這裡接著給你完整的  
**AWS Lambda 進階教學：環境變數、IAM 權限設定、連接 RDS 資料庫**，  
讓你的 Lambda 應用從 Hello World 升級到真正可以跑正式服務！

---

# AWS Lambda 進階教學

（環境變數設定＋IAM 權限管理＋連接 RDS 資料庫）

---

## 一、設定 Lambda 環境變數（Environment Variables）

### ✅ 為什麼需要環境變數？

- 存放敏感資訊（資料庫帳號密碼、API Key）
- 存放不同環境（dev / prod）設定
- 程式更乾淨，不要把設定寫死在程式碼裡

### ✅ 如何設定環境變數

1. 打開 Lambda Function 頁面
2. 選擇「Configuration」→「Environment variables」
3. 點「Edit」→「Add environment variable」
4. 加入變數，例如：

<table id="bkmrk-key-value-db_host-yo"><thead><tr><th>Key</th><th>Value</th></tr></thead><tbody><tr><td>`DB_HOST`</td><td>`your-db.xxxx.rds.amazonaws.com`</td></tr><tr><td>`DB_USER`</td><td>`admin`</td></tr><tr><td>`DB_PASSWORD`</td><td>`your-password`</td></tr><tr><td>`DB_NAME`</td><td>`your-database-name`</td></tr></tbody></table>

5. 儲存即可，Lambda 會自動讀取這些變數

---

### ✅ 程式裡讀取環境變數（Python範例）

```python
import os

db_host = os.environ['DB_HOST']
db_user = os.environ['DB_USER']
db_password = os.environ['DB_PASSWORD']
db_name = os.environ['DB_NAME']

```

讀取環境變數超簡單，推薦大家一定要用這種方式管理設定！

---

## 二、設定 Lambda 的 IAM Role（權限）

### ✅ 為什麼需要設定 IAM Role？

Lambda 本身如果要呼叫其他 AWS 資源（像 S3、DynamoDB、RDS），需要有「授權」。

這個授權是透過「IAM Role」給的。

> 📌 Lambda 本身就會綁定一個 IAM Role，進行細部設定即可。

---

### ✅ 最小權限原則（Best Practice）

- 只開放 Lambda 需要用到的權限
- 不要直接給 Lambda admin 權限（避免安全漏洞）

---

### ✅ 範例：讓 Lambda 存取 RDS（或 VPC）

如果 Lambda 需要連到 RDS，需要設定：

- 讓 Lambda 進入正確的 VPC、Subnet、Security Group
- IAM Role 不需要特別開 RDS 權限（除非要操作 RDS API，例如開啟 RDS Snapshot）

所以通常 IAM Role 保持「基本執行」權限就好，例如：

- `AWSLambdaBasicExecutionRole`（CloudWatch log 權限）
- `AWSLambdaVPCAccessExecutionRole`（存取 VPC 權限）

可以在 Lambda → Configuration → Permissions → Execution Role 編輯。

---

## 三、Lambda 連接 RDS 資料庫（Python 範例）

假設我們已經設定好 RDS MySQL 或 PostgreSQL 資料庫，並且把連線資訊設在環境變數。

### ✅ 安裝必備套件

AWS Lambda 本身環境很乾淨，需要把 Python 連線資料庫的套件（例如 `pymysql`、`psycopg2`）打包進去。

**開發環境步驟：**

```bash
mkdir lambda_rds
cd lambda_rds
python3 -m venv venv
source venv/bin/activate
pip install pymysql
deactivate

```

把 `venv/lib/python3.11/site-packages` 的 pymysql 複製到專案目錄。

最後 ZIP 包含：

- `lambda_function.py`（你的程式）
- `pymysql/`（套件目錄）

---

### ✅ Lambda Python 連線 RDS (MySQL) 範例

```python
import pymysql
import os

def lambda_handler(event, context):
    # 讀取環境變數
    db_host = os.environ['DB_HOST']
    db_user = os.environ['DB_USER']
    db_password = os.environ['DB_PASSWORD']
    db_name = os.environ['DB_NAME']
    
    # 建立連線
    connection = pymysql.connect(
        host=db_host,
        user=db_user,
        password=db_password,
        database=db_name,
        connect_timeout=5
    )
    
    try:
        with connection.cursor() as cursor:
            sql = "SELECT NOW();"
            cursor.execute(sql)
            result = cursor.fetchone()
            return {
                'statusCode': 200,
                'body': f'Database Time: {result[0]}'
            }
    finally:
        connection.close()

```

這樣就能讓 Lambda 成功連接雲端資料庫，完成資料操作！

---

## 四、常見注意事項

<table id="bkmrk-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A0%85-%E8%AA%AA%E6%98%8E-lambda-%2B-rds"><thead><tr><th>注意事項</th><th>說明</th></tr></thead><tbody><tr><td>Lambda + RDS Latency</td><td>Lambda 通常要設在與 RDS 同一個 VPC / AZ</td></tr><tr><td>連線池設計</td><td>建議使用 RDS Proxy（可以省連線數）</td></tr><tr><td>超時設置</td><td>Lambda 最大執行時間 15 分鐘，連資料庫要小心逾時</td></tr><tr><td>打包套件</td><td>自訂套件一定要打包進 ZIP 中</td></tr></tbody></table>

---

# 小結

這篇進階教學重點整理：

- Lambda 用環境變數管理設定
- Lambda 設定 IAM Role，最小權限原則
- Lambda 可以直接連 RDS，但要注意 VPC 設定
- 打包套件進 ZIP 是必須的！

掌握這些，  
你的 Lambda 就可以從 Hello World 升級成**正式後端服務**了！

---

# AWS Serverless 全應用實戰

（API Gateway + Lambda + DynamoDB + RDS Proxy）

---

## 🔧 架構圖

<div id="bkmrk-css-%E8%A4%87%E8%A3%BD%E7%B7%A8%E8%BC%AF-%5Bclient%5D-%E2%86%93-"><div>css</div><div><div><div><span class="" data-state="closed"><button aria-label="複製" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>複製</button></span><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>編輯</button></span></div></div></div><div>`<span class="hljs-selector-attr">[Client]</span>   ↓<span class="hljs-selector-attr">[API Gateway]</span>   ↓<span class="hljs-selector-attr">[AWS Lambda]</span>   ↓               ↘<span class="hljs-selector-attr">[DynamoDB]</span>      <span class="hljs-selector-attr">[RDS Proxy]</span> → <span class="hljs-selector-attr">[MySQL / PostgreSQL]</span>`</div></div>---

## 一、建立 DynamoDB Table

1. 打開 [DynamoDB Console](https://console.aws.amazon.com/dynamodb)
2. 點選「Create Table」
3. 設定：

<div id="bkmrk-%E9%A0%85%E7%9B%AE-%E5%80%BC-table-name-todo"><button class="hover:bg-token-main-surface-secondary text-token-text-secondary pointer-events-auto rounded-lg px-1 py-1 opacity-0 transition-opacity duration-200 group-focus-within:opacity-100 group-hover:opacity-100"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><div><table class="min-w-full" data-end="752" data-start="610"><thead data-end="643" data-start="610"><tr data-end="643" data-start="610"><th data-end="624" data-start="610">項目</th><th data-end="643" data-start="624">值</th></tr></thead><tbody data-end="752" data-start="681"><tr data-end="717" data-start="681"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="697" data-start="681">Table name</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="717" data-start="697">`Todos`</td></tr><tr data-end="752" data-start="718"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="734" data-start="718">Partition key</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="752" data-start="734">`id`（String）</td></tr></tbody></table>

</div></div>4. 其他預設即可，點「Create table」

---

## 二、撰寫 Lambda Function

### ✅ Lambda 功能：新增一筆 Todo 資料

程式語言以 Python 為例，並假設請求是 `POST`，Body 包含 `title` 欄位。

<div id="bkmrk-python-%E8%A4%87%E8%A3%BD%E7%B7%A8%E8%BC%AF-import-j"><div>python</div><div><div><div><span class="" data-state="closed"><button aria-label="複製" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>複製</button></span><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>編輯</button></span></div></div></div><div>`<span class="hljs-keyword">import</span> json<span class="hljs-keyword">import</span> uuid<span class="hljs-keyword">import</span> boto3dynamodb = boto3.resource(<span class="hljs-string">'dynamodb'</span>)table = dynamodb.Table(<span class="hljs-string">'Todos'</span>)<span class="hljs-keyword">def</span> <span class="hljs-title function_">lambda_handler</span>(<span class="hljs-params">event, context</span>):    body = json.loads(event[<span class="hljs-string">'body'</span>])    todo_id = <span class="hljs-built_in">str</span>(uuid.uuid4())    title = body.get(<span class="hljs-string">'title'</span>)    table.put_item(        Item={            <span class="hljs-string">'id'</span>: todo_id,            <span class="hljs-string">'title'</span>: title        }    )    <span class="hljs-keyword">return</span> {        <span class="hljs-string">'statusCode'</span>: <span class="hljs-number">200</span>,        <span class="hljs-string">'body'</span>: json.dumps({<span class="hljs-string">'id'</span>: todo_id, <span class="hljs-string">'title'</span>: title})    }`</div></div>✅ Lambda 要有以下 IAM 權限：

<div id="bkmrk-json-%E8%A4%87%E8%A3%BD%E7%B7%A8%E8%BC%AF-%7B-%22effect%22"><div>json</div><div><div><div><span class="" data-state="closed"><button aria-label="複製" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>複製</button></span><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>編輯</button></span></div></div></div><div>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"Effect"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Allow"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"Action"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>    <span class="hljs-string">"dynamodb:PutItem"</span>  <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"Resource"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"arn:aws:dynamodb:*:*:table/Todos"</span><span class="hljs-punctuation">}</span>`</div></div>> 可以在 Lambda 執行角色（Execution Role）中加上這段 policy。

---

## 三、建立 API Gateway 串接 Lambda

1. 打開 [API Gateway Console](https://console.aws.amazon.com/apigateway)
2. 建立一個「HTTP API」
3. 新增路由：
    
    
    - 方法：`POST`
    - 路徑：`/todos`
    - 整合：選擇剛剛的 Lambda
4. Deploy 完後，你會得到一個 API URL

使用 curl 或 Postman 測試：

<div id="bkmrk-bash-%E8%A4%87%E8%A3%BD%E7%B7%A8%E8%BC%AF-curl--x-po"><div>bash</div><div><div><div><span class="" data-state="closed"><button aria-label="複製" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>複製</button></span><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>編輯</button></span></div></div></div><div>`curl -X POST https://xxx.execute-api.ap-northeast-1.amazonaws.com/todos \  -H <span class="hljs-string">"Content-Type: application/json"</span> \  -d <span class="hljs-string">'{"title":"Write Lambda guide"}'</span>`</div></div>---

## 四、加碼：改用 RDS + RDS Proxy 作為資料層

### ✅ 為什麼使用 RDS Proxy？

- 解決 Lambda 對 RDS 連線過多問題
- 支援連線池（Connection pooling）
- 提高效率，降低 DB crash 風險

---

### 步驟 1：建立 RDS Proxy

1. 前往 [RDS Console](https://console.aws.amazon.com/rds)
2. 選單點「Proxies」→「Create proxy」
3. 設定：

<div id="bkmrk-%E9%A0%85%E7%9B%AE-%E5%80%BC-proxy-name-todo"><button class="hover:bg-token-main-surface-secondary text-token-text-secondary pointer-events-auto rounded-lg px-1 py-1 opacity-0 transition-opacity duration-200 group-focus-within:opacity-100 group-hover:opacity-100"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><div><table class="min-w-full" data-end="2582" data-start="2230"><thead data-end="2280" data-start="2230"><tr data-end="2280" data-start="2230"><th data-end="2247" data-start="2230">項目</th><th data-end="2280" data-start="2247">值</th></tr></thead><tbody data-end="2582" data-start="2335"><tr data-end="2388" data-start="2335"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2354" data-start="2335">Proxy name</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2388" data-start="2354">`todo-proxy`</td></tr><tr data-end="2436" data-start="2389"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2408" data-start="2389">Engine</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2436" data-start="2408">MySQL / PostgreSQL（需有資料庫）</td></tr><tr data-end="2484" data-start="2437"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2456" data-start="2437">Target RDS</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2484" data-start="2456">選擇現有的 RDS 實例</td></tr><tr data-end="2531" data-start="2485"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2504" data-start="2485">IAM Auth</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2531" data-start="2504">啟用（建議使用）</td></tr><tr data-end="2582" data-start="2532"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2551" data-start="2532">VPC</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="2582" data-start="2551">與 Lambda 相同 VPC</td></tr></tbody></table>

</div></div>> 建好後會給你一個 Proxy endpoint：例如 `todo-proxy.proxy-cdefg.ap-northeast-1.rds.amazonaws.com`

---

### 步驟 2：Lambda 改連 Proxy（Python）

安裝並打包 `pymysql`：

<div id="bkmrk-bash-%E8%A4%87%E8%A3%BD%E7%B7%A8%E8%BC%AF-pip-instal"><div>bash</div><div><div><div><span class="" data-state="closed"><button aria-label="複製" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>複製</button></span><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>編輯</button></span></div></div></div><div>`pip install pymysql -t .zip -r lambda-rds.zip .`</div></div>Lambda 程式碼範例：

<div id="bkmrk-python-%E8%A4%87%E8%A3%BD%E7%B7%A8%E8%BC%AF-import-p"><div>python</div><div><div><div><span class="" data-state="closed"><button aria-label="複製" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>複製</button></span><span class="" data-state="closed"><button class="flex items-center gap-1 px-4 py-1 select-none"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg>編輯</button></span></div></div></div><div>`<span class="hljs-keyword">import</span> pymysql<span class="hljs-keyword">import</span> os<span class="hljs-keyword">import</span> json<span class="hljs-keyword">import</span> uuid<span class="hljs-keyword">def</span> <span class="hljs-title function_">lambda_handler</span>(<span class="hljs-params">event, context</span>):    conn = pymysql.connect(        host=os.environ[<span class="hljs-string">'DB_PROXY_HOST'</span>],  <span class="hljs-comment"># Proxy endpoint</span>        user=os.environ[<span class="hljs-string">'DB_USER'</span>],        password=os.environ[<span class="hljs-string">'DB_PASSWORD'</span>],        database=os.environ[<span class="hljs-string">'DB_NAME'</span>],        connect_timeout=<span class="hljs-number">5</span>    )        <span class="hljs-keyword">try</span>:        body = json.loads(event[<span class="hljs-string">'body'</span>])        todo_id = <span class="hljs-built_in">str</span>(uuid.uuid4())        title = body[<span class="hljs-string">'title'</span>]                <span class="hljs-keyword">with</span> conn.cursor() <span class="hljs-keyword">as</span> cursor:            cursor.execute(<span class="hljs-string">"INSERT INTO todos (id, title) VALUES (%s, %s)"</span>, (todo_id, title))            conn.commit()        <span class="hljs-keyword">return</span> {            <span class="hljs-string">'statusCode'</span>: <span class="hljs-number">200</span>,            <span class="hljs-string">'body'</span>: json.dumps({<span class="hljs-string">'id'</span>: todo_id, <span class="hljs-string">'title'</span>: title})        }    <span class="hljs-keyword">finally</span>:        conn.close()`</div></div>---

### ✅ 注意：

- Lambda 要設定進入 **同 VPC + Subnet + SG**
- 建議設定 `AWSLambdaVPCAccessExecutionRole`
- Lambda 的 IAM Role 不需要存取 RDS Proxy，只需要 DB 連線資訊與網路存取權

---

## 五、小結

這篇教你從 0 建立一個完整的無伺服器應用：

<div id="bkmrk-%E5%85%83%E4%BB%B6-%E7%94%A8%E9%80%94-api-gateway-%E6%8F%90%E4%BE%9B"><button class="hover:bg-token-main-surface-secondary text-token-text-secondary pointer-events-auto rounded-lg px-1 py-1 opacity-0 transition-opacity duration-200 group-focus-within:opacity-100 group-hover:opacity-100"><svg class="icon-md-heavy" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"></svg></button><div><table class="min-w-full" data-end="4064" data-start="3781"><thead data-end="3828" data-start="3781"><tr data-end="3828" data-start="3781"><th data-end="3798" data-start="3781">元件</th><th data-end="3828" data-start="3798">用途</th></tr></thead><tbody data-end="4064" data-start="3881"><tr data-end="3927" data-start="3881"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="3900" data-start="3881">API Gateway</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="3927" data-start="3900">提供外部 API 接口</td></tr><tr data-end="3974" data-start="3928"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="3947" data-start="3928">Lambda</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="3974" data-start="3947">執行商業邏輯 Function</td></tr><tr data-end="4022" data-start="3975"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="3994" data-start="3975">DynamoDB / RDS</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="4022" data-start="3994">儲存資料</td></tr><tr data-end="4064" data-start="4023"><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="4042" data-start="4023">RDS Proxy</td><td class="max-w-[calc(var(--thread-content-max-width)*2/3)]" data-end="4064" data-start="4042">提升連線穩定性與效率</td></tr></tbody></table>

</div></div>這套架構非常適合：

- 小型 SaaS API
- 行動 App 後端
- MVP 初期應用快速開發
- 大型應用中的 Serverless 子系統（例如上傳任務、登入、Webhook 處理等）

---

太好了！這裡是你完整的加強版：  
**AWS Serverless Todo API 進階整合：Cognito 驗證、錯誤處理、Serverless Framework 快速部署**

這篇會在前面 Lambda + API Gateway + DynamoDB/RDS 架構上，補上以下三個常用進階功能：

1. ✅ **API Gateway JWT 驗證（Cognito）**
2. ✅ **Lambda 錯誤處理與 Logging 最佳實踐**
3. ✅ **使用 Serverless Framework 快速部署整套應用**

---

# Serverless Todo API 完整實戰進階篇

---

## 一、加入 Cognito 驗證保護 API

### ✅ 為什麼需要？

不管是 Web 前端還是 App，只要對外開 API，**基本保護機制不可少**。

AWS 的 Cognito 可以幫你處理：

- 使用者註冊 / 登入
- JWT Token 簽發與驗證
- 無需自建帳號系統！

---

### ✅ 建立 Cognito User Pool

1. 開啟 [Cognito Console](https://console.aws.amazon.com/cognito)
2. 建立一個 **User Pool**
    
    
    - Pool name: `todo-api-users`
    - 啟用 Email 登入即可
    - 完成後記住 Pool ID 和 Region
3. 建立 App Client
    
    
    - 禁用 client secret（Lambda 驗證用不到）
    - 儲存產生的 `App client ID`

---

### ✅ API Gateway 整合 JWT 驗證

1. 回到 API Gateway HTTP API Console
2. 選「Authorization」→「Create authorizer」
3. 建立 Cognito JWT authorizer：

<table id="bkmrk-%E9%A0%85%E7%9B%AE-%E8%A8%AD%E5%AE%9A-type-jwt-ident"><thead><tr><th>項目</th><th>設定</th></tr></thead><tbody><tr><td>Type</td><td>JWT</td></tr><tr><td>Identity source</td><td>`Authorization` header</td></tr><tr><td>Issuer URL</td><td>`https://cognito-idp.<region>.amazonaws.com/<pool-id>`</td></tr><tr><td>Audience</td><td>你剛剛的 App Client ID</td></tr></tbody></table>

4. 把 `/todos` 路徑設定為需要驗證（選上剛剛的 authorizer）

---

### ✅ 呼叫 API 時加上 JWT token

前端從 Cognito 登入取得 Token 後，呼叫 API 時帶上：

```http
Authorization: Bearer <token>

```

這樣 API Gateway 就會自動驗證使用者身份，Lambda 裡也可以透過 `event['requestContext']` 取得使用者資訊！

---

## 二、Lambda Logging 與 Error Handling 最佳實踐

### ✅ 記錄 Log 到 CloudWatch

在 Lambda 中使用標準輸出即可：

```python
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

logger.info("New todo created")

```

CloudWatch Logs 會自動收集這些 log。

---

### ✅ 最佳錯誤處理模式

```python
import json
import traceback

def lambda_handler(event, context):
    try:
        # 主邏輯
        ...
        return {
            'statusCode': 200,
            'body': json.dumps({'message': 'Success'})
        }
    except Exception as e:
        logger.error("Error: %s", traceback.format_exc())
        return {
            'statusCode': 500,
            'body': json.dumps({'error': 'Internal Server Error'})
        }

```

這樣可避免直接顯示錯誤堆疊給使用者，又方便自己 debug。

---

## 三、使用 Serverless Framework 快速部署整套應用

### ✅ 為什麼用 Serverless Framework？

- 自動建 Lambda、API Gateway、DynamoDB、IAM、環境變數
- 一鍵部署、一鍵刪除
- 適合團隊開發與 CI/CD

---

### ✅ 安裝 CLI 工具

```bash
npm install -g serverless

```

---

### ✅ 初始化專案

```bash
serverless create --template aws-python --path todo-api
cd todo-api

```

---

### ✅ 編輯 `serverless.yml`

以下是 Todo API + DynamoDB + JWT 驗證的簡化範例：

```yaml
service: todo-api

provider:
  name: aws
  runtime: python3.11
  region: ap-northeast-1
  environment:
    DB_TABLE: Todos
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:PutItem
      Resource: arn:aws:dynamodb:*:*:table/Todos

functions:
  createTodo:
    handler: handler.create
    events:
      - http:
          path: todos
          method: post
          authorizer:
            type: COGNITO_USER_POOLS
            userPoolArn: arn:aws:cognito-idp:ap-northeast-1:xxxx:userpool/xxxx

resources:
  Resources:
    TodosTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: Todos
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        BillingMode: PAY_PER_REQUEST

```

---

### ✅ Lambda 程式 `handler.py`

```python
import json
import uuid
import boto3
import os

table = boto3.resource('dynamodb').Table(os.environ['DB_TABLE'])

def create(event, context):
    data = json.loads(event['body'])
    todo_id = str(uuid.uuid4())

    table.put_item(Item={'id': todo_id, 'title': data['title']})

    return {
        'statusCode': 200,
        'body': json.dumps({'id': todo_id, 'title': data['title']})
    }

```

---

### ✅ 部署指令

```bash
sls deploy

```

幾十秒後，你就會拿到公開的 API URL！🎉

---

### ✅ 刪除整個堆疊（清資源）

```bash
sls remove

```

超級適合測試環境清除資源時使用，防止殘留帳單！

---

## ✅ 加碼：Lambda 搭配 RDS Proxy 用 Serverless Framework 管理

你可以在 `serverless.yml` 裡加上 VPC 設定：

```yaml
provider:
  ...
  vpc:
    securityGroupIds:
      - sg-xxxxxxxx
    subnetIds:
      - subnet-aaaa
      - subnet-bbbb

```

這樣部署後的 Lambda 就能存取你已經建立好的 RDS Proxy！

---

## 🔚 小結

這次進階整合包含：

✅ Cognito 驗證 ➜ 提供安全 API  
✅ Lambda Logging + Error Handling ➜ 更穩定、更易除錯  
✅ Serverless Framework ➜ 快速一鍵部署 / 一鍵刪除  
✅ 支援 DynamoDB / RDS Proxy ➜ 彈性資料層選擇

這套完整架構，適合你用來開發：

- SaaS MVP
- 微服務架構中的 User Service
- 內部工具（支援 Cognito 驗證）
- 全無伺服器 RESTful API

---

下一篇，我們將繼續探討  
**Day 9：AWS 容器服務 - EKS（Elastic Kubernetes Service）**，  
看看當需要更複雜的大型應用，想用 Kubernetes 架構時，AWS 是怎麼支援的！

Day 9 再見 👋