View a markdown version of this page

Menangani keunikan dengan Lambda SnapStart - AWS Lambda

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menangani keunikan dengan Lambda SnapStart

Saat pemanggilan ditingkatkan pada suatu SnapStart fungsi, Lambda menggunakan satu snapshot yang diinisialisasi untuk melanjutkan beberapa lingkungan eksekusi. Jika kode inisialisasi Anda menghasilkan konten unik yang disertakan dalam snapshot, maka konten tersebut mungkin tidak unik saat digunakan kembali di seluruh lingkungan eksekusi. Untuk mempertahankan keunikan saat menggunakan SnapStart, Anda harus menghasilkan konten unik setelah inisialisasi. Ini termasuk ID unik, rahasia unik, dan entropi yang digunakan untuk menghasilkan pseudorandomness.

Kami merekomendasikan praktik terbaik berikut untuk membantu Anda mempertahankan keunikan dalam kode Anda. Untuk fungsi Java, Lambda juga menyediakan alat SnapStart pemindaian sumber terbuka untuk membantu memeriksa kode yang mengasumsikan keunikan. Jika Anda menghasilkan data unik selama fase inisialisasi, maka Anda dapat menggunakan kait runtime untuk mengembalikan keunikan. Dengan runtime hooks, Anda dapat menjalankan kode tertentu segera sebelum Lambda mengambil snapshot atau segera setelah Lambda melanjutkan fungsi dari snapshot.

Hindari menyimpan status yang bergantung pada keunikan selama inisialisasi

Selama fase inisialisasi Fungsi Acara Anda, hindari caching data yang dimaksudkan untuk menjadi unik, seperti membuat ID unik untuk pencatatan atau pengaturan benih untuk fungsi acak. Sebagai gantinya, kami menyarankan Anda membuat data unik atau menetapkan seed untuk fungsi acak di dalam penangan fungsi Anda—atau menggunakan hook runtime.

Contoh berikut menunjukkan cara menghasilkan UUID di handler Event Function.

Java
contoh— Menghasilkan ID unik di penangan Fungsi Acara
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
contoh— Menghasilkan ID unik di penangan Fungsi Acara
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
contoh— Menghasilkan ID unik di penangan Fungsi Acara
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}"; } }

Gunakan generator nomor pseudorandom yang aman secara kriptografis (CSPRNGs)

Ketika SnapStart diaktifkan, Lambda mengambil snapshot dari lingkungan eksekusi fungsi Anda termasuk semua aplikasi dan memori sistem. Ini berarti status internal setiap generator nomor acak (RNG) dipertahankan persis seperti pada waktu snapshot, bersama dengan byte acak apa pun yang aplikasi Anda atau dependensinya telah dihasilkan dan disimpan dalam buffer memori.

Ketika Lambda mengembalikan lingkungan eksekusi dari snapshot, itu menyemai kembali generator nomor acak kernel dari /dev/random dan dengan entropi baru. /dev/urandom Perangkat lunak yang membaca angka acak langsung dari perangkat ini mempertahankan keacakan dengan SnapStart.

Jika aplikasi Anda bergantung pada keacakan, kami sarankan Anda menggunakan generator nomor acak yang aman secara kriptografis (CSPRNGs). Selain OpenSSL yang disediakan AL, runtime terkelola Lambda yang mendukung SnapStart (Java versi 11+, Python versi 3.12+, dan .NET versi 8+), termasuk CSPRNG bawaan berikut:

  • Jawa: java.security.SecureRandom

  • Python: random.SystemRandom

  • .NET: System.Security.Cryptography.RandomNumberGenerator

catatan

Untuk runtime Go Lambda, tidak ada perubahan yang diperlukan jika fungsi Anda menggunakan pustaka standarcrypto/rand, yang kompatibel dengan snapstart secara default.

Saat Anda mengemas fungsi Anda sebagai gambar kontainer, gambar dasar Anda menentukan kompatibilitas keunikan dengan: SnapStart

Versi pustaka minimum yang didukung

AWS pustaka kriptografi secara otomatis mempertahankan keacakan dengan SnapStart memulai dengan versi minimum yang ditentukan dalam tabel berikut. Jika Anda menggunakan pustaka ini dengan Fungsi Peristiwa Lambda, pastikan Anda menggunakan versi minimum berikut atau versi yang lebih baru:

Pustaka Versi minimum yang didukung (x86) Versi minimum yang didukung (ARM)
AWS libcrypto (AWS-LC)

1.16.0

1.30.0

AWS libcrypto FIPS

2.0.13

2.0.13

Jika Anda mengemas pustaka kriptografi sebelumnya dengan Fungsi Peristiwa Lambda sebagai dependensi transitif melalui pustaka berikut, pastikan Anda menggunakan versi minimum berikut atau versi yang lebih baru:

Pustaka Versi minimum yang didukung (x86) Versi minimum yang didukung (ARM)
AWS SDK for Java 2.x

2.23.20

2.26.12

AWS Runtime Umum untuk Java

0.29.8

0.29.25

Penyedia Crypto Amazon Corretto

2.4.1

2.4.1
Amazon Corretto Penyedia Crypto FIPS

2.4.1

2.4.1

Contoh berikut menunjukkan cara menggunakan CSPrNGs untuk menjamin urutan nomor unik bahkan ketika fungsi dipulihkan dari snapshot.

Java
contoh— 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
contoh— acak. 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
contoh– 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!"; } }

SnapStart alat pemindaian (hanya Java)

Lambda menyediakan alat pemindaian untuk Java untuk membantu Anda memeriksa kode yang mengasumsikan keunikan. Alat SnapStart pemindaian adalah SpotBugsplugin sumber terbuka yang menjalankan analisis statis terhadap seperangkat aturan. Alat pemindaian membantu mengidentifikasi implementasi kode potensial yang mungkin mematahkan asumsi mengenai keunikan. Untuk petunjuk penginstalan dan daftar pemeriksaan yang dilakukan alat pemindaian, lihat repositori aws-lambda-snapstart-java-rules aktif. GitHub

Untuk mempelajari lebih lanjut tentang menangani keunikan dengan SnapStart, lihat Memulai lebih cepat dengan AWS Lambda SnapStart di AWS Compute Blog.