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 rahasia unikIDs, 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 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-contoh berikut ini mendemonstrasikan cara menghasilkan fungsi handler. UUID

Java
contoh — Menghasilkan ID unik di function handler
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 function handler
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 function handler
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

Jika aplikasi Anda bergantung pada keacakan, kami sarankan Anda menggunakan generator nomor acak yang aman secara kriptografis (). CSPRNGs Selain Open SSL 1.0.2, runtime terkelola Lambda juga menyertakan built-in berikut: CSPRNGs

  • Jawa: java.security.SecureRandom

  • Python: SystemRandom

  • .NET: System.Security.Cryptography.RandomNumberGenerator

Perangkat lunak yang selalu mendapatkan angka acak dari /dev/random atau /dev/urandom juga mempertahankan keacakan dengan SnapStart.

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 Lambda, pastikan Anda menggunakan versi minimum berikut atau versi yang lebih baru:

Perpustakaan 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 Anda sebagai dependensi transitif melalui pustaka berikut, pastikan Anda menggunakan versi minimum berikut atau versi yang lebih baru:

Perpustakaan 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

Amazon Corretto Provider

2.4.1

2.4.1
Penyedia Crypto Amazon Corretto 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.