
Lambdaμ μνλ₯Ό μ μ₯νλ Execution Environment

- #Lambda
- #AWS
- #Execution Environment
- #Provisioned Concurrency
- #NestJS
λ€μ΄κ°λ©°
μλμ, ν둬μ€ν μ΄ λ±μ 벑μλ μλΉμ€λ serverless νλ μμν¬λ₯Ό μ¬μ©νμ¬ Lambda κΈ°λ°μΌλ‘ ꡬμ±λμ΄ μλλ°μ. νΉμ λλ€ ν¨μλ₯Ό μ¬λ¬ λ² νΈμΆνμ λ, μ΄μ μ μ€νν ν¨μμ μνκ° λ¨μμλ λλμ λ°μΌμ μ μ΄ μμΌμ κ°μ?
λνμ μΌλ‘ 첫λ²μ§Έ μ€νμμ DB 컀λ₯μ μ initialize νκ³ , λλ²μ§Έ μ€ν λλ DB 컀λ₯μ μ initialize νμ§ μμλ μ¬μ©ν μ μλ κ²½μ°κ° μμ΅λλ€. μ κ° λλ€λ₯Ό μ²μ μ¬μ©νμ λλ βμ μλ³μλ κ·Έλλ‘ λ¨κ²¨λλ건κ°?β νλ λ§μ°ν μΆμΈ‘λ§ ν λΏμ΄μμ΅λλ€. κ·Έ μ΄μ λ λλ€μ Execution Environment λλ¬ΈμΈλ°μ. μ΄λ² λΈλ‘κ·Έμμλ λλ€μ Execution Environmentκ° λμ§ μ΄ν΄λ³΄λ μκ°μ κ°λλ‘ νκ² μ΅λλ€.
Lambda Execution Environment
Execution Environment(μ€ν νκ²½)μ λλ€ ν¨μκ° νμν 리μμ€λ₯Ό κ΄λ¦¬νκ³ ν¨μλ₯Ό μ€νμν€κΈ° μν λ°νμ νκ²½μ λλ€. Execution Environmentμ ꡬμ±μμλ λ€μμ²λΌ λ©λͺ¨λ¦¬, Timeout, Provisioned Concurrency λ± μ ν¬κ° λλ€ ν¨μλ₯Ό λ§λ€ λ μ€μ ν μ μλ κ°λ€λ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.
- Memory
- CPU
- Ephemeral Storage(μμ μ€ν 리μ§)
- Timeout
- Handler
- Provisioned Concurrency
- νκ²½λ³μ
Execution Environmentλ κ° ν¨μ κ° κ³΅μ λμ§ μμ§λ§, νλμ ν¨μλ₯Ό μ°μμ μΌλ‘ μ€νν κ²½μ°λ Execution Environmentκ° κ³΅μ λ μ μμ΅λλ€. Execution Environment μλͺ μ£ΌκΈ° ννΈμμ μμΈν μ΄ν΄λ³΄λλ‘ νκ² μ΅λλ€.
Lambda Execution Environment μλͺ μ£ΌκΈ°
Execution Environmentμ μλͺ μ£ΌκΈ°λ λ€μμ²λΌ 3λ¨κ³λ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€. κ° λ¨κ³λ λ°νμμ΄ μ μ‘ν μ΄λ²€νΈλ₯Ό λ°μ μμλκ³ , μμ μ΄ λλ¬λ€λ μμ²μ μ μ‘νμ¬ μλ£λ₯Ό λνλ λλ€.
1. INIT
첫λ²μ§Έ λ¨κ³λ Init λ¨κ³μ λλ€.
Init λ¨κ³λ μ ν¬κ° λλ€ λ‘κ·Έμμ λ³Ό μ μλλ°μ. μμ²λΌ INIT_START
λ‘ νμλ λΆλΆμ΄ Init λ¨κ³μ
λλ€. Init λ¨κ³μλ Lambda Execution Environmentλ₯Ό ꡬμ±νλ μΈ κ°μ§ μμ
μ μνν©λλ€.
- Extension Init : λλ€μ λΆλ μΆκ°κΈ°λ₯μ μ€ννλ μμ (컀μ€ν λͺ¨λν°λ§, 보μμμ , μ체μ μΈ Lambda Extension λ±)
- Runtime Init : κ° μΈμ΄λ³λ‘ μ½λ μ€νμ μν΄ νμν μμλ€μ λΆνΈμ€νΈλ© νλ κ³Όμ
- Function Init : ν¨μμ μ μ μ½λ μ€νμμΌμ handler ν¨μλ₯Ό μ€λΉμν€λ μμ
Init λ¨κ³λ κΈ°λ³Έμ μΌλ‘ λλ€ ν¨μκ° νΈμΆλμ λ μμλλ λ¨κ³μ΄κΈ° λλ¬Έμ, λλ€ ν¨μκ° μ΄ λ¨κ³μμ μ΅λ 10μ΄μ μ§μ°μ΄ μκΈ°κ³ μ½λ μ€ννΈ(Cold Start)κ° λ μ μμ΅λλ€. κ·Έλ¬λ Provisioned Concurrency μ΅μ μ μ¬μ©νλ κ²½μ° λλ€λ₯Ό μ’ λ warm νκ² λ§λ€μ΄ μ€ μ μλλ°μ. λλ€ ν¨μκ° μ λ°μ΄νΈλκ³ λ―Έλ¦¬ Execution Environmentμ νλ‘λ°μ΄μ§ ν΄λκ³ λκΈ°ν©λλ€. ν¨μκ° νΈμΆλμ λ Init λ¨κ³κ° μλ£λ μνλΌλ©΄ λ°λ‘ λ€μ λ¨κ³λ‘ skip ν μ μμ΅λλ€.
2. INVOKE
λλ²μ§Έ λ¨κ³λ Invoke λ¨κ³μ λλ€.
service: fromm-store-api-delivery
frameworkVersion: '3'
configValidationMode: warn
useDotenv: true
plugins:
- serverless-esbuild
- serverless-plugin-canary-deployments
- serverless-prune-plugin
provider:
name: aws
runtime: nodejs16.x
timeout: 20 # Timeout 20s
Invoke λ¨κ³λ μ€μ μ ν¬κ° μμ±ν Lambda ν¨μλ₯Ό μ€νμν€λ λ¨κ³μ λλ€. λλ€ ν¨μλ₯Ό μμ±ν λ μ ν μκ°(Timeout)μ μ€μ νλλ° μ΄λ μ€μ ν Timeout κ°μ΄ Invoke λ¨κ³μ Timeout κ°μ λλ€. Init λ¨κ³λ 10μ΄μ μ ν μκ°μ΄ μκ³ 10μ΄κ° μ§λλ©΄ Invoke λ¨κ³μ Timeoutμ μ‘μλ¨ΉμΌλ©΄μ Initμ μννκ² λ©λλ€.
3. SHUTDOWN
λ§μ§λ§ λ¨κ³λ Shutdown λ¨κ³μ λλ€.
λ°νμ λ° Extensionμ μ’ λ£μν€κ³ μ΅μ’ μ μΌλ‘ Execution Environmentλ₯Ό μ’ λ£ν©λλ€. μ΅λ 2μ΄κ° μ£Όμ΄μ§κ³ 2μ΄κ° μ§λλ©΄ κ°μ λ‘ μ’ λ£λ©λλ€.
Execution Environmentμ μ μ§
λλ€λ Shutdown λ¨κ³ μ΄ν Execution Environmentλ₯Ό μ΄λ μ λ μκ°λμ μ μ§ν©λλ€.
μ΄λ ν¨μκ° νΈμΆλ λλ§λ€ Execution Environmentλ₯Ό νλ‘λ°μ΄μ§νλ€λ©΄ κ³μ 리μμ€κ° μμ λ ν
λ, κ³μ ν¨μλ₯Ό μ¬μ©ν κ² κ°μΌλ©΄ λλ€κ° μ΅μ νλ₯Ό μν΄ Execution Environmentλ₯Ό κ³μ λ¨κ²¨λλ κ²μ
λλ€.
Execution Environmentκ° μ μ§λμ λ λνλλ ν¨κ³Όλ€μ λν΄ μμλ³΄κ² μ΅λλ€.
1. νΈλ€λ¬ λ°κΉ₯μμ μ΄κΈ°νλ λ³μκ° λ€μ νΈμΆλλ ν¨μμ λ¨μ μμ
Execution Environmentκ° μ μ§λλ©΄ Init λ¨κ³μμ Function Initμ μ€ννμ λ κ°κ° μΈμ΄μ λ°νμ νκ²½μ΄ λ§λ€μ΄μ§κ² λλλ°, μ΄ νκ²½μ΄ κ·Έλλ‘ λ¨μ μκ² λλ©΄μ μ μλ³μλ‘ λ§λ€μ΄μ§ κ°μ²΄λ€μ κ³μ μ°Έμ‘°κ° λ¨μμκ² λλ κ²μ λλ€.
μ΄ νΉμ±μ νμ©ν΄ NestJS νλ μμν¬μ μλ²λ¦¬μ€λ₯Ό νμ©ν νλ‘μ νΈμμ μμ£Ό μ¬μ©νλ ν¨ν΄μ΄ μλλ°μ.
NestJS νλ μμν¬λ₯Ό μ¬μ©ν΄ Nest μ±μ μμ±νκ³ μλΉμ€ν μ μλ μνλ‘ λ§λ€μ΄ λ λ€μμ cachedServer
λΌλ μ μλ³μμ ν λΉμ ν©λλ€. μ΄ cachedServer λ³μλ Execution Environmentκ° μ μ§λλ€λ©΄ λ€μ ν¨μ νΈμΆμμλ κ³μ μ μ§λ μ μμ΅λλ€.
// main.ts
let cachedServer;
export const bootstrapServer = async () => {
if (!cachedServer) {
const expressApp = express();
const app = await NestFactory.create(AppModule, new ExpressAdapter(expressApp));
await app.init();
cachedServer = ServerlessExpress({ app: expressApp });
}
return cachedServer; // Execution Environmentκ° μ μ§λλ€λ©΄ cachedServer κ° λ¨μμκΈ° λλ¬Έμ κ·Έλλ‘ λ¦¬ν΄
};
lambda νΈλ€λ¬μμλ μΊμ±μ΄ λ μ±μ μ¬μ©ν΄ μμ²μ μ²λ¦¬ν©λλ€. NestFactory.create
λ₯Ό λ€μ νμ§ μμμ λ³΄λ€ λΉ λ₯΄κ² μλΉμ€ν μ μμ΅λλ€.
// lambda.ts
export const handler: APIGatewayProxyHandler = async (event: any, context: Context, callback: any) => {
const server = await bootstrapServer(AppModule, 'Delivery', version, '/delivery');
return server(event, context, callback);
};
2. /tmp
λλ ν°λ¦¬ μμ λ΄μ©μ΄ λ¨μ μμ
/tmp λλ ν°λ¦¬λ Execution Environment κ° μ 곡νλ μμ μ€ν 리μ§μ κ²½λ‘μ λλ€. Execution Environment κ° μ μ§λλ€λ©΄ λλ ν°λ¦¬μ μ½ν μΈ λ λ€μ μ¬μ©ν μ μκ² λ©λλ€.
3. λ°±κ·ΈλΌμ΄λ νλ‘μΈμ€ νΉμ μ½λ°±ν¨μκ° λ€μ ν¨μ νΈμΆμμ μ€νλ¨
ν¨μ μ’ λ£ μ μλ£λμ§ μμ λ°±κ·ΈλΌμ΄λ νλ‘μΈμ€ λλ μ½λ°±μ Lambdaκ° μ€ν νκ²½μ μ¬μ¬μ©νλ κ²½μ°μ λ€μ μ€νλ μ μμ΅λλ€. Node.js κΈ°λ° λλ€ν¨μμΌ κ²½μ°μλ μλ£λμ§ μμ Promiseκ° λ€μ ν¨μμμ resolve λλ μν©μ΄ μμ μ μμ΅λλ€.
λ§μΉλ©°
AWS Lambdaμ Execution Environmentμ λν΄ μμλ΄€λλ°μ. μΌλ°μ μΌλ‘ Execution Environmentμ Lambda μλΉμ€κ° κ΄λ¦¬νλ―λ‘ κ°λ°μκ° μ§μ μ‘°μν νμλ μμ΅λλ€. κ·Έλ¬λ Execution Environmentλ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νλ©΄ Lambda ν¨μμ μ€ν μκ°κ³Ό μμ μ¬μ©μ μ΅μ νν μ μμ΅λλ€. λλ€μ μν κ΄λ¦¬μ μ±λ₯ μ΅μ νλ₯Ό μν΄ Execution Environmentμ λμ μ리λ₯Ό μ΄ν΄ν νμκ° μμ κ² κ°μ΅λλ€. μ΄νμλ Lambda Extensions, Provisioned Concurrency λ±κ³Ό κ°μ κ°λ λ μμΈν μμ보λ μκ°μ΄ μμΌλ©΄ μ’κ² μ΅λλ€.
κ°μ¬ν©λλ€.