지속 Lambda 함수 호출

지속 Lambda 함수 호출

지속 Lambda 함수(durable functions)는 표준 Lambda 함수와 동일한 호출 방법을 지원해요. 지속 함수를 동기식, 비동기식, 또는 이벤트 소스 매핑으로 호출할 수 있죠. 호출 과정은 표준 함수와 동일하지만, 지속 함수는 장기 실행과 자동 상태 관리라는 추가 기능을 제공해요.

출처: AWS Lambda 개발자 안내서

본문

호출 방법

동기식 호출: 지속 함수를 호출하고 응답을 기다려요. 동기식 호출은 Lambda에 의해 15분(또는 구성된 함수·실행 타임아웃에 따라 그보다 짧게)으로 제한돼요. 즉시 결과가 필요하거나 응답을 기대하는 API·서비스와 통합할 때 동기식 호출을 사용하세요. 호출을 방해하지 않고 효율적인 컴퓨팅을 위해 대기(wait) 작업을 사용할 수 있어요 — 호출은 전체 지속 실행이 완료될 때까지 기다리죠. 멱등한 실행 시작을 위해서는 멱등성(Idempotency)에 설명된 대로 실행 이름 매개변수를 사용하세요.

aws lambda invoke \
  --function-name my-durable-function:1 \
  --cli-binary-format raw-in-base64-out \
  --payload '{"orderId": "12345"}' \
  response.json

비동기식 호출: 응답을 기다리지 않고 처리를 위해 이벤트를 큐에 넣어요. Lambda는 이벤트를 큐에 넣고 즉시 반환해요. 비동기식 호출은 최대 1년까지의 실행 시간을 지원해요. fire-and-forget 시나리오나 처리가 백그라운드에서 일어날 수 있을 때 비동기식 호출을 사용하세요. 멱등한 실행 시작을 위해서는 멱등성(Idempotency)에 설명된 대로 실행 이름 매개변수를 사용하세요.

aws lambda invoke \
  --function-name my-durable-function:1 \
  --invocation-type Event \
  --cli-binary-format raw-in-base64-out \
  --payload '{"orderId": "12345"}' \
  response.json

이벤트 소스 매핑: Amazon SQS, Kinesis, DynamoDB 같은 스트림·큐 기반 서비스에서 레코드를 사용할 수 있을 때 Lambda가 지속 함수를 자동으로 호출하도록 구성해요. 이벤트 소스 매핑은 이벤트 소스를 폴링하고 레코드 배치로 함수를 호출하죠. 실행 시간 한도를 포함해 지속 함수에서 이벤트 소스 매핑을 사용하는 자세한 내용은 지속 함수와 이벤트 소스 매핑을 참고하세요.

각 호출 방법에 대한 전체 세부 정보는 동기식 호출과 비동기식 호출을 참고하세요.

참고
지속 함수는 오류 처리를 위한 데드레터 큐(DLQ)를 지원하지만, Lambda destinations는 지원하지 않아요. 실패한 호출의 레코드를 캡처하려면 DLQ를 구성하세요.

Qualified ARN 요구 사항

지속 함수는 호출에 qualified 식별자가 필요해요. 지속 함수는 버전 번호, 별칭 또는 $LATEST로 호출해야 해요. 전체 qualified ARN 또는 버전/별칭 접미사가 있는 함수 이름을 사용할 수 있죠. unqualified 식별자(버전이나 별칭 접미사 없음)는 사용할 수 없어요.

유효한 호출:

# Using full ARN with version number
arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1

# Using full ARN with alias
arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:prod

# Using full ARN with $LATEST
arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:$LATEST

# Using function name with version number
my-durable-function:1

# Using function name with alias
my-durable-function:prod

유효하지 않은 호출:

# Unqualified ARN (not allowed)
arn:aws:lambda:us-east-1:123456789012:function:my-durable-function

# Unqualified function name (not allowed)
my-durable-function

이 요구 사항은 지속 실행이 전체 수명 주기 동안 일관성을 유지하도록 보장해요. 지속 실행이 시작되면 그 실행을 시작한 함수 버전에 고정됩니다. 함수가 일시 중지되었다가 몇 시간이나 며칠 후 다시 시작되면 Lambda는 같은 버전을 호출하므로, 새 버전을 게시해도 새 실행에만 영향이 있어요. 마찬가지로 별칭을 업데이트하면 새 실행은 새 버전을 사용하고, 진행 중인 실행은 시작된 버전에서 계속됩니다.

$LATEST 실행은 업데이트된 코드에서 재개될 수 있어요
$LATEST 한정자로 시작된 실행은 코드의 고정된 사본에 고정되지 않아요. 실행이 일시 중지된 동안 함수 코드를 업데이트하면 실행은 시작된 버전이 아니라 새 코드에서 재개돼요.
코드가 저장된 실행 상태를 이전과 같은 방식으로 더 이상 처리하지 않아 비결정적(non-determinism) 오류나 조용한 실패가 발생할 수 있어요. 안전하게 재생되는 함수를 작성하는 방법은 함수 버전 및 별칭을 참고하세요.

모범 사례
프로덕션 지속 함수에는 $LATEST보다 번호가 매겨진 버전이나 별칭을 사용하세요. 번호가 매겨진 버전은 변경 불가능하며 결정적 재생을 지원해요. 선택적으로 별칭은 호출 코드를 변경하지 않고 새 버전을 가리키도록 업데이트할 수 있는 안정적인 참조를 제공하죠. 실행 중 코드가 변경되면 실행이 올바르게 재생되지 않을 수 있으므로 $LATEST는 프로토타이핑이나 개발 중 배포 시간 단축에만 사용하세요.

실행 수명 주기 이해

지속 함수를 호출하면 Lambda는 여러 함수 호출에 걸친 지속 실행을 만들어요:

  1. 초기 호출: 호출 요청이 새 지속 실행을 만들어요. Lambda가 고유 실행 ID를 할당하고 처리를 시작해요.
  2. 실행 및 체크포인트: 함수가 지속 작업을 실행하면서 SDK가 진행 상황을 추적하는 체크포인트를 만들어요.
  3. 일시 중지(필요 시): 함수가 wait나 waitForCallback 같은 지속 대기나 자동 단계 재시도를 사용하면 Lambda가 실행을 일시 중지하고 컴퓨팅 시간 요금 청구를 중지해요.
  4. 재개: 재개할 때(재시도 후 포함) Lambda가 함수를 다시 호출해요. SDK가 체크포인트 로그를 재생하고 실행이 중지된 지점부터 계속돼요.
  5. 완료: 함수가 최종 결과를 반환하거나 처리되지 않은 오류를 던지면 지속 실행이 완료돼요.

동기식 호출의 경우 호출자는 대기 작업을 포함한 전체 지속 실행이 완료될 때까지 기다려요. 실행이 호출 타임아웃(15분 이하)을 초과하면 호출이 타임아웃돼요. 비동기식 호출의 경우 Lambda가 즉시 반환하고 실행은 독립적으로 계속돼요. 지속 실행 API를 사용해 실행 상태를 추적하고 최종 결과를 검색하세요.

애플리케이션 코드에서 호출

AWS SDK로 애플리케이션 코드에서 지속 함수를 호출할 수 있어요. 호출 과정은 표준 함수와 동일해요:


[ TypeScript ]

import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda';

const client = new LambdaClient({});

// Synchronous invocation
const response = await client.send(new InvokeCommand({
  FunctionName: 'arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1',
  Payload: JSON.stringify({ orderId: '12345' })
}));

const result = JSON.parse(Buffer.from(response.Payload!).toString());

// Asynchronous invocation
await client.send(new InvokeCommand({
  FunctionName: 'arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1',
  InvocationType: 'Event',
  Payload: JSON.stringify({ orderId: '12345' })
}));

[ Python ]

import boto3
import json

client = boto3.client('lambda')

# Synchronous invocation
response = client.invoke(
    FunctionName='arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1',
    Payload=json.dumps({'orderId': '12345'})
)

result = json.loads(response['Payload'].read())

# Asynchronous invocation
client.invoke(
    FunctionName='arn:aws:lambda:us-east-1:123456789012:function:my-durable-function:1',
    InvocationType='Event',
    Payload=json.dumps({'orderId': '12345'})
)

연결 호출(Chained invocations)

지속 함수는 DurableContext의 invoke 작업을 사용해 다른 지속 함수 및 비지속 함수를 호출할 수 있어요. 이는 호출 함수가 호출된 함수의 완료를 기다리는(일시 중지) 연결 호출을 만들어요:


[ TypeScript ]

export const handler = withDurableExecution(
  async (event: any, context: DurableContext) => {
    // Invoke another durable function and wait for result
    const result = await context.invoke(
      'process-order',
      'arn:aws:lambda:us-east-1:123456789012:function:order-processor:1',
      { orderId: event.orderId }
    );
    
    return { statusCode: 200, body: JSON.stringify(result) };
  }
);

[ Python ]

@durable_execution
def handler(event, context: DurableContext):
    # Invoke another durable function and wait for result
    result = context.invoke(
        'arn:aws:lambda:us-east-1:123456789012:function:order-processor:1',
        {'orderId': event['orderId']},
        name='process-order'
    )
    
    return {'statusCode': 200, 'body': json.dumps(result)}

연결 호출은 호출 함수에 체크포인트를 만들어요. 호출 함수가 중단되면 호출된 함수의 결과와 함께 체크포인트에서 재개되며, 함수를 다시 호출하지 않아요.

참고
교차 계정 연결 호출은 지원되지 않아요. 호출된 함수는 호출 함수와 같은 AWS 계정에 있어야 합니다.

더 알아보기 (Learn more)

  • 지속 함수의 동기·비동기·이벤트 소스 매핑 호출, qualified ARN 요구 사항, 실행 수명 주기, SDK 및 연결 호출까지 익혀 보세요.