Lambda での一意性の処理 SnapStart
SnapStart 関数で呼び出しがスケールアップすると、Lambda は単一の初期化されたスナップショットを使用して複数の実行環境を再開します。スナップショットに包含される一意のコンテンツを初期化コードが生成する場合、そのコンテンツは、複数の実行環境で再利用されるときに一意にならない可能性があります。の使用時に一意性を維持するには SnapStart、初期化後に一意のコンテンツを生成する必要があります。これには、一意の ID、一意のシークレット、および疑似ランダム性を生成するために使用されるエントロピーが含まれます。
コードで一意性を維持できるように、以下のベストプラクティスをお勧めします。Lambda には、一意性を前提とするコードをチェックするのに役立つオープンソースのSnapStart スキャンツールも用意されています。初期化フェーズ中に一意のデータを生成する場合は、ランタイムフックを使用して一意性を復元することができます。ランタイムフックを使用すると、Lambda がスナップショットを取得する直前、または Lambda がスナップショットから関数を再開した直後に、特定のコードを実行できます。
一意性に依存する状態を初期化中に保存しない
関数の初期化フェーズ中は、ロギング用の一意の ID の生成など、一意であることが意図されたデータをキャッシュしないでください。その代わりに、関数ハンドラー内で一意のデータを生成する、またはランタイムフックを使用することをお勧めします。
例 – 関数ハンドラーでの一意の ID の生成
以下は、関数ハンドラーで UUID を生成する方法を示す例です。
import java.util.UUID; public class Handler implements RequestHandler<String, String> { private static UUID uniqueSandboxId = null; @Override public String handleRequest(String event, Context context) {
if (uniqueSandboxId == null) uniqueSandboxId = UUID.randomUUID();
System.out.println("Unique Sandbox Id: " + uniqueSandboxId); return "Hello, World!"; } }
暗号論的擬似乱数生成器 (CSPRNG) を使用する
アプリケーションがランダム性に依存している場合は、暗号論的擬似乱数生成器 (CSPRNG) を使用することをお勧めします。Java 用の Lambda マネージドランタイムには、 でランダム性を自動的に維持する 2 つの組み込み CSPRNGs (OpenSSL 1.0.2 および java.security.SecureRandom
) が含まれています SnapStart。から乱数を常に取得/dev/random
するか/dev/urandom
、 で乱数を維持するソフトウェア SnapStart。
例 – java.security。SecureRandom
以下の例は java.security.SecureRandom
を使用しています。これは、関数がスナップショットから復元された場合でも、一意の数列を生成します。
import java.security.SecureRandom; public class Handler implements RequestHandler<String, String> {
private static SecureRandom rng = new SecureRandom();
@Override public String handleRequest(String event, Context context) { for (int i = 0; i < 10; i++) { System.out.println(rng.next()); } return "Hello, World!"; } }
SnapStart スキャンツール
Lambda は、一意性を前提としたコードをチェックするために役立つスキャンツールを提供しています。 SnapStart スキャンツールは、一連のルールに対して静的分析を実行するオープンソースSpotBugs
での一意性の処理の詳細については SnapStart、 AWS コンピューティングブログの「 による起動の高速化AWS Lambda SnapStart