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

Ketika pemanggilan meningkatkan skala pada suatu SnapStart fungsi, Lambda menggunakan snapshot tunggal yang diinisialisasi untuk melanjutkan beberapa lingkungan eksekusi. Jika kode inisialisasi menghasilkan konten unik yang disertakan dalam snapshot, maka konten tersebut mungkin tidak unik ketika 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 hook runtime untuk mengembalikan keunikan. Dengan runtime hook, Anda dapat menjalankan kode tertentu segera sebelum Lambda mengambil snapshot atau segera setelah Lambda melanjutkan fungsi dari snapshot.

Hindari menyimpan status yang tergantung pada keunikan selama inisialisasi

Selama fase in isialisasi fungsi Anda, hindari caching data yang dimaksudkan untuk menjadi unik, seperti menghasilkan ID unik untuk logging atau menyetel benih untuk fungsi acak. Sebagai gantinya, sebaiknya Anda membuat data unik atau menyetel benih untuk fungsi acak di dalam function handler Anda—atau menggunakan hook runtime. Terapkan kode sebelum atau sesudah snapshot fungsi Lambda

Contoh berikut menunjukkan cara menghasilkan UUID dalam pengendali fungsi.

Java
contoh— Menghasilkan ID unik di handler fungsi
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 handler fungsi
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 handler fungsi
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 telah dihasilkan aplikasi Anda atau dependensinya dan disimpan dalam buffer memori.

Ketika Lambda mengembalikan lingkungan eksekusi dari snapshot, ia menyemai ulang generator nomor acak kernel dari /dev/random dan /dev/urandom dengan entropi baru. 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 snapshot secara default.

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

  • Gambar dasar Lambda untuk runtime terkelola (Java versi 11+, Python versi 3.12+, dan.NET versi 8+) - Kompatibel dengan seperti yang dijelaskan di atas. SnapStart

  • Gambar dasar.al2023 yang disediakan — Kompatibel jika runtime bahasa pemrograman Anda memperoleh entropi dari/dev/random,/dev/urandom, atau build OpenSSL (openssl-snapsafe- SnapStart-compatible libs) yang tercantum dalam daftar paket Amazon Linux 2023. https://docs.aws.amazon.com/linux/al2023/release-notes/all-packages.html Jika runtime Anda bergantung pada sumber entropi lain, ikuti langkah-langkah yang dijelaskan di bagian “Gambar dasar Anda sendiri” di bawah ini.

  • Gambar dasar Anda sendiri — Audit pustaka kriptografi Anda dan gunakan hook runtime pasca-pemulihan untuk membuang status generator nomor acak (RNG) yang di-cache atau byte acak buffer, memastikan perpustakaan membaca entropi baru dari sistem setelah pemulihan. Misalnya, fungsi Rust yang digunakan rand::rngs::ThreadRng harus memanggil reseed() setelah pemulihan. Kami menyarankan Anda membangun menggunakan gambar dasar Lambda bila memungkinkan. Secara khusus, jika gambar dasar Anda menyertakan versi OpenSSL atau fork OpenSSL sendiri (seperti BoringSSL atau LibreSSL), beralih ke gambar dasar.al2023 yang disediakan, yang mencakup SnapStart-compatible build OpenSSL (openssl-snapsafe-libs), atau gunakan libcrypto (-LC). AWSAWS

Versi pustaka minimum yang didukung

AWS pustaka kriptografi secara otomatis mempertahankan keacakan dengan SnapStart dimulai dengan versi minimum yang ditentukan dalam tabel berikut. Jika Anda menggunakan pustaka ini dengan fungsi 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 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 Kripto Amazon Corretto

2.4.1

2.4.1
Penyedia Kripto Amazon Corretto FIPS

2.4.1

2.4.1

Contoh berikut menunjukkan cara menggunakan CSPRNGs untuk menjamin urutan angka yang unik bahkan ketika fungsi dipulihkan dari snapshot.

Java
contoh- java.keamanan. 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 SpotBugs plugin sumber terbuka yang menjalankan analisis statis terhadap seperangkat aturan. Alat pemindaian membantu mengidentifikasi implementasi kode potensial yang mungkin melanggar asumsi mengenai keunikan. Untuk petunjuk instalasi dan daftar pemeriksaan yang dilakukan alat pemindaian, lihat repositori aws-lambd a-snapstart-java-rules aktif. GitHub

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