Lambda에서 Test 성공을 봤는데 반환값은 { "ok": false }다. 성공이라더니 실패라니, 테스트가 말을 바꾼 걸까? 아니다. 함수가 오류 없이 끝난 것과 우리가 기대한 일을 마친 것은 다른 질문이다. 테스트 이벤트 하나를 고정하고 Response, Function Logs, Duration이 각각 무엇을 말하는지 살펴보자.
Lambda Test의 '성공'은 무엇을 확인할까?
Lambda 콘솔의 Test는 저장한 JSON 이벤트로 함수를 호출한다. 결과 화면에서 실행 상태와 응답·로그·요약을 볼 수 있다. 여기서 실행 성공은 함수가 예외나 시간 초과 없이 응답을 반환했다는 뜻이지, 그 응답에 담긴 업무 결과까지 좋다는 보증은 아니다. AWS의 콘솔 테스트 안내도 이벤트를 넣고 실행 결과를 확인하는 과정을 구분한다.
예를 들어 주문 번호가 필수인 작은 함수를 생각해 보자. 아래는 직접 만든 Node.js 예제다. 외부 API나 DB에 접근하지 않는다.
export const handler = async (event) => {
const orderId = event.orderId;
console.log("received orderId:", orderId ?? "(missing)");
if (typeof orderId !== "string" || !orderId.trim()) {
return { ok: false, error: "orderId is required" };
}
return { ok: true, orderId };
};{}를 테스트 이벤트로 주면 핸들러는 ok: false를 정상적으로 반환한다. 예외를 던진 것이 아니므로 실행 자체는 성공할 수 있다. 반면 { "orderId": "A-17" }을 주면 같은 코드가 ok: true를 돌려준다. 테스트의 성공 표시만 보지 말고 Response의 내용도 읽어야 하는 이유다.
Response와 Function Logs는 왜 다를까?
return 값은 호출자에게 돌려줄 응답이다. 위 코드에서 {}를 넣었을 때 Response는 다음처럼 나온다.
{ "ok": false, "error": "orderId is required" }console.log는 호출자에게 보내는 응답이 아니라 실행 중 남긴 기록이다. 같은 호출의 Function Logs에는 received orderId: (missing)이라는 메시지가 나타난다. 아래 반환값과 로그는 Node.js에서 확인한 핸들러 동작이며, AWS 콘솔의 실측 화면은 아니다. 콘솔의 로그 형식은 런타임·설정에 따라 다를 수 있다.
| 테스트 이벤트 | 함수 실행 | Response | 직접 남긴 로그 |
|---|---|---|---|
{} | 예외 없이 종료 | ok: false | received orderId: (missing) |
{ "orderId": "A-17" } | 예외 없이 종료 | ok: true | received orderId: A-17 |
이 예제는 필수값 누락을 응답으로 알려 주도록 의도적으로 작성했다. 오류를 throw하거나 시간 제한을 넘기면 실행 상태와 결과가 달라진다. 또 API Gateway·이벤트 소스마다 실패 응답을 해석하는 방식이 다르므로, 이 { ok: false }를 모든 연동에서 재시도나 HTTP 오류로 처리한다고 일반화하면 안 된다.
Duration이 짧으면 처리가 잘된 걸까?
아니다. Duration은 그 호출이 실행에 사용한 시간을 읽는 단서다. orderId가 빠져 곧바로 ok: false를 반환해도 짧게 끝날 수 있다. 짧은 실행은 빠른 성공일 수도, 빠른 거절일 수도 있다. 따라서 결과를 확인할 때는 실행 상태 → Response의 업무 값 → Function Logs의 경로 → Duration·메모리 요약 순서로 읽는 편이 덜 헷갈린다.
한두 번의 Test Duration을 실제 트래픽의 평균 지연이나 비용으로 포장하지도 말자. 입력 크기, 초기화 여부, 외부 서비스 대기와 메모리 설정이 달라지면 시간이 달라질 수 있다. 반복 측정 없이 특정 숫자만 보고 함수를 빠르다고 결론 내리기 어렵다.
테스트는 성공했는데 CloudWatch 로그가 안 보인다면?
먼저 같은 함수와 같은 호출을 보고 있는지, 테스트 결과 화면에 로그가 있는지 구분한다. 콘솔 Test 화면의 짧은 로그 보기와 CloudWatch Logs의 로그 그룹·스트림은 확인 위치가 다르다. CloudWatch에서만 안 보인다면 전파 지연도 고려한다. AWS는 로그가 호출 직후 표시되기까지 5~10분 걸릴 수 있다고 안내한다.
그래도 없다면 함수의 실행 역할에 CloudWatch Logs 기록 권한이 있는지 확인한다. 기본 로그 그룹을 쓰는 함수에는 로그 그룹·스트림 생성과 이벤트 기록 권한이 필요하다. AWS의 Lambda 로그 안내는 필요한 권한과 기본 로그 그룹 이름을 설명한다. console.log를 더 넣기 전에 역할과 로그 목적지를 먼저 보는 게 빠를 때가 있다. 반대로 로그는 있는데 Response가 예상과 다르면 권한보다 실제 이벤트 JSON과 핸들러의 분기를 먼저 본다.
로그에 이벤트 전체나 비밀값을 찍어 원인을 찾으려는 습관은 피하자. 예제는 주문 번호만 기록하지만 실제 서비스에서는 그것조차 민감한 식별자인지 확인하고 필요한 정보만 남겨야 한다.
핵심 요약
Lambda Test의 실행 성공은 업무 성공과 같은 말이 아니다. Response에서 반환값을, Function Logs에서 실행 경로를, Duration에서 실행 시간을 각각 확인한다. 같은 이벤트로 이 셋을 맞춰 보면 { ok: false }처럼 '성공' 화면과 다른 결과가 나온 이유를 찾을 수 있다. 로그가 안 보일 때는 호출·로그 위치와 지연을 확인한 뒤 실행 역할의 기록 권한을 점검한다.

