YWS 문서
YWS 콘솔로 이동
컴퓨팅/Lambda

Lambda

코드를 올려두면 요청이 올 때 "cold start"로 Pod를 띄워서 처리하고, LAMBDA_IDLE_TIMEOUT이 지나면 자동으로 Pod를 지우는(warm 해제) 방식입니다. Service/ConfigMap은 지워지지 않고 남아있어서, 다음 cold start 때 재사용됩니다. 요청 라우팅은 포털 프로세스 자신이 중개합니다 (lambda_gateway.py) — 어떤 lambda로 가야 할지 판단하고 필요하면 cold start까지 시킨 다음 요청을 그대로 넘겨줍니다.

트리거

트리거 이벤트 설정 위치
URL {"method", "path", "query", "headers", "body"} Lambda 상세 → 트리거 → URL (도메인 + 포트)
예약 실행 {"trigger": "schedule"} Lambda 상세 → 트리거 → 예약 실행 (cron / 특정 시각 한 번)
메일 {"trigger": "mail", "mail": {...}} Lambda 상세 → 트리거 → 메일 (메일 참고)

수동 실행: Lambda 상세 화면의 실행 카드에서 이벤트(JSON, 기본 {"trigger": "console"})를 넣고 ▶ 실행 → 상태 코드, 걸린 시간, 응답 본문(JSON이면 보기 좋게 정리)과 헤더가 나옵니다. 저장된 코드로 실행되니 고친 뒤에는 먼저 저장하세요(저장 안 한 변경이 있으면 알려 줌). 함수 안의 출력(print 등)은 로그 보기에서 확인합니다. 내부적으로는 API의 POST /api/v1/lambdas/{id}/invoke를 로그인 세션으로 부릅니다.

Lambda 상세 화면의 트리거 카드에서 URL / 메일 / 예약 실행 중 하나를 누르면 그 트리거의 구성 화면이 열립니다 (각 버튼에 현재 설정 상태 표시). 여러 트리거를 함께 쓸 수 있습니다.

세 가지 모두 같은 경로(필요하면 cold start → 워밍된 파드에 이벤트 POST)로 실행되고, 같은 함수에 동시에 몰려도 cold start가 겹치지 않게 함수별 락을 공유합니다.

내장 함수 (사용 가능한 함수)

Lambda 코드에서 설치나 설정 없이 바로 부를 수 있는 YWS 함수입니다. Lambda 상세 화면의 코드 편집기 옆 "사용 가능한 함수" 패널에 함수별 버튼이 있고, 누르면 선택한 언어 기준의 사용법이, 그 안의 "예시 보기"를 누르면 전체 예시 코드와 "호출 코드 넣기" 버튼이 나옵니다. 모든 함수는 Lambda 주인의 계정으로 실행됩니다.

함수 Python Node C++
메일 보내기 send_mail(to, cc, subject, body) await sendMail(to, cc, subject, body) yws::send_mail(to, cc, subject, body);
내 폰에 알림 보내기 notify(title, body, url) await notify(title, body, url) yws::notify(title, body, url);
DB 접속 정보 가져오기 database_info(name) await databaseInfo(name) yws::database_info(name) (JSON 문자열 → yws::json_field(결과, "url"))
def handler(event):
    send_mail("[email protected]", "", "안녕하세요", "Lambda에서 보낸 메일입니다.")
    return {"ok": True}
  • Python: import 없이 사용. 실패하면 YwsError 예외
  • Node: require 없이 전역 함수. handler를 async로 만들고 await. 실패하면 예외
  • C++: 코드 맨 위에 #include "yws.hpp". 실패하면 std::runtime_error
  • send_mail은 보내는 사람이 항상 Lambda 주인의 주소이고, 웹메일과 같은 한도(한 통 20명, 하루 100명)를 공유함. 보낸 메일은 주인의 보낸편지함에 저장됨
  • notify는 알림을 켠 Lambda 주인의 모든 기기(폰, 브라우저)로 푸시 알림을 보냄. 1분에 20개까지 — 알림 참고
  • database_info는 Lambda 주인이 만든 DB만 찾아 줌 (아래 "DB 연결")

DB 연결

DB 탭에서 만든 PostgreSQL·MySQL·Redis에 Lambda에서 바로 접속할 수 있습니다. 네트워크 캔버스 연결 없이 열려 있고, 비밀번호를 코드에 적을 필요도 없습니다.

  1. Lambda 상세 화면 "사용 가능한 함수" 패널 아래 DB 연결에서 DB를 고름 → 선택한 언어의 전체 예시(테이블 만들고 방문 수 세기, Redis는 INCR)가 나옴
  2. 예시로 코드 바꾸기 → 저장 → 실행. 호출할 때마다 {"visits": 1}, {"visits": 2}, …
import psycopg

def handler(event):
    db = database_info("my_app")          # {"url", "host", "port", "user", "password", "database", "key_prefix"}
    with psycopg.connect(db["url"]) as conn:
        count = conn.execute("SELECT count(*) FROM visits").fetchone()[0]
    return {"visits": count}
언어 설치된 드라이버
Python psycopg(PostgreSQL), PyMySQL(MySQL), redis(Redis)
Node pg(PostgreSQL), mysql2(MySQL), redis(Redis) — require로 바로
C++ libpq(<libpq-fe.h>), libmariadb(<mysql.h>), hiredis(<hiredis/hiredis.h>) — 링크 옵션 없이 #include만
  • database_info는 부를 때마다 최신 비밀번호를 줌 → DB 비밀번호를 재발급해도 코드 수정 없음 (이미 열려 있던 연결은 끊김)
  • Redis는 키가 반드시 DB이름:으로 시작해야 함 (key_prefix 사용). SCAN/KEYS 등은 못 씀 — DB 참고
  • 다른 사람의 DB는 database_info로 가져올 수 없음 (주소를 알아도 비밀번호 없이는 접속 불가)
  • 드라이버는 런타임 이미지(infra/lambda-*/Dockerfile)에 들어 있음. C++는 콜드스타트 컴파일 때 세 라이브러리를 --as-needed로 링크

동작 방식

  • 콜드스타트 때 사용자 코드와 함께 언어별 도우미 파일을 /code에 넣음 — Python은 sitecustomize.py + PYTHONPATH=/code(시작 시 내장 함수로 등록), Node는 NODE_OPTIONS=--require /code/_yws.js(전역 등록), C++은 yws.hpp. 런타임 이미지를 다시 빌드할 필요가 없음
  • 코드 안의 print()/console.log()는 로그로만 감(응답에 섞이지 않음 — 응답은 런타임이 별도 파이프로 받음, 2026-10-08부터). C++는 stdout이 응답 통로라 로그는 std::cerr로
  • 도우미는 포털 내부 API POST /internal/lambda-api/<함수>를 부름. Lambda마다 발급된 전용 토큰(YWS_LAMBDA_TOKEN)으로 어느 Lambda인지 확인하고, 그 주인으로 실행
  • 네트워크: 포털 파드는 인바운드가 제한돼 있어서(system-service-auth 정책, ec2 네임스페이스에는 8000번만), 포털이 직접 붙이는 라벨 yws.io/kind=lambda가 있는 파드만 이 API에 접근하도록 별도 NetworkPolicy(portal-internal-callers)로 허용. 사용자 EC2는 이 라벨이 없어서 접근 불가
  • 함수 추가 방법: app/lambda_builtins.py의 BUILTINS에 항목 하나(이름, 설명, 인자, 서버 처리 함수)를 추가하면 세 언어 도우미, API, 화면 패널이 모두 자동으로 생김