了解 Lambda 的執行模型

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

Claudio Canales

Senior DevOps Engineer

自動執行

事件驅動的 AWS

  • 有事件發生時,Lambda 才執行程式碼。
  • 例:S3 上傳 -> 調整影像尺寸。
  • 觸發不同,模式相同。
使用 AWS Lambda 的無伺服器應用程式

觸發前皆閒置

閒置 -> 事件 -> 執行 -> 停止

  • 閒置:不執行。
  • 有事件:執行處理器,然後停止。

Lambda 的感應燈類比

  • 就像感應燈:被觸發前皆閒置。
  • 觸發將「關」切換為「開」。
使用 AWS Lambda 的無伺服器應用程式

什麼是 AWS Lambda?

AWS Lambda 一覽

  • 事件驅動的運算服務。
  • 隨需求自動擴縮。
  • 只為執行時間付費。
使用 AWS Lambda 的無伺服器應用程式

Lambda 如何執行你的程式碼

Lambda 執行流程

  • 事件來源會觸發 Lambda。
  • Lambda 將事件負載傳給你的處理器。
  • 你的處理器回傳結果。
使用 AWS Lambda 的無伺服器應用程式

隨需求擴縮

擴充會建立更多環境

  • 事件越多:平行呼叫越多。
  • Lambda 會啟動更多執行環境。
  • 新環境可能發生冷啟動。
使用 AWS Lambda 的無伺服器應用程式

處理器函式

def lambda_handler(event, context):
    # Your code here
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
  • event:輸入負載(JSON)。
  • context:執行期中繼資料。
  • return:輸出(或成敗)。

處理器接收 event 與 context

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

event 物件

物件儲存事件負載

S3 事件:bucket + 物件 key。

# event["Records"][0]["s3"]
{
  "bucket": {"name": "my-bucket"},
  "object": {"key": "data.csv"}
}
  • 同樣的工作:擷取所需欄位。

HTTP 請求事件負載

API 事件:方法、路徑、本文。

# API request event
{
  "httpMethod": "POST",
  "path": "/users",
  "body": "{\"name\": \"John\"}"
}
  • 觸發不同,JSON 也不同。
使用 AWS Lambda 的無伺服器應用程式

context 物件

def lambda_handler(event, context):
    time_left = (
        context.get_remaining_time_in_millis()
    )
    request_id = context.aws_request_id
  • get_remaining_time_in_millis 距離逾時的剩餘時間。
  • aws_request_id 用於日誌追蹤的請求 ID。
使用 AWS Lambda 的無伺服器應用程式

無狀態執行

熱啟重用 vs 重設

  • 每次呼叫彼此獨立。
  • 可能重用,但不保證。
  • 狀態請存於 Lambda 之外。
counter = 0

def lambda_handler(event, context):
    global counter
    counter += 1  # may reset
    return counter
使用 AWS Lambda 的無伺服器應用程式

冷啟動

冷啟動時間軸

  • 建立新的執行環境。
  • 載入程式碼與相依套件。
  • 先跑初始化,再執行處理器。
使用 AWS Lambda 的無伺服器應用程式

熱啟動

熱啟動時間軸

  • 重用既有環境。
  • 略過多數初始化。
  • 處理器更快執行。
使用 AWS Lambda 的無伺服器應用程式

初始化、呼叫、凍結

執行環境生命週期

  • 初始化每個環境只跑一次。
  • 處理器每次呼叫都會執行。
  • 執行間隔期間,環境可能凍結。
使用 AWS Lambda 的無伺服器應用程式

為冷啟動最佳化

# init (once per env)
import boto3
s3 = boto3.client('s3')
# handler (every invocation)
def lambda_handler(event, context):
    return {"statusCode": 200}

初始化一次 vs 每次呼叫的處理器

  • 將匯入與 SDK 用戶端放在處理器外。
使用 AWS Lambda 的無伺服器應用程式

一起來練習吧!

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

Preparing Video For Download...