

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Rust 支援 Lambda 受管執行個體
<a name="lambda-managed-instances-rust"></a>

## 並行組態
<a name="lambda-managed-instances-rust-concurrency-config"></a>

Lambda 傳送至每個執行環境的並行請求數目上限是由函數組態中的 `PerExecutionEnvironmentMaxConcurrency`設定所控制。這是選用設定，而 Rust 的預設值為每個 vCPU 8 個並行請求，或者您可以設定自己的值。此值會決定執行時間產生的 Tokio 任務數量，並在執行環境的生命週期內為靜態。每個工作者一次只處理一個傳輸中請求，每個工作者都沒有多工。Lambda 會根據每個執行環境的容量，自動調整並行請求的數量，直到設定的最大值為止，以吸收這些請求。

## 為多並行建置函數
<a name="lambda-managed-instances-rust-building"></a>

使用 Lambda 受管執行個體時，您應該套用與任何其他多執行緒環境中相同的執行緒安全實務。由於處理常式物件會跨所有工作者執行緒共用，因此任何變動狀態都必須是執行緒安全。這包括集合、資料庫連線，以及在請求處理期間修改的任何靜態物件。

若要啟用並行請求處理，請將`concurrency-tokio`功能旗標新增至 `Cargo.toml` 檔案。

```
[dependencies]  
lambda_runtime = { version = "1", features = ["concurrency-tokio"] }
```

`lambda_runtime::run_concurrent(…)` 進入點必須在 Tokio 執行時間內從 呼叫，通常由主要函數上的 `#[tokio::main]` 屬性提供。您的處理常式關閉必須實作 [https://doc.rust-lang.org/std/clone/trait.Clone.html](https://doc.rust-lang.org/std/clone/trait.Clone.html) \$1 [https://doc.rust-lang.org/std/marker/trait.Send.html](https://doc.rust-lang.org/std/marker/trait.Send.html)。這可讓架構安全地跨多個非同步任務共用您的處理常式。如果不符合這些邊界，您的程式碼將無法編譯。

當您需要跨調用 （資料庫集區、組態結構） 的共用狀態時，請將它包裝在 中，[https://doc.rust-lang.org/std/sync/struct.Arc.html](https://doc.rust-lang.org/std/sync/struct.Arc.html)並將 `Arc` 複製到每個調用中。

所有適用於 Rust 的 AWS SDK 用戶端都具有並行安全性，不需要特殊處理。

### 範例： AWS SDK 用戶端
<a name="lambda-managed-instances-rust-example-sdk"></a>

下列範例使用 S3 用戶端在每次叫用時上傳物件。在沒有 的情況下，用戶端會直接複製到關閉中`Arc`：

```
let config = aws_config::load_defaults(BehaviorVersion::latest()).await;  
let s3_client = aws_sdk_s3::Client::new(&config);  
  
run_concurrent(service_fn(move |event: LambdaEvent<Request>| {  
    let s3_client = s3_client.clone(); // cheap clone, no Arc needed  
    async move {  
        s3_client.put_object()  
            .bucket(&event.payload.bucket)  
            .key(&event.payload.key)  
            .body(event.payload.body.into_bytes().into())  
            .send()  
            .await?;  
        Ok(Response { message: "uploaded".into() })  
    }  
}))  
.await
```

### 範例：資料庫連線集區
<a name="lambda-managed-instances-rust-example-db"></a>

當您的處理常式需要存取共用狀態，例如用戶端和組態時，請將它包裝在 中，[https://doc.rust-lang.org/std/sync/struct.Arc.html](https://doc.rust-lang.org/std/sync/struct.Arc.html)並將 `Arc` 複製到每個調用中：

```
#[derive(Debug)]  
struct AppState {  
    dynamodb_client: DynamoDbClient,  
    table_name: String,  
    cache_ttl: Duration,  
}  
  
let config = aws_config::load_defaults(BehaviorVersion::latest()).await;  
let state = Arc::new(AppState {  
    dynamodb_client: DynamoDbClient::new(&config),  
    table_name: std::env::var("TABLE_NAME").expect("TABLE_NAME must be set"),  
    cache_ttl: Duration::from_secs(300),  
});  
  
run_concurrent(service_fn(move |event: LambdaEvent<Request>| {  
    let state = state.clone();  
    async move { handle(event, state).await }  
}))  
.await
```

## 共用 /tmp 目錄
<a name="lambda-managed-instances-rust-tmp"></a>

`/tmp` 目錄會在相同執行環境中的所有並行調用之間共用。每次叫用使用唯一的檔案名稱 （例如包含請求 ID) 或實作明確檔案鎖定以避免資料損毀。

## 日誌
<a name="lambda-managed-instances-rust-logging"></a>

日誌交錯 （來自在日誌中交錯之不同請求的日誌項目） 在多並行系統中是正常的。使用 Lambda 受管執行個體的函數透過 Lambda 的[進階記錄控制](monitoring-logs.md#monitoring-cloudwatchlogs-advanced)支援結構化 JSON 日誌格式。此格式包含 `requestId`，允許日誌項目與單一請求相關聯。如需詳細資訊，請參閱 [實作帶有追蹤套件的進階日誌記錄](rust-logging.md#rust-logging-tracing)。

## 請求內容
<a name="lambda-managed-instances-rust-context"></a>

`Context` 物件會直接傳遞至每個處理常式調用。使用 `event.context.request_id` 存取目前請求的請求 ID。

使用 `event.context.xray_trace_id` 存取 X-Ray 追蹤 ID。Lambda 不支援具有 Lambda 受管執行個體`_X_AMZN_TRACE_ID`的環境變數。使用適用於 Rust 的 AWS SDK 時，會自動傳播 X-Ray 追蹤 ID。

使用 `event.context.deadline` 來偵測逾時 — 它包含以毫秒為單位的調用截止日期。

## 初始化和關閉
<a name="lambda-managed-instances-rust-lifecycle"></a>

每個執行環境會發生一次函數初始化。在初始化期間建立的物件會跨請求共用。

對於具有擴充功能的 Lambda 函數，執行環境會在關閉期間發出 SIGTERM 訊號。延伸項目使用此訊號來觸發清除任務，例如排清緩衝區。 `lambda_runtime`提供協助程式，以簡化設定正常的關閉訊號處理[https://docs.rs/lambda_runtime/latest/lambda_runtime/fn.spawn_graceful_shutdown_handler.html](https://docs.rs/lambda_runtime/latest/lambda_runtime/fn.spawn_graceful_shutdown_handler.html)。若要詳細了解執行環境生命週期，請參閱 [了解 Lambda 執行環境生命週期](lambda-runtime-environment.md)。

## 相依性版本
<a name="lambda-managed-instances-rust-dependencies"></a>

Lambda 受管執行個體需要下列最低套件版本：
+ `lambda_runtime`：1.1.1 版或更新版本，並啟用 `concurrency-tokio`功能
+ 支援的 Rust 版本 (MSRV) 下限為 1.84.0。