Cookie の設定を選択する

当社は、当社のサイトおよびサービスを提供するために必要な必須 Cookie および類似のツールを使用しています。当社は、パフォーマンス Cookie を使用して匿名の統計情報を収集することで、お客様が当社のサイトをどのように利用しているかを把握し、改善に役立てています。必須 Cookie は無効化できませんが、[カスタマイズ] または [拒否] をクリックしてパフォーマンス Cookie を拒否することはできます。

お客様が同意した場合、AWS および承認された第三者は、Cookie を使用して便利なサイト機能を提供したり、お客様の選択を記憶したり、関連する広告を含む関連コンテンツを表示したりします。すべての必須ではない Cookie を受け入れるか拒否するには、[受け入れる] または [拒否] をクリックしてください。より詳細な選択を行うには、[カスタマイズ] をクリックしてください。

Lambda SnapStart での一意性の取り扱い

フォーカスモード
Lambda SnapStart での一意性の取り扱い - AWS Lambda

SnapStart 関数での呼び出しがスケールアップすると、Lambda は単一の初期化されたスナップショットを使用して、複数の実行環境を再開します。スナップショットに包含される一意のコンテンツを初期化コードが生成する場合、そのコンテンツは、複数の実行環境で再利用されるときに一意にならない可能性があります。SnapStart の使用時に一意性を維持するには、初期化後に一意のコンテンツを生成する必要があります。これには、一意の ID、一意のシークレット、および疑似ランダム性を生成するために使用されるエントロピーが含まれます。

コードで一意性を維持できるように、以下のベストプラクティスをお勧めします。Java 関数の場合、Lambda は、一意性を前提とするコードのチェックに役立つ、オープンソースの SnapStart スキャンツールも提供します。初期化フェーズ中に一意のデータを生成する場合は、ランタイムフックを使用して一意性を復元することができます。ランタイムフックを使用すると、Lambda がスナップショットを取得する直前、または Lambda がスナップショットから関数を再開した直後に、特定のコードを実行できます。

一意性に依存する状態を初期化中に保存しない

関数の初期化フェーズ中は、ロギング用またはランダム関数のシードの設定用の一意の ID の生成など、一意であることが意図されたデータをキャッシュしないでください。その代わりに、関数ハンドラー内で一意のデータの生成やランダム関数のシードの設定を行うか、ランタイムフックを使用することをお勧めします。

次の例は、関数ハンドラーで UUID を生成する方法を示しています。

Java
例 – 関数ハンドラーでの一意の ID の生成
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!"; } }
Python
例 – 関数ハンドラーでの一意の ID の生成
import json import random import time unique_number = None def lambda_handler(event, context): seed = int(time.time() * 1000) random.seed(seed) global unique_number if not unique_number: unique_number = random.randint(1, 10000) print("Unique number: ", unique_number) return "Hello, World!"
.NET
例 – 関数ハンドラーでの一意の ID の生成
namespace Example; public class SnapstartExample { private Guid _myExecutionEnvironmentGuid; public SnapstartExample() { // This GUID is set for non-restore use cases, such as testing or if SnapStart is turned off _myExecutionEnvironmentGuid = new Guid(); // Register the method which will run after each restore. You may need to update Amazon.Lambda.Core to see this Amazon.Lambda.Core.SnapshotRestore.RegisterAfterRestore(MyAfterRestore); } private ValueTask MyAfterRestore() { // After restoring this snapshot to a new execution environment, update the GUID _myExecutionEnvironmentGuid = new Guid(); return ValueTask.CompletedTask; } public string Handler() { return $"Hello World! My Execution Environment GUID is {_myExecutionEnvironmentGuid}"; } }
例 – 関数ハンドラーでの一意の ID の生成
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) を使用することをお勧めします。OpenSSL 1.0.2 に加えて、Lambda マネージドランタイムには以下の組み込み CSPRNG も含まれています。

  • Java: java.security.SecureRandom

  • Python: random.SystemRandom

  • .NET: System.Security.Cryptography.RandomNumberGenerator

/dev/random または /dev/urandom から乱数を常に取得するソフトウェアも、SnapStart でのランダム性を維持します。

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 Common Runtime for 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 を使用して一意の数列が保証されるようにする方法を示します。

Java
例 – 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!"; } }
Python
例 - random.SystemRandom
import json import random secure_rng = random.SystemRandom() def lambda_handler(event, context): random_numbers = [secure_rng.random() for _ in range(10)] for number in random_numbers: print(number) return "Hello, World!"
.NET
例 - RandomNumberGenerator
using Amazon.Lambda.Core; using System.Security.Cryptography; [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace DotnetSecureRandom; public class Function { public string FunctionHandler() { using (RandomNumberGenerator rng = RandomNumberGenerator.Create()) { byte[] randomUnsignedInteger32Bytes = new byte[4]; for (int i = 0; i < 10; i++) { rng.GetBytes(randomUnsignedInteger32Bytes); int randomInt32 = BitConverter.ToInt32(randomUnsignedInteger32Bytes, 0); Console.WriteLine("{0:G}", randomInt32); } } return "Hello World!"; } }
例 – 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 スキャンツール (Java のみ)

Lambda は、一意性を前提としたコードをチェックするのに役立つ、Java 用のスキャンツールを提供しています。SnapStart スキャンツールは、一連のルールに照らして静的分析を実行する、オープンソースの SpotBugs プラグインです。スキャンツールは、一意性に関する前提を覆す可能性がある、潜在的なコード実装を特定するために役立ちます。インストール手順、およびスキャンツールが実行するチェックのリストについては、GitHub の aws-lambda-snapstart-java-rules リポジトリを参照してください。

SnapStart による一意性の処理について詳しくは、AWS コンピューティングブログの「AWS Lambda SnapStart による迅速なスタートアップ」を参照してください。

このページの内容

プライバシーサイト規約Cookie の設定
© 2025, Amazon Web Services, Inc. or its affiliates.All rights reserved.