返回文章列表

ALB Lambda 整合與函式依賴管理

本文探討如何使用應用程式負載平衡器 (ALB) 呼叫 Lambda 函式,以及如何使用 Lambda Layers 管理函式的外部依賴套件。同時,文章也涵蓋了使用 EventBridge 定期觸發 Lambda 函式以及整合 EFS 進行無伺服器檔案處理的實務操作。

Web 開發 無伺服器

在現代 Web 應用程式架構中,整合 ALB 與 Lambda 可實作高效能且可擴充套件的無伺服器方案。透過設定 ALB 監聽器規則,可以將特定路徑的 HTTP 請求導向 Lambda 函式,實作動態內容生成和 API 服務等功能。同時,利用 Lambda Layers 可以有效管理 Python 函式的外部依賴,避免程式碼冗餘並簡化佈署流程。此外,EventBridge 的排程功能可自動觸發 Lambda 函式執行定期任務,例如資料備份和清理。最後,整合 EFS 則讓 Lambda 函式具備存取永續性儲存的能力,擴充套件了無伺服器應用程式的應用場景。

使用 ALB 呼叫 Lambda 函式的設定

問題描述

需要在網際網路上透過負載平衡器公開整個 Web 應用程式,而應用程式架構中包含無伺服器函式。需要某個函式能夠回應特定 URL 路徑的 HTTP 請求。

解決方案

授予 Elastic Load Balancing 服務呼叫 Lambda 函式的許可權;然後建立 Lambda 函式。建立 ALB 目標群組;然後將 Lambda 函式註冊到目標群組。將目標群組與 ALB 上的監聽器關聯。最後,新增一個監聽器規則,將 /function 路徑的流量導向 Lambda 函式。

準備工作

  • 具有兩個可用區域的公有子網路的 VPC 及相關聯的路由表
  • 一個應用程式負載平衡器,包含允許來自全世界的 80 連線埠的安全群組及在 80 連線埠上的監聽器
  • 允許 Lambda 函式執行的 IAM 角色

設定步驟

  1. 壓縮函式程式碼:壓縮本配方目錄中提供的函式程式碼,例如使用命令 zip lambda_function.zip lambda_function.py
  2. 建立 Lambda 函式
    LAMBDA_ARN=$(aws lambda create-function \
    --function-name AWSCookbook501Lambda \
    --runtime python3.8 \
    --package-type "Zip" \
    --zip-file fileb://lambda_function.zip \
    --handler lambda_function.lambda_handler --publish \
    --role arn:aws:iam::$AWS_ACCOUNT_ID:role/AWSCookbookLambdaRole \
    --output text --query FunctionArn)
    
  3. 建立 ALB 目標群組
    TARGET_GROUP_ARN=$(aws elbv2 create-target-group \
    --name awscookbook501tg \
    --target-type lambda --output text \
    --query TargetGroups[0].TargetGroupArn)
    
  4. 授予 Elastic Load Balancing 服務呼叫 Lambda 函式的許可權
    aws lambda add-permission \
    --function-name $LAMBDA_ARN \
    --statement-id load-balancer \
    --principal elasticloadbalancing.amazonaws.com \
    --action lambda:InvokeFunction \
    --source-arn $TARGET_GROUP_ARN
    
  5. 將 Lambda 函式註冊為目標
    aws elbv2 register-targets \
    --target-group-arn $TARGET_GROUP_ARN \
    --targets Id=$LAMBDA_ARN
    
  6. 修改 ALB 的監聽器並建立規則
    RULE_ARN=$(aws elbv2 create-rule \
    --listener-arn $LISTENER_ARN --priority 10 \
    --conditions Field=path-pattern,Values='/function' \
    --actions Type=forward,TargetGroupArn=$TARGET_GROUP_ARN \
    --output text --query Rules[0].RuleArn)
    

驗證檢查

測試呼叫以驗證請求 /function 時是否呼叫了 Lambda 函式:

curl -v $LOAD_BALANCER_DNS/function

使用 Lambda Layers 封裝函式庫

問題描述

有使用外部函式庫的 Python 程式碼,需要將其包含在無伺服器函式佈署中。

解決方案

建立一個資料夾,並使用 pip 將 Python 軟體包安裝到該資料夾。然後,將該資料夾壓縮,並使用 .zip 檔案建立 Lambda layer,供函式使用。

設定步驟

  1. 切換到目錄cd 502-Packaging-Libraries-with-Lambda-Layers/
  2. 壓縮 lambda_function.pyzip lambda_function.zip lambda_function.py
  3. 建立 Lambda 函式
    LAMBDA_ARN=$(aws lambda create-function \
    --function-name AWSCookbook502Lambda \
    --runtime python3.8 \
    --package-type "Zip" \
    --zip-file fileb://lambda_function.zip \
    --handler lambda_function.lambda_handler --publish \
    --role arn:aws:iam::$AWS_ACCOUNT_ID:role/AWSCookbookLambdaRole \
    --output text --query FunctionArn)
    
  4. 建立 layer 所需的目錄mkdir python
  5. 使用 pip 安裝 requests 模組到目錄pip install requests --target="./python"

程式碼詳細解說

建立 Lambda 函式的程式碼範例
import json

def lambda_handler(event, context):
    # 處理事件並傳回結果
    return {
        'statusCode': 200,
        'statusMessage': 'OK'
    }

詳細解說:

  1. import json:匯入處理 JSON 的模組。
  2. def lambda_handler(event, context)::定義 Lambda 函式的處理函式,其中 event 是事件物件,context 是執行上下文。
  3. return {...}:傳回一個包含 HTTP 狀態碼和狀態訊息的字典。
使用 pip 安裝 requests 模組的命令
pip install requests --target="./python"

詳細解說:

  1. pip install requests:使用 pip 安裝 requests 模組。
  2. --target="./python":指定安裝目標目錄為 ./python

使用AWS Lambda Layers管理Python函式的依賴

在開發AWS Lambda函式時,經常需要使用外部函式庫。AWS Lambda Layers提供了一種機制,可以將這些依賴項與Lambda函式程式碼分開管理,從而提高程式碼的可維護性和重用性。

建立Lambda Layer

要建立Lambda Layer,首先需要建立一個包含所需依賴項的目錄結構。以下是一個使用Python requests模組的例子:

  1. 建立一個名為python的目錄,並在其中安裝所需的依賴項:

    mkdir -p python
    pip install requests -t python/
    
  2. python目錄下的內容封裝成一個zip檔案:

    zip -r requests-layer.zip ./python
    

內容解密:

  • mkdir -p python:建立一個名為python的目錄,-p選項確保如果目錄已存在不會報錯。
  • pip install requests -t python/:使用pip安裝requests模組,並將其安裝到python目錄下。-t選項指定了安裝目標目錄。
  • zip -r requests-layer.zip ./python:將python目錄下的所有內容封裝成一個名為requests-layer.zip的zip檔案。-r選項表示遞迴地壓縮指定目錄下的所有檔案和子目錄。

釋出Lambda Layer

建立好zip檔案後,可以使用AWS CLI釋出Lambda Layer:

LAYER_VERSION_ARN=$(aws lambda publish-layer-version \
--layer-name AWSCookbook502RequestsLayer \
--description "Requests layer" \
--license-info "MIT" \
--zip-file fileb://requests-layer.zip \
--compatible-runtimes python3.8 \
--output text --query LayerVersionArn)

內容解密:

  • aws lambda publish-layer-version:釋出一個新的Lambda Layer版本。
  • --layer-name AWSCookbook502RequestsLayer:指定Layer的名稱。
  • --description "Requests layer":為Layer提供描述。
  • --license-info "MIT":指定Layer的授權資訊。
  • --zip-file fileb://requests-layer.zip:指定包含Layer內容的zip檔案。
  • --compatible-runtimes python3.8:指定Layer相容的Lambda執行環境。
  • --output text --query LayerVersionArn:輸出Layer版本的ARN。

更新Lambda函式以使用Layer

釋出Layer後,需要更新Lambda函式以使用該Layer:

aws lambda update-function-configuration \
--function-name AWSCookbook502Lambda \
--layers $LAYER_VERSION_ARN

內容解密:

  • aws lambda update-function-configuration:更新Lambda函式的組態。
  • --function-name AWSCookbook502Lambda:指定要更新的Lambda函式名稱。
  • --layers $LAYER_VERSION_ARN:指定要使用的Layer版本ARN。

驗證和測試

更新Lambda函式後,可以透過呼叫函式來驗證Layer是否正確載入:

aws lambda invoke \
--function-name AWSCookbook502Lambda \
response.json && cat response.json

內容解密:

  • aws lambda invoke:呼叫指定的Lambda函式。
  • --function-name AWSCookbook502Lambda:指定要呼叫的Lambda函式名稱。
  • response.json:將函式的輸出儲存到response.json檔案中。
  • && cat response.json:如果呼叫成功,則輸出response.json檔案的內容。

挑戰:建立另一個使用相同Layer的Lambda函式

為了進一步驗證Layer的可重用性,可以建立另一個Lambda函式並組態它使用相同的Layer。這樣可以確保Layer能夠被多個函式分享,並且簡化了依賴管理。

使用EventBridge定期呼叫Lambda函式

除了手動呼叫Lambda函式外,還可以使用AWS EventBridge根據預定的時間表自動呼叫函式。

步驟1:建立EventBridge規則

首先,需要建立一個EventBridge規則,並指定排程表示式:

RULE_ARN=$(aws events put-rule --name "EveryMinuteEvent" \
--schedule-expression "rate(1 minute)")

內容解密:

  • aws events put-rule:建立或更新EventBridge規則。
  • --name "EveryMinuteEvent":指定規則的名稱。
  • --schedule-expression "rate(1 minute)":定義規則的排程表示式,這裡是每分鐘觸發一次。

步驟2:授予EventBridge呼叫Lambda函式的許可權

需要授予EventBridge服務呼叫目標Lambda函式的許可權:

aws lambda add-permission --function-name $LAMBDA_ARN \
--action lambda:InvokeFunction --statement-id events \
--principal events.amazonaws.com

內容解密:

  • aws lambda add-permission:為Lambda函式新增呼叫許可權。
  • --function-name $LAMBDA_ARN:指定要授予許可權的Lambda函式ARN。
  • --action lambda:InvokeFunction:指定允許執行的操作,即呼叫函式。
  • --statement-id events:為許可權宣告指定一個唯一的ID。
  • --principal events.amazonaws.com:指定允許呼叫函式的主體,即EventBridge服務。

步驟3:將Lambda函式新增為EventBridge規則的目標

最後,將Lambda函式新增為EventBridge規則的目標:

aws events put-targets --rule EveryMinuteEvent \
--targets "Id"="1","Arn"="$LAMBDA_ARN"

內容解密:

  • aws events put-targets:為EventBridge規則設定目標。
  • --rule EveryMinuteEvent:指定要更新的規則名稱。
  • --targets "Id"="1","Arn"="$LAMBDA_ARN":定義目標,其中"Id"="1"是目標ID,"Arn"="$LAMBDA_ARN"是目標Lambda函式的ARN。

驗證

可以透過檢視CloudWatch日誌來驗證Lambda函式是否按照預定的時間表被呼叫:

aws logs tail "/aws/lambda/AWSCookbook503Lambda" --follow --since 10s

內容解密:

  • aws logs tail:實時檢視CloudWatch日誌的日誌事件。
  • /aws/lambda/AWSCookbook503Lambda:指定要檢視的日誌組名稱,對應於Lambda函式的日誌。
  • --follow:持續輸出最新的日誌事件。
  • --since 10s:僅顯示最近10秒內的日誌事件。

使用AWS Lambda與Amazon EFS實作無伺服器檔案處理

AWS Lambda是一種無伺服器運算服務,允許開發者執行程式碼而無需管理伺服器。與Amazon Elastic File System(EFS)結合使用時,可以實作無伺服器檔案處理。本文將介紹如何組態Lambda函式以存取EFS檔案系統。

問題背景

許多應用程式需要存取檔案系統以進行檔案處理。傳統上,這需要組態和管理伺服器。然而,使用AWS Lambda和Amazon EFS,可以在無伺服器架構中實作檔案處理。

解決方案

  1. 建立Lambda函式:首先,建立一個Lambda函式,並將EFS檔案系統掛載到該函式。
  2. 組態安全群組:建立一個新的安全群組供Lambda函式使用,並在EFS檔案系統的安全群組中新增一個入口規則,以允許來自Lambda函式安全群組的TCP連線埠2049的存取。
  3. 建立IAM角色:使用提供的assume-role-policy.json檔案建立一個IAM角色,並將AWSLambdaVPCAccessExecutionRole管理的策略附加到該角色。
  4. 建立Lambda函式並掛載EFS:建立Lambda函式,並指定EFS檔案系統的存取點ARN和本機掛載路徑/mnt/efs

程式碼範例:建立Lambda函式

LAMBDA_ARN=$(aws lambda create-function \
--function-name AWSCookbook504Lambda \
--runtime python3.8 \
--package-type "Zip" \
--zip-file fileb://lambda_function.zip \
--handler lambda_function.lambda_handler --publish \
--role arn:aws:iam::$AWS_ACCOUNT_ID:role/AWSCookbook504Role \
--file-system-configs Arn="$ACCESS_POINT_ARN",LocalMountPath="/mnt/efs" \
--output text --query FunctionArn \
--vpc-config SubnetIds=${ISOLATED_SUBNETS},SecurityGroupIds=${LAMBDA_SG_ID})

內容解密:

此命令用於建立一個Lambda函式,指定了執行階段、處理常式、角色和檔案系統組態。其中,--file-system-configs引數用於指定EFS檔案系統的存取點ARN和本機掛載路徑。

驗證與測試

  1. 檢查Lambda函式狀態:使用aws lambda get-function命令檢查Lambda函式是否進入活動狀態。
  2. 執行Lambda函式:執行Lambda函式以顯示檔案內容。

程式碼範例:執行Lambda函式

aws lambda invoke \
--function-name $LAMBDA_ARN \
response.json && cat response.json

內容解密:

此命令用於執行Lambda函式,並將輸出儲存到response.json檔案中。然後,使用cat命令顯示該檔案的內容。

討論

將AWS Lambda與Amazon EFS結合使用,可以實作無伺服器檔案處理,從而減少運作開銷和成本。這種架構適用於需要存取檔案系統的應用程式,例如永續性儲存和維護活動。