iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0

在前幾篇文章中,我們完成了 Cognito + API Gateway + Lambda 的串接,讓前端能在驗證身分後呼叫後端。 今天開始,我們要將「資料」放進系統裡 —— 使用 Amazon DynamoDB 作為多人協作平台的儲存基礎。


DynamoDB 是什麼?

DynamoDB 是 AWS 提供的 NoSQL 資料庫服務,它的特色是:

  • 無伺服器 (Serverless):不用自己架資料庫,AWS 全權管理。
  • 高擴展性:自動分散在多個節點,處理大量讀寫請求。
  • 彈性 Schema:同一張 Table 裡的資料結構可以不一樣。
  • 按使用量付費:適合初學者和小專案。

DynamoDB 的基本概念

在 DynamoDB 裡,主要有三個需要理解的概念:

  1. Table(資料表)

    • 我們可以建立一個 Trips 表來儲存行程資訊。
  2. Partition Key(分割鍵)

    • 每筆資料的「唯一識別」。
    • 在專案中,暫時可以用 tripId 代表。
  3. Sort Key(排序鍵,可選)

    • 搭配 Partition Key,幫助更有效率地查詢。

https://ithelp.ithome.com.tw/upload/images/20250831/20178103ZYMPDvTltY.png

圖取自Choosing the Right DynamoDB Partition Key


等一下,都說 NoSQL 了怎麼還有 Table?

在傳統的關聯式資料庫(RDB, Relational Database)裡,
「Table」是非常嚴謹的結構:

  • 固定 Schema:每一列都有一樣的欄位。
  • 強一致性:靠 Foreign Key、Join、Transaction 維持資料完整性。

DynamoDB 也用「Table」這個詞,但意思不太一樣:

  • Table 只是 資料的邏輯容器(類似一個命名空間)。
  • 資料單位是 Item,每個 Item 其實就是一個 JSON-like 文件。
  • 每個 Item 的結構不一定相同,不需要固定欄位。
  • 唯一要求:必須有 Primary Key(Partition Key + 可選的 Sort Key),用來決定資料怎麼被分散儲存。

RDB Table DynamoDB Table
Schema 固定欄位 動態欄位 (每筆資料可以不同)
主鍵 Primary Key (常配合 Foreign Key) Partition Key (+ Sort Key)
儲存單位 Row (列) Item (JSON-like 文件)
功能重點 關聯 & 查詢 高效查 Key & 擴展性

所以可以把 DynamoDB Table 理解成:
「一個裝著很多 JSON 文件的資料夾,只是這些文件都必須有個唯一的 Key。」

接下來我們會從這個角度,看看怎麼設計 Table 給專案使用。

實作:建立 DynamoDB Table

Step 1. 在 Console 建立 Table

前往 AWS Console → DynamoDB → Create table

https://ithelp.ithome.com.tw/upload/images/20250831/20178103uGNBl2saHw.png

Table name:DemoTable
Partition key:userId (String)
Sort key:itemId (String)
其他設定用預設值即可(Free Tier 已經足夠)。

建立完成後,你就擁有了一個可以存放資料的 DynamoDB Table。


Step 2. 用 Lambda 測試存取 DynamoDB

接著我們建立一個最簡單的 Lambda function,目標只是:

  • 寫入一筆 Item
  • 讀取剛剛寫入的 Item

程式碼範例我會另外放在 GitHub repo,這裡先聚焦概念:

  1. Lambda 使用 AWS SDK (boto3 for Python)。
  2. put_item 可以新增一筆資料。
  3. get_item 可以根據 Key 把資料取出。
# Lambda CRUD 範例

import boto3
import os
from boto3.dynamodb.conditions import Key

dynamodb = boto3.resource('dynamodb')
table_name = os.environ.get("TABLE_NAME", "TodoTable")
table = dynamodb.Table(table_name)

# Create
def create_todo(user_id, todo_id, content):
    table.put_item(Item={
        "userId": user_id,
        "todoId": todo_id,
        "content": content
    })

# Read
def get_todos(user_id):
    response = table.query(
        KeyConditionExpression=Key("userId").eq(user_id)
    )
    return response.get("Items", [])

# Update
def update_todo(user_id, todo_id, new_content):
    table.update_item(
        Key={"userId": user_id, "todoId": todo_id},
        UpdateExpression="SET content = :c",
        ExpressionAttributeValues={":c": new_content}
    )

# Delete
def delete_todo(user_id, todo_id):
    table.delete_item(Key={"userId": user_id, "todoId": todo_id})


Step 3. 與專案的連結

將 CRUD 與 API Gateway + Cognito 串接

在實務專案中,Lambda 不是單獨運作的,通常會透過 API Gateway 接收前端請求,並用 Cognito 驗證使用者身份。這樣可以確保:

  1. 使用者登入後取得的 JWT Token 是合法的。
  2. Lambda 只能存取該使用者自己的資料。
  3. CRUD 流程有認證和授權的保護。

整個流程概念如下:

  1. 使用者登入 → Cognito 發 Token (JWT)
  2. 前端呼叫 API Gateway,HTTP Header 帶上 Token
  3. API Gateway 驗證 Token,合法才放行
  4. Lambda 透過 event(包含API Gateway傳回的Token) 拿到使用者資訊、根據使用者的資訊執行 CRUD 操作
  5. Lambda 回傳結果給前端

程式碼示範:

# Lambda + API Gateway 認證示範

import json
import boto3
import os
from boto3.dynamodb.conditions import Key

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ.get("TABLE_NAME", "TodoTable"))

def lambda_handler(event, context):
    # Cognito 認證資訊會在 event['requestContext']['authorizer'] 內
    user_id = event['requestContext']['authorizer']['claims']['sub']
    
    http_method = event['httpMethod']
    if http_method == "GET":
        items = table.query(KeyConditionExpression=Key("userId").eq(user_id)).get("Items", [])
        return {"statusCode": 200, "body": json.dumps(items)}
    
    elif http_method == "POST":
        body = json.loads(event['body'])
        table.put_item(Item={"userId": user_id, "todoId": body["todoId"], "content": body["content"]})
        return {"statusCode": 200, "body": json.dumps({"message": "Created"})}
    
    # Update & Delete 可以依照前面 CRUD 範例實作

小結

今天我們完成了:

  • 認識 DynamoDB 的基本概念(Table / Item / Key)
  • 在 Console 建立一張測試用的 Table
  • 用 Lambda 驗證 DynamoDB 的基本操作(寫入 / 讀取)

下一篇,我們會繼續探索 如何設計資料表結構,並逐步帶入專案的實際需求。


上一篇
Day20 用 AWS CloudWatch 來觀測與除錯你的 Serverless API | Log Group、Log Stream、Events
下一篇
Day22 DynamoDB 單表設計 (Single Table Design) | PK&SK、GSI、LSI 實現查詢邏輯
系列文
一步步帶你認識 Cloud Native —— 用AWS免費服務打造雲原生專案23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言