本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Rust Lambda 定義函數處理程序
注意
Rust 執行期用戶端
Lambda 函數處理常式是您的函數程式碼中處理事件的方法。當有人呼叫您的函數時,Lambda 會執行處理常式方法。函數會執行,直到處理常式傳回回應、結束或逾時為止。
銹處理程序基礎
將您的 Lambda 函數程式碼編寫為 Rust 可執行檔。實作處理常式函數程式碼和主函數,並包含以下內容:
-
來自 crates.io 的 lambda_runtime
套件,它可實作 Rust 的 Lambda 程式設計模型。 -
將 Tokio
包含在相依項中。Lambda 的 Rust 執行期用戶端 使用 Tokio 來處理非同步呼叫。
範例 — 處理事件的 Rust 處理JSON程序
下列範例會使用 serde_json
use lambda_runtime::{service_fn, LambdaEvent, Error}; use serde_json::{json, Value}; async fn handler(event: LambdaEvent<Value>) -> Result<Value, Error> { let payload = event.payload; let first_name = payload["firstName"].as_str().unwrap_or("world"); Ok(json!({ "message": format!("Hello, {first_name}!") })) } #[tokio::main] async fn main() -> Result<(), Error> { lambda_runtime::run(service_fn(handler)).await }
注意下列事項:
-
use
:匯入 Lambda 函數所需的程式庫。 -
async fn main
:執行 Lambda 函數程式碼的進入點。Rust 執行期用戶端使用 Tokio作為異步執行期,因此您必須使用 #[tokio::main]
來標註主函數。 -
async fn handler(event: LambdaEvent<Value>) -> Result<Value,
Error
>
:這是 Lambda 處理常式簽章。它包含叫用函數時執行的程式碼。-
LambdaEvent<Value>
:這是一個一般類型,描述 Lambda 執行期接收的事件以及 Lambda 函數內容。 -
Result<Value, Error>
:該函數會傳回Result
類型。如果函數成功,則結果為一個JSON值。如果函數不成功,則結果為錯誤。
-
使用共用狀態
您可以宣告獨立於 Lambda 函數處理常式程式碼的共用變數。這些變數可協助您在函數接收任何事件之前在 初始化階段 過程中載入狀態資訊。
範例 – 跨函數執行個體共用 Amazon S3 用戶端
注意下列事項:
-
use aws_sdk_s3::Client
:此範例要求您將aws-sdk-s3 = "0.26.0"
新增到Cargo.toml
檔案中的相依項清單。 -
aws_config::from_env
:此範例要求您將aws-config = "0.55.1"
新增到Cargo.toml
檔案中的相依項清單。
use aws_sdk_s3::Client; use lambda_runtime::{service_fn, Error, LambdaEvent}; use serde::{Deserialize, Serialize}; #[derive(Deserialize)] struct Request { bucket: String, } #[derive(Serialize)] struct Response { keys: Vec<String>, } async fn handler(client: &Client, event: LambdaEvent<Request>) -> Result<Response, Error> { let bucket = event.payload.bucket; let objects = client.list_objects_v2().bucket(bucket).send().await?; let keys = objects .contents() .map(|s| s.iter().flat_map(|o| o.key().map(String::from)).collect()) .unwrap_or_default(); Ok(Response { keys }) } #[tokio::main] async fn main() -> Result<(), Error> { let shared_config = aws_config::from_env().load().await; let client = Client::new(&shared_config); let shared_client = &client; lambda_runtime::run(service_fn(move |event: LambdaEvent<Request>| async move { handler(&shared_client, event).await })) .await }
Rust 函數的程式碼最佳實務
在建置 Lambda 函數時,請遵循下列清單中的準則,以使用最佳程式碼撰寫實務:
-
區隔 Lambda 處理常式與您的核心邏輯。能允許您製作更多可測單位的函式。
-
最小化依存項目的複雜性。偏好更簡易的框架,其可快速在執行環境啟動時載入。
-
將部署套件最小化至執行時間所必要的套件大小。這能減少您的部署套件被下載與呼叫前解壓縮的時間。
-
請利用執行環境重新使用來改看函式的效能。初始化函數處理常式之外的SDK用戶端和資料庫連線,並在
/tmp
目錄本機快取靜態資產。由您函式的相同執行個體處理的後續叫用可以重複使用這些資源。這可藉由減少函數執行時間來節省成本。若要避免叫用間洩漏潛在資料,請不要使用執行環境來儲存使用者資料、事件,或其他牽涉安全性的資訊。如果您的函式依賴無法存放在處理常式內記憶體中的可變狀態,請考慮為每個使用者建立個別函式或個別函式版本。
-
使用 Keep-Alive 指令維持持續連線的狀態。Lambda 會隨著時間的推移清除閒置連線。叫用函數時嘗試重複使用閒置連線將導致連線錯誤。若要維護持續連線,請使用與執行階段相關聯的 keep-alive (保持啟用) 指令。如需範例,請參閱在 Node.js 中重複使用 Keep-Alive 的連線。
-
使用環境變數將操作參數傳遞給您的函數。例如,如果您正在寫入到 Amazon S3 儲存貯體,而非對您正在寫入的儲存貯體名稱進行硬式編碼,請將儲存貯體名稱設定為環境變數。
-
避免在 Lambda 函數中使用遞迴叫用,函數會自行叫用或啟動可能再次叫用函數的程序。這會導致意外的函式呼叫量與升高的成本。如果您看到非預期的叫用量,請在更新程式碼時
0
立即將保留並行的函數設定為限制所有呼叫函式。 -
請勿在 Lambda 函數程式碼中使用非公開APIs的非公開文件。對於 AWS Lambda 受管執行階段,Lambda 會定期將安全性和功能更新套用至 Lambda 的內部APIs。這些內部API更新可能向後不兼容,導致意外後果,例如,如果您的函數依賴於這些非公共功能,則會導致調用失敗。APIs如需公開可用的清單,請API參閱參考資料APIs。
-
撰寫等冪程式碼。為函數撰寫等冪程式碼可確保採用相同方式來處理重複事件。程式碼應正確驗證事件並正常處理重複的事件。如需詳細資訊,請參閱 How do I make my Lambda function idempotent?
(如何讓 Lambda 函數等冪?)。