[AWS] Lambda: Rust ์˜ฌ๋ฆฌ๊ธฐ

AWS์˜ ๋žŒ๋‹ค๋Š” ์ •ํ•ด์ง„ ๋Ÿฐํƒ€์ž„ ์ด์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ์ปค์Šคํ…€ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค.

์ผ๋‹จ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ง€์ • ๋Ÿฐํƒ€์ž„์œผ๋กœ ์„ค์ •ํ•ด์„œ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

1์ด๋“  2๋“  ๋‘˜๋‹ค ์ž˜ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ๋Ÿฐํƒ€์ž„์ด ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ๋Š” ๊ทธ๋‹ฅ ๋ณต์žกํ•˜์ง„ ์•Š๋‹ค.

๊ทธ๋ƒฅ bootstrap์ด๋ผ๋Š” ์‹คํ–‰ํŒŒ์ผ์ด ์•ˆ์— ์žˆ์œผ๋ฉด ๊ทธ๊ฑธ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค.
๋‹น์—ฐํžˆ ์‹คํ–‰ํŒŒ์ผ์€ ๋žŒ๋‹ค ๊ทœ๊ฒฉ์— ๋งž๊ฒŒ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ ...

์ด์ œ ์ €๊ธฐ ์˜ฌ๋ฆด ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๋นŒ๋“œํ•ด๋ณด์ž.
๋นŒ๋“œ๋Š” ๋˜๋„๋ก ๋ฆฌ๋ˆ…์Šค์—์„œ ํ•˜๋Š”๊ฑธ ๊ถŒํ•œ๋‹ค. ์œˆ๋„์šฐ์ฆˆ์—์„œ๋Š” ๋นŒ๋“œ์‹œ ๋ง์ปค ๊ด€๋ จํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

๋จผ์ € ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ํŒŒ๊ณ 

๋ฆฌ๋ˆ…์Šค ํƒ€๊ฒŸ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
๋žŒ๋‹ค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฆฌ๋ˆ…์Šค๋กœ ๋™์ž‘ํ•ด์„œ, ๋ฐ”์ด๋„ˆ๋ฆฌ๋„ ๊ฑฐ๊ธฐ์— ๋งž์ถฐ์„œ ๋ฟœ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

rustup target add x86_64-unknown-linux-musl

cargo.toml์€ ์ด๋ ‡๊ฒŒ ํ–ˆ๋‹ค.

[package]
name = "lambda_start"
version = "0.1.0"
authors = ["myyrakle <sssang97@naver.com>"]
edition = "2018"
autobins = false

[dependencies]
lambda_runtime = "^0.2"
serde = "^1"
serde_json = "^1"
serde_derive = "^1"
log = "^0.4"
simple_logger = "^1"
simple-error = "0.2.2"

[[bin]]
name = "bootstrap"
path = "src/main.rs"

[[bin]] ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ์ถœ๋ ฅํŒŒ์ผ๋ช…์ด boostrap์ด ๋˜๋„๋ก ์ง€์ •ํ–ˆ๋‹ค.

์†Œ์Šค๋Š” ์ด๋ ‡๊ฒŒ ์งœ๋ฉด ๋œ๋‹ค.

use std::error::Error;

use lambda_runtime::{error::HandlerError, lambda, Context};
use log::{self, error};
use serde_derive::{Deserialize, Serialize};
use simple_error::bail;
use simple_logger;

#[derive(Deserialize)]
struct CustomEvent {
    #[serde(rename = "firstName")]
    first_name: String,
}

#[derive(Serialize)]
struct CustomOutput {
    message: String,
}

fn main() -> Result<(), Box<dyn Error>> {
    simple_logger::init_with_level(log::Level::Debug)?;
    lambda!(my_handler);

    Ok(())
}

fn my_handler(e: CustomEvent, c: Context) -> Result<CustomOutput, HandlerError> {
    if e.first_name == "" {
        error!("Empty first name in request {}", c.aws_request_id);
        bail!("Empty first name");
    }

    Ok(CustomOutput {
        message: format!("Hello, {}!", e.first_name),
    })
}

๊ทธ๋ƒฅ firstName์ด๋ž€ ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์•„์„œ ์ถœ๋ ฅํ•˜๋Š”๊ฒŒ ๋‹ค๋‹ค.

https://github.com/myyrakle/aws-lambda-rust
๋งŒ๋“ค๊ณ  ๋ณต๋ถ™ํ•˜๋Š”๊ฒŒ ๊ท€์ฐฎ๋‹ค๋ฉด ์ด๊ฑธ ํด๋ก ๋ฐ›์•„์„œ ๋Œ๋ ค๋„ ๋œ๋‹ค.

๋นŒ๋“œ๋Š” ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋ฉด ๋œ๋‹ค.

cargo build --release --target x86_64-unknown-linux-musl

๊ทธ๋Ÿฌ๋ฉด ์ €๊ธฐ์— boostrap์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ๊ฒƒ์ด๋‹ค.

์ €๊ฑธ zip์œผ๋กœ ์ž˜ ์••์ถ•ํ•œ๋‹ค.

zip -j rust.zip ./target/x86_64-unknown-linux-musl/release/bootstrap

๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ๋กœ ์˜ฌ๋ฆฌ๊ณ  ๋ฐฐํฌํ•˜๋ฉด ๋์ด๋‹ค.

์˜ฌ๋ฆฌ๊ณ 

ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณธ๋‹ค.

์งœ์ž”


์ฐธ์กฐ
https://aws.amazon.com/ko/blogs/opensource/rust-runtime-for-aws-lambda/
https://github.com/awslabs/aws-lambda-rust-runtime
https://crates.io/crates/lambda_runtime