Live
여러분의 Lambda 함수를 밀리초 단위로 변경할 수 있습니다.
Live
Live는 SST의 기능 중 하나로, 여러분이 AWS Lambda 함수를 수정한 내용을 밀리초 단위로 테스트할 수 있게 해줍니다. 변경 사항을 다시 배포하지 않고도 즉시 적용할 수 있으며, 원격으로 호출할 수도 있습니다.
이 기능은 AWS에서 들어오는 요청을 여러분의 로컬 머신으로 전달하고, 로컬에서 실행한 후 그 결과를 다시 AWS로 전송하는 방식으로 동작합니다.
장점
이렇게 함수를 로컬에서 실행하고 결과를 프록시로 전달하는 설정은 몇 가지 장점을 제공합니다:
- 변경 사항이 10ms 이내에 리로드됩니다.
- 선호하는 IDE에서 함수를 디버깅하기 위해 중단점을 설정할 수 있습니다.
- 함수를 원격으로 호출할 수 있습니다. 예를 들어,
https://my-api.com/hello가 여러분의 API 엔드포인트라고 가정해 보겠습니다. 이 엔드포인트에 접근하면 로컬 버전의 함수가 실행됩니다.- 이 기능은 API뿐만 아니라 크론 잡(cron job)이나 비동기 이벤트와 같이 원격으로 호출되는 모든 작업에도 적용됩니다.
- 웹훅(webhook)을 쉽게 디버깅하고 테스트할 수 있습니다. 웹훅에 API 엔드포인트를 제공하기만 하면 됩니다.
- 모든 함수 트리거를 지원하므로 이벤트를 모킹(mock)할 필요가 없습니다.
- 올바른 IAM 권한을 사용합니다. 따라서 AWS에서 IAM 권한 부족으로 Lambda가 실패하면 로컬에서도 동일하게 실패합니다.
작동 방식
Live는 여러분의 로컬 머신과 원격 Lambda 함수 간의 통신을 위해 AWS AppSync Events를 사용합니다.
sst dev를 실행하면, 사용 중인 리전에 대해 새로운 AppSync Events API를 부트스트랩합니다.
이 흐름은 대략 다음과 같습니다:
sst dev를 실행하면 앱을 배포하고 Lambda 함수를 스텁 버전으로 대체합니다.- 로컬 WebSocket 클라이언트를 시작하고 AppSync API 엔드포인트에 연결합니다.
- 앱 내의 Lambda 함수가 호출되면, 이벤트를 발행하며 페이로드는 Lambda 함수 요청입니다.
- 로컬 WebSocket 클라이언트가 이 이벤트를 수신합니다. 요청을 받았다는 것을 확인하는 이벤트를 발행합니다.
- 다음으로, 로컬 버전의 함수를 실행하고 함수 응답을 페이로드로 하는 이벤트를 발행합니다. 로컬 버전은 Node.js Worker로 실행됩니다.
- 마지막으로, 스텁 Lambda 함수가 이벤트를 수신하고 페이로드로 응답합니다.
주의사항
이 설정에는 몇 가지 주의할 점이 있습니다.
-
런타임 변경
배포된 스텁 함수는 여러분의 Lambda 함수와 다른 런타임을 사용합니다. 설정에서 런타임을 변경했는데도 AWS 콘솔의 Lambda 함수 런타임이 변경되지 않는 경우 이 문제를 마주할 수 있습니다.
우리는 요청을 프록시할 때 함수가 최대한 빠르게 동작하도록 다른 런타임을 사용합니다.
-
라이브 모드 지속
sst devCLI를 종료하더라도, 여러분의 함수는 더 이상 로컬에서 실행되지 않지만 AWS의 스텁 함수는 여전히 남아 있습니다. 이는 요청을 여러분의 머신으로 프록시하려고 시도하다가 타임아웃이 발생할 수 있음을 의미합니다.이 문제는
sst deploy를 실행하여 실제 버전의 앱을 배포하면 해결할 수 있습니다. 하지만 다음에sst dev를 실행할 때 스텁을 다시 배포해야 하며, 이는 몇 분 정도 걸립니다. 따라서sst dev는 개인 스테이지에서만 사용하고,dev와deploy사이를 자주 전환하지 않는 것을 권장합니다.
라이브 모드
함수가 라이브로 실행될 때 SST_DEV 환경 변수가 true로 설정됩니다. 따라서 여러분의 Node.js 함수에서 process.env.SST_DEV를 사용해 이 값을 확인할 수 있습니다.
export async function main(event) { const body = process.env.SST_DEV ? "Hello, Live!" : "Hello, World!";
return { body, statusCode: 200, };}이 기능은 로컬에서 일부 리소스에 접근하고 싶을 때 유용합니다.
로컬 DB에 연결하기
예를 들어, 로컬에서 실행할 때 로컬 데이터베이스에 연결하고 싶을 수 있습니다. SST_DEV 환경 변수를 사용하여 이를 수행할 수 있습니다.
const dbHost = process.env.SST_DEV ? "localhost" : "amazon-string.rds.amazonaws.com";비용
Live를 지원하는 AWS AppSync Events는 완전히 서버리스입니다. 따라서 사용하지 않을 때는 요금이 부과되지 않습니다.
또한 상당히 저렴합니다. 약 100만 메시지당 $1.00, 100만 연결 분당 $0.08입니다. 여기에서 자세한 내용을 확인할 수 있습니다.
이 접근 방식은 수십 명의 개발자가 있는 대규모 팀에게도 경제적입니다.
개인정보 보호
모든 데이터는 여러분의 로컬 머신과 AWS 계정 사이에서만 유지됩니다. 제3자 서비스는 사용되지 않습니다.
Live는 VPC 내부의 AWS 리소스에 연결하는 기능도 지원합니다.
VPC 사용하기
기본적으로 여러분의 로컬 함수는 VPC 내부의 리소스에 연결할 수 없습니다. 이 문제를 해결하려면 VPN 연결을 설정하거나 터널을 생성하면 됩니다.
터널 생성하기
터널을 생성하려면 다음 단계를 따라야 합니다:
-
VPC에서
bastion호스트를 활성화합니다.sst.config.ts new sst.aws.Vpc("MyVpc", { bastion: true }); -
터널을 설치합니다.
Terminal window sudo sst tunnel install이 명령은 시스템에 네트워크 인터페이스를 생성하기 위해 sudo 권한이 필요합니다. 이 작업은 한 번만 수행하면 됩니다.
-
sst dev를 실행합니다.Terminal window sst dev
이제 터널이 자동으로 시작됩니다. 왼쪽에 있는 Tunnel 탭을 확인하세요. 이제 로컬 환경에서 VPC 내의 리소스에 연결할 수 있습니다.
VPN 연결 설정하기
VPN 연결을 설정하려면 다음 단계를 따라야 합니다:
- 로컬 머신에서 VPC 네트워크로 VPN 연결을 설정합니다. AWS Client VPN 서비스를 사용하여 설정할 수 있습니다. 이 문서의 Mutual authentication 섹션을 따라 인증서를 설정하고 Amazon Certificate Manager에 가져옵니다.
- 그런 다음 Client VPC Endpoint를 생성하고 VPC와 연결합니다.
- 마지막으로, 로컬에서 Tunnelblick을 설치하여 VPN 연결을 설정합니다.
AWS Client VPN 서비스는 시간당 요금이 부과되지만 상당히 저렴합니다. 가격에 대해 자세히 알아보세요.
브레이크포인트
Live는 여러분의 함수를 로컬에서 실행하기 때문에, 선호하는 IDE에서 브레이크포인트를 설정하고 함수를 디버깅할 수 있습니다.

VS Code의 경우, 커맨드 팔레트에서 자동 연결(Auto Attach)을 활성화해야 합니다. Ctrl+Shift+P 또는 Cmd+Shift+P를 누르고, Debug: Toggle Auto Attach를 입력한 후 Always를 선택하세요.
이제 VS Code에서 새로운 터미널을 열고, sst dev를 실행한 후 함수에 브레이크포인트를 설정하고 함수를 호출하세요.
변경 로그
Live는 SST가 2021년 처음 출시했을 때 만들어진 기능입니다. 그 이후로 몇 가지 다른 버전을 거쳤습니다.
| SST 버전 | 변경 사항 |
|---|---|
| v0.5.0 | 당시 _Live Lambda_라고 불렸으며, API Gateway WebSocket API와 DynamoDB 테이블을 사용했습니다. |
| v2.0.0 | AWS IoT로 전환했으며, 이는 약 2-3배 더 빠른 속도를 제공했습니다. |
| v3.3.1 | AWS AppSync Events로 전환했으며, 이는 더 빠르고 더 큰 페이로드를 더 잘 처리합니다. |