將 Lambda 與 AWS 服務整合

使用 AWS Lambda 的無伺服器應用程式

Claudio Canales

Senior DevOps Engineer

整合迴圈

  • 事件輸入。
  • 處理器邏輯。
  • SDK 呼叫。

事件 -> 處理器 -> SDK 迴圈

使用 AWS Lambda 的無伺服器應用程式

觸發條件 vs SDK 呼叫

觸發條件

  • 決定 Lambda 何時執行。

SDK 呼叫(於處理器內)

  • 存取 DynamoDB、S3 等服務的讀寫。

觸發條件 vs SDK 呼叫

使用 AWS Lambda 的無伺服器應用程式

具體範例

  • 檔案上傳到 S3。
  • 觸發 Lambda。
  • 在 DynamoDB 儲存一筆記錄。

S3 上傳 -> Lambda -> DynamoDB

使用 AWS Lambda 的無伺服器應用程式

事件載荷:找出需要的欄位

{
  "Records": [{
    "s3": {
      "bucket": {"name": "…"},
      "object": {"key": "…"}
    }
  }]
}

S3 事件載荷重點標示

使用 AWS Lambda 的無伺服器應用程式

AWS SDK 的角色

  • 你的程式碼呼叫 SDK(boto3)。
  • SDK 代表你呼叫 AWS API。
  • IAM 是存取的守門員。

處理器 -> SDK -> AWS API

使用 AWS Lambda 的無伺服器應用程式

執行角色 = 憑證

  • 執行角色提供臨時憑證。
  • 程式碼中不放存取金鑰。
  • 角色無權呼叫某 API,就會導致 SDK 失敗。

執行角色提供憑證

使用 AWS Lambda 的無伺服器應用程式

最小權限:限定動作與資源

  • 降低影響範圍。
  • 僅授予必要的動作與資源。
  • 除非必要,避免使用萬用字元。

最小權限:動作與資源範圍

使用 AWS Lambda 的無伺服器應用程式

DynamoDB:選對操作

  • PutItem 負責寫入。
  • GetItem 依鍵讀取。
  • Query 尋找相關項目。
  • 優先使用精準操作,避免廣泛掃描。

DynamoDB 操作

使用 AWS Lambda 的無伺服器應用程式

S3:操作 bucket + key

  • 物件的位置由 bucket 與 key 決定。
  • GetObject 取得內容。
  • PutObject 寫入新的衍生檔。

S3 bucket 與 key

使用 AWS Lambda 的無伺服器應用程式

將設定放入環境變數

  • 硬編資源名稱很脆弱。
  • 使用環境變數。
  • 同一份程式碼可佈署到 dev 與 prod。

環境變數設定

使用 AWS Lambda 的無伺服器應用程式

SDK 程式碼:保持精簡且可測試

import boto3
ddb = boto3.client("dynamodb")
def handler(event, context):
    ddb.put_item(
        TableName="files",
        Item={"pk": {"S": "1"}},
    )
  • 驗證輸入、呼叫 SDK、回傳結果。
  • 對純邏輯做單元測試。

小型處理器與 SDK 呼叫

使用 AWS Lambda 的無伺服器應用程式

刻意處理 SDK 錯誤

  • 初期常見權限錯誤。
  • 呼叫失敗時,讓原因一目了然。
  • 良好日誌有助於更安全的偵錯。

成功與失敗路徑

使用 AWS Lambda 的無伺服器應用程式

當 IAM 設錯時,程式碼看起來沒問題

AccessDeniedException
required action denied
  • 先修正 IAM,再處理處理器邏輯。

拒絕存取

使用 AWS Lambda 的無伺服器應用程式

冪等性:安全重試與重複事件

  • 可能會收到相同事件兩次。
  • 使用冪等鍵避免重複處理。
  • 條件式寫入可安全處理重送。

冪等鍵模式

使用 AWS Lambda 的無伺服器應用程式

整合全貌(端到端)

  • S3 事件提供 bucket 與 key。
  • 處理器解析其內容。
  • PutItem 將中繼資料寫入 DynamoDB。
  • CloudWatch Logs 呈現整個過程。

端到端整合摘要

使用 AWS Lambda 的無伺服器應用程式

重點回顧

  • 區分觸發條件與 SDK 呼叫。
  • 用執行角色嚴控權限。
  • 用環境變數讓設定可移植。

整合重點回顧

使用 AWS Lambda 的無伺服器應用程式

一起來練習吧!

使用 AWS Lambda 的無伺服器應用程式

Preparing Video For Download...