本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Lambda SnapStart 處理唯一性
SnapStart 函數上的呼叫擴展時,Lambda 會使用單一初始化快照來恢復多個執行環境。如果您的初始化程式碼會產生包含在快照中的唯一內容,則在跨執行環境中重複使用該內容時,該內容可能不是唯一的。若要在使用 SnapStart 時保持唯一性,您必須在初始化後產生唯一的內容。這包括唯一 ID、唯一密碼,以及用來產生偽隨機性的熵。
以下是維持程式碼唯一性的建議最佳實務。對於 Java 函數,Lambda 還提供開放原始碼 SnapStart 掃描工具,協助檢查確保唯一性的程式碼。如果您在初始化階段產生唯一資料,便可使用執行階段掛鉤來還原唯一性。使用執行階段掛鉤,您可以在 Lambda 建立快照前執行特定程式碼,或在 Lambda 從快照恢復函數後立即執行特定程式碼。
避免儲存初始化期間依賴唯一性的狀態
在函數的初始化階段,請避免快取預定為唯一的資料,例如產生用於日誌記錄的唯一 ID 或設定隨機函數的種子。相反地,建議您在函數處理常式中產生唯一的資料或設定隨機函數的種子,或使用執行時期勾點進行這些操作。
以下程式碼範例示範如何在函數處理常式中產生 UUID。
使用密碼編譯安全的虛擬隨機數產生器 (CSPRNGs)
啟用 SnapStart 時,Lambda 會擷取函數執行環境的快照,包括所有應用程式和系統記憶體。這表示每個亂數產生器 (RNG) 的內部狀態會與快照時間完全相同,以及應用程式或其相依項已產生並儲存在記憶體緩衝區中的任何隨機位元組。
當 Lambda 從快照還原執行環境時,它會以/dev/urandom新的熵從 /dev/random和 重新植入核心隨機數字產生器。直接從這些裝置讀取隨機數字的軟體會使用 SnapStart 維持隨機性。
如果您的應用程式依賴隨機性,建議您使用密碼編譯安全隨機數產生器 (CSPRNGs)。除了 AL 提供的 OpenSSL 之外,支援 SnapStart 的 Lambda 受管執行期 (Java 版本 11+、Python 版本 3.12+ 和 .NET 版本 8+),還包含下列內建 CSPRNGs:
-
Java:
java.security.SecureRandom -
Python:
random.SystemRandom -
.NET:
System.Security.Cryptography.RandomNumberGenerator
注意
對於 Go Lambda 執行期,如果您的函數使用標準程式庫的 crypto/rand,則不需要變更,這是預設與 snapstart 相容。
當您將函數封裝為容器映像時,您的基礎映像會決定與 SnapStart 的唯一性相容性:
-
受管執行時間的 Lambda 基礎映像 (Java 版本 11+、Python 版本 3.12+ 和 .NET 版本 8+) – 與上述 SnapStart 相容。
-
provided.al2023 基礎映像 – 如果您的程式設計語言執行時間從 Amazon Linux 2023 套件清單中列出的 OpenSSL (openssl-snapsafe-libs) 的
/dev/random、/dev/urandom或 SnapStart 相容組建取得熵,則相容。如果您的執行時間依賴其他熵來源,請遵循以下「您自己的基礎映像」一節所述的步驟。 -
您自己的基礎映像 – 稽核您的密碼編譯程式庫,並使用還原後執行期掛鉤捨棄任何快取的隨機數字產生器 (RNG) 狀態或緩衝的隨機位元組,確保程式庫在還原後從系統讀取新的熵。例如,使用 的 Rust 函數
rand::rngs::ThreadRng必須在還原reseed()後呼叫 。我們建議您盡可能使用 Lambda 基礎映像建置 。特別是,如果您的基礎映像包含自己的 OpenSSL 版本或 OpenSSL 分支 (例如 BoringSSL 或 LibreSSL),請切換到 provided.al2023 基礎映像,其中包含與 SnapStart 相容的 OpenSSL 組建 (openssl-snapsafe-libs),或使用 AWS libcrypto (AWS-LC)。
支援的程式庫版本下限
AWS 從下表指定的最低版本開始,密碼編譯程式庫會自動維持 SnapStart 的隨機性。如果您在 Lambda 函數中使用這些程式庫,請確定您使用以下最低版本或更新版本:
| 程式庫 | 支援的最低版本 (x86) | 支援的最低版本 (ARM) |
|---|---|---|
| AWS libcrypto (AWS-LC) |
1.16.0 |
1.30.0 |
| AWS libcrypto FIPS |
2.0.13 |
2.0.13 |
如果您透過以下程式庫將上述密碼編譯程式庫封裝為 Lambda 函數的遞移相依項,請務必使用以下最低版本或更新版本:
| 程式庫 | 支援的最低版本 (x86) | 支援的最低版本 (ARM) |
|---|---|---|
| AWS SDK for Java 2.x |
2.23.20 |
2.26.12 |
| AWS Java 的常見執行期 |
0.29.8 |
0.29.25 |
| Amazon Corretto Crypto Provider |
2.4.1 |
2.4.1 |
| Amazon Corretto Crypto Provider FIPS |
2.4.1 |
2.4.1 |
以下範例示範如何使用 CSPRNG 來保證唯一數字序列,即使從快照還原函數也是如此。
SnapStart 掃描工具 (僅限 Java)
Lambda 提供 Java 掃描工具,可協助檢查確保唯一性的程式碼。SnapStart 掃描工具是一種開放原始碼 SpotBugs
若要進一步了解如何使用 SnapStart 處理唯一性,請參閱 AWS 運算部落格上的使用 AWS Lambda SnapStart 更快速啟動