Rust로 HTTP 이벤트 처리하기
Rust로 HTTP 이벤트 처리하기 (Processing HTTP events with Rust)
Amazon API Gateway API, Application Load Balancer, 그리고 Lambda 함수 URL(function URL)은 HTTP 이벤트를 Lambda로 보낼 수 있어요. crates.io의 aws_lambda_events 크레이트로 이 소스들의 이벤트를 처리할 수 있어요.
예시 — API Gateway 프록시 요청 처리하기
다음을 주의하세요.
use aws_lambda_events::apigw::{ApiGatewayProxyRequest, ApiGatewayProxyResponse}— aws_lambda_events 크레이트에는 많은 Lambda 이벤트가 포함돼 있어요. 컴파일 시간을 줄이려면 feature 플래그를 사용해 필요한 이벤트만 활성화해요. 예시:aws_lambda_events = { version = "0.8.3", default-features = false, features = ["apigw"] }use http::HeaderMap— 이 import는 http 크레이트를 의존성에 추가해야 해요.
use aws_lambda_events::apigw::{ApiGatewayProxyRequest, ApiGatewayProxyResponse};
use http::HeaderMap;
use lambda_runtime::{service_fn, Error, LambdaEvent};
async fn handler(
_event: LambdaEvent<ApiGatewayProxyRequest>,
) -> Result<ApiGatewayProxyResponse, Error> {
let mut headers = HeaderMap::new();
headers.insert("content-type", "text/html".parse().unwrap());
let resp = ApiGatewayProxyResponse {
status_code: 200,
multi_value_headers: headers.clone(),
is_base64_encoded: false,
body: Some("Hello AWS Lambda HTTP request".into()),
headers,
};
Ok(resp)
}
#[tokio::main]
async fn main() -> Result<(), Error> {
lambda_runtime::run(service_fn(handler)).await
}
Lambda용 Rust 런타임 클라이언트는 어떤 서비스가 이벤트를 보내든 관계없이 네이티브 HTTP 타입으로 작업할 수 있게 해주는 이 이벤트 타입들에 대한 추상화도 제공해요. 다음 코드는 앞 예시와 동등하며, Lambda 함수 URL, Application Load Balancer, API Gateway에서 바로 동작해요.
참고 lambda_http 크레이트는 내부적으로 lambda_runtime 크레이트를 사용해요.
lambda_runtime을 별도로 import할 필요가 없어요.
예시 — HTTP 요청 처리하기
use lambda_http::{service_fn, Error, IntoResponse, Request, RequestExt, Response};
async fn handler(event: Request) -> Result<impl IntoResponse, Error> {
let resp = Response::builder()
.status(200)
.header("content-type", "text/html")
.body("Hello AWS Lambda HTTP request")
.map_err(Box::new)?;
Ok(resp)
}
#[tokio::main]
async fn main() -> Result<(), Error> {
lambda_http::run(service_fn(handler)).await
}
lambda_http 사용에 대한 또 다른 예시는 AWS Labs GitHub 저장소의 http-axum 코드 샘플을 참고하세요.
Rust용 샘플 HTTP Lambda 이벤트
- Lambda HTTP events — HTTP 이벤트를 처리하는 Rust 함수.
- Lambda HTTP events with CORS headers — Tower로 CORS 헤더를 주입하는 Rust 함수.
- Lambda HTTP events with shared resources — 함수 핸들러가 만들어지기 전에 초기화된 공유 리소스를 사용하는 Rust 함수.
본문
HTTP 이벤트는 기본적으로 API Gateway/ALB/함수 URL이 보내는 요청 구조가 서로 조금씩 다르기 때문에, 원시 이벤트 타입을 직접 다루려면 이벤트 소스별 타입을 알아야 해요. lambda_http 크레이트를 쓰면 이런 차이를 추상화해서 네이티브 HTTP 타입(Request, Response)으로 일관되게 처리할 수 있어요. 첫 예시처럼 aws_lambda_events의 ApiGatewayProxyRequest를 직접 쓰는 방식도 유효하지만, 여러 이벤트 소스를 지원해야 한다면 lambda_http 방식이 더 간결해요.