Lambda SnapStart를 사용한 고유성 처리
SnapStart 함수에서 호출이 스케일 업되면 Lambda는 초기화된 단일 스냅샷을 사용하여 여러 실행 환경을 재개합니다. 초기화 코드가 스냅샷에 포함된 고유한 콘텐츠를 생성하는 경우, 해당 콘텐츠가 여러 실행 환경에서 재사용될 때 콘텐츠가 고유하지 않게 될 수 있습니다. SnapStart를 사용할 때 고유성을 유지하려면 초기화 후에 고유한 컨텐츠를 생성해야 합니다. 여기에는 유사 무작위성을 생성하는 데 사용되는 고유 ID, 고유 보안 암호 및 엔트로피가 포함됩니다.
코드에서 고유성을 유지하려면 다음 모범 사례를 따르는 것이 좋습니다. 또한 Java 함수와 관련해 Lambda는 고유성을 가정한 코드를 검사할 수 있도록 오픈 소스 SnapStart 검사 도구를 제공합니다. 초기화 단계에서 고유한 데이터를 생성하는 경우 런타임 후크를 사용하여 고유성을 복원할 수 있습니다. 런타임 후크를 사용하면 Lambda가 스냅샷을 생성하기 직전이나 Lambda가 스냅샷에서 함수를 재개한 직후에 특정 코드를 실행할 수 있습니다.
초기화 중에 고유성에 의존하는 상태를 저장하지 마세요.
함수의 초기화 단계에서는 무작위 함수에 대한 시드 설정 또는 로깅을 위한 고유 ID를 생성하는 경우와 같이 고유하도록 의도된 데이터를 캐싱하지 마세요. 대신 함수 핸들러 내에서 무작위 함수를 위해 고유한 데이터를 생성하거나 시드를 설정하거나 런타임 후크를 사용하는 것이 좋습니다.
다음 예제에서는 함수 핸들러에서 UUID를 생성하는 방법을 보여줍니다.
암호학적으로 안전한 가상 난수 생성기(CSPRNG) 사용
SnapStart가 활성화되어 있으면 Lambda는 함수 실행 환경의 스냅샷을 생성하며, 여기에는 모든 애플리케이션 및 시스템 메모리를 포함합니다. 다시 말해 모든 난수 생성기(RNG)의 내부 상태가 스냅샷 시점과 정확히 동일하게 보존되며, 애플리케이션 또는 그 종속성이 이미 생성해 메모리 버퍼에 저장한 모든 임의의 바이트도 함께 보존된다는 뜻입니다.
Lambda가 스냅샷에서 실행 환경을 복원할 때, /dev/random 및 /dev/urandom에서 새로운 엔트로피를 사용해 커널 난수 생성기를 다시 시드합니다. 이러한 디바이스에서 직접 난수를 읽는 소프트웨어는 SnapStart와의 무작위성을 유지합니다.
애플리케이션이 무작위성에 의존하는 경우 암호학적으로 안전한 난수 생성기(CSPRNG)를 사용하는 것이 좋습니다. AL 제공 OpenSSL 외에 Lambda 관리형 런타임 중 SnapStart를 지원하는 항목에는(Java 버전 11+, Python 버전 3.12+, .NET 버전 8+) 다음 기본 제공 CSPRNG가 포함됩니다.
-
Java:
java.security.SecureRandom -
Python:
random.SystemRandom -
.NET:
System.Security.Cryptography.RandomNumberGenerator
참고
Go Lambda 런타임의 경우, 함수가 표준 라이브러리의 crypto/rand를 사용하면 기본적으로 snapstart와 호환되므로 변경할 필요가 없습니다.
함수를 컨테이너 이미지로 패키징하면 기본 이미지가 SnapStart와의 고유성 호환성을 판별합니다.
-
관리형 런타임용 Lambda 기본 이미지(Java 버전 11+, Python 버전 3.12+, .NET 버전 8+) – 위에 설명한 것과 같이 SnapStart와 호환됩니다.
-
provided.al2023 기본 이미지 – 프로그래밍 언어 런타임이 엔트로피를
/dev/random,/dev/urandom에서 얻는 경우, 또는 Amazon Linux 2023 패키지 목록에 나열된 SnapStart 호환 OpenSSL 빌드(openssl-snapsafe-libs)에서 얻는 경우 호환됩니다. 런타임이 다른 엔트로피 소스에 의존하는 경우, 아래의 “자체 기본 이미지” 섹션에 설명된 단계를 따르세요. -
자체 기본 이미지 – 암호화 라이브러리를 감사하고 복원 후 런타임 후크를 사용해 캐싱된 난수 생성기(RNG) 상태 또는 버퍼링된 임의의 바이트를 삭제해 라이브러리가 복원 이후 시스템에서 새 엔트로피를 읽도록 보장합니다. 예를 들어
rand::rngs::ThreadRng를 사용하는 Rust 함수는 복원 이후reseed()를 호출해야 합니다. 가능한 경우 Lambda 기본 이미지를 사용해 빌드하는 것이 좋습니다. 특히 기본 이미지에 자체 OpenSSL 버전 또는 OpenSSL 포크(예: BoringSSL 또는 LibreSSL)가 포함된 경우, SnapStart 호환 OpenSSL 빌드(openssl-snapsafe-libs)를 포함하는 provided.al2023 기본 이미지로 전환하거나 AWS libcrypto(AWS-LC)를 사용하세요.
최소 지원되는 라이브러리 버전
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를 사용하여 고유한 번호 시퀀스를 보장하는 방법을 보여줍니다.
SnapStart 스캔 도구(Java만 해당)
Lambda에서는 고유성을 가정하는 코드를 검사할 수 있도록 Java에 대한 검사 도구를 제공합니다. SnapStart 검사 도구는 일련의 규칙에 대해 정적 분석을 실행하는 오픈 소스 SpotBugs
SnapStart를 사용하여 고유성을 처리하는 방법에 대해 자세한 내용은 AWS 컴퓨팅 블로그에서 AWS Lambda SnapStart를 사용하여 더 빠르게 시작하기