Rust에서 Lambda 함수 핸들러 정의
참고
Rust 런타임 클라이언트
Lambda 함수의 핸들러는 이벤트를 처리하는 함수 코드의 메서드입니다. 함수가 호출되면 Lambda는 핸들러 메서드를 실행합니다. 함수는 핸들러가 응답을 반환하거나 종료하거나 제한 시간이 초과될 때까지 실행됩니다.
Rust 핸들러 기본 사항
Lambda 함수 코드를 Rust 실행 파일로 작성하세요. 핸들러 함수 코드와 main 함수를 구현하고 다음을 포함시키세요.
-
Rust에 대한 Lambda 프로그래밍 모델을 구현하는 crates.io의 lambda_runtime
크레이트. -
종속 구성 요소에 Tokio
를 포함시키세요. Lambda용 Rust 런타임 클라이언트 는 Tokio를 사용하여 비동기 호출을 처리합니다.
예 - JSON 이벤트를 처리하는 Rust 핸들러
다음 예제에서는 serde_json
use lambda_runtime::{service_fn, LambdaEvent, Error}; use serde_json::{json, Value}; async fn handler(event: LambdaEvent<Value>) -> Result<Value, Error> { let payload = event.payload; let first_name = payload["firstName"].as_str().unwrap_or("world"); Ok(json!({ "message": format!("Hello, {first_name}!") })) } #[tokio::main] async fn main() -> Result<(), Error> { lambda_runtime::run(service_fn(handler)).await }
유의할 사항:
-
use
: Lambda 함수에 필요한 라이브러리를 가져옵니다. -
async fn main
: Lambda 함수 코드를 실행하는 진입점입니다. Rust 런타임 클라이언트는 Tokio를 비동기 런타임으로 사용하므로 main 함수에 #[tokio::main]
으로 주석을 달아야 합니다. -
async fn handler(event: LambdaEvent<Value>) -> Result<Value,
Error
>
: Lambda 핸들러 서명입니다. 이 함수가 호출될 때 실행되는 코드가 여기에 포함됩니다.-
LambdaEvent<Value>
: Lambda 런타임과 Lambda 함수 컨텍스트에서 수신한 이벤트를 설명하는 일반 유형입니다. -
Result<Value, Error>
: 함수가Result
유형을 반환합니다. 함수가 성공하면 결과는 JSON 값입니다. 함수가 실패하면 결과는 오류입니다.
-
공유 상태 사용
Lambda 함수의 핸들러 코드와 무관한 공유 변수를 선언할 수 있습니다. 이러한 변수는 함수가 이벤트를 수신하기 전에 초기화 단계에서 상태 정보를 로드하는 데 도움이 될 수 있습니다.
예 - 함수 인스턴스 간에 Amazon S3 클라이언트 공유
유의할 사항:
-
use aws_sdk_s3::Client
: 이 예제에서는aws-sdk-s3 = "0.26.0"
을Cargo.toml
파일의 종속 구성 요소 목록에 추가해야 합니다. -
aws_config::from_env
: 이 예제에서는aws-config = "0.55.1"
을Cargo.toml
파일의 종속 구성 요소 목록에 추가해야 합니다.
use aws_sdk_s3::Client; use lambda_runtime::{service_fn, Error, LambdaEvent}; use serde::{Deserialize, Serialize}; #[derive(Deserialize)] struct Request { bucket: String, } #[derive(Serialize)] struct Response { keys: Vec<String>, } async fn handler(client: &Client, event: LambdaEvent<Request>) -> Result<Response, Error> { let bucket = event.payload.bucket; let objects = client.list_objects_v2().bucket(bucket).send().await?; let keys = objects .contents() .map(|s| s.iter().flat_map(|o| o.key().map(String::from)).collect()) .unwrap_or_default(); Ok(Response { keys }) } #[tokio::main] async fn main() -> Result<(), Error> { let shared_config = aws_config::from_env().load().await; let client = Client::new(&shared_config); let shared_client = &client; lambda_runtime::run(service_fn(move |event: LambdaEvent<Request>| async move { handler(&shared_client, event).await })) .await }
Rust Lambda 함수의 코드 모범 사례
Lambda 함수를 구축할 때 코딩 모범 사례를 사용하려면 다음 목록의 지침을 준수하세요.
-
핵심 로직에서 Lambda 핸들러를 분리합니다. 이를 통해 단위 테스트를 수행할 수 있는 더 많은 함수를 만들 수 있습니다.
-
종속성의 복잡성을 최소화합니다. 실행 환경 시작 시 빠르게 로드되는 더 단순한 프레임워크가 권장됩니다.
-
배포 패키지 크기를 런타임 필요에 따라 최소화합니다. 이렇게 하면 호출 전에 배포 패키지를 다운로드하고 압축을 풀 때 걸리는 시간이 단축됩니다.
-
실행 환경 재사용을 활용하여 함수 성능을 향상시킵니다. 함수 핸들러 외부에서 SDK 클라이언트 및 데이터베이스 연결을 초기화하고 정적 자산을
/tmp
디렉토리에 로컬로 캐시합니다. 동일한 함수 인스턴스에서 처리하는 후속 호출은 이러한 리소스를 재사용할 수 있습니다. 이를 통해 함수 실행 시간을 줄여 비용을 절감합니다.호출에서 발생할 수 있는 데이터 유출을 방지하려면 실행 환경을 사용하여 사용자 데이터, 이벤트 또는 보안과 관련된 기타 정보를 저장하지 마세요. 함수가 핸들러 내부 메모리에 저장할 수 없는 변경 가능한 상태에 의존하는 경우 각 사용자에 대해 별도의 함수 또는 별도의 함수 버전을 생성하는 것이 좋습니다.
-
연결 유지 지시문을 사용하여 지속적인 연결을 유지하세요. Lambda는 시간이 지남에 따라 유휴 연결을 제거합니다. 함수를 호출할 때 유휴 연결을 재사용하려고 하면 연결 오류가 발생합니다. 지속적인 연결을 유지하려면 런타임과 관련된 연결 유지 지시문을 사용하세요. 예를 들어, Node.js에서 연결 유지를 이용해 연결 재사용을 참조하세요.
-
환경 변수를 사용하여 함수에 운영 파라미터를 전달합니다. 예를 들어, Amazon S3 버킷에 기록하는 경우 기록하고 있는 버킷 이름을 하드 코딩하는 대신 환경 변수로 구성합니다.
-
Lambda 함수에서 함수가 자기 자신을 간접적으로 호출하거나 함수를 다시 간접적으로 호출할 수 있는 프로세스를 시작하는 재귀적 호출을 사용하지 마세요. 리커시브 코드를 사용할 경우, 의도하지 않은 함수 호출이 증가하고 비용이 상승할 수 있습니다. 의도치 않게 간접 호출이 대량으로 발생하는 경우 함수의 예약된 동시성을 즉시
0
으로 설정하여 코드를 업데이트하는 동안 해당 함수에 대한 모든 간접 호출을 제한합니다. -
Lambda 함수 코드에는 문서화되지 않은 비공개 API를 사용하지 마세요. AWS Lambda 관리형 런타임의 경우, Lambda는 주기적으로 보안 및 기능 업데이트를 Lambda의 내부 API에 적용합니다. 이러한 내부 API 업데이트는 이전 버전과 호환되지 않으므로 함수가 이러한 비공개 API에 종속성을 갖는 경우 호출 실패와 같은 의도하지 않은 결과를 초래할 수 있습니다. 공개적으로 사용 가능한 API의 목록은 API 레퍼런스를 참조하세요.
-
멱등성 코드를 작성합니다. 함수에 멱등성 코드를 작성하면 중복 이벤트가 동일한 방식으로 처리됩니다. 코드는 이벤트를 올바르게 검증하고 중복 이벤트를 정상적으로 처리해야 합니다. 자세한 내용은 멱등성 Lambda 함수를 만들려면 어떻게 해야 합니까?
단원을 참조하십시오.