Rust로 Lambda 배포의 즐거움

juunini·2021년 11월 6일
3
post-thumbnail

여러분 안녕하세요

쥬니니입니다. Joy of Coding 에 오신것을 환영합니다. 항상 하던대로, 오늘도 예쁜 코드를 짜보도록 합시다.

처음 오신 분들도

AWS에 있는 낡은 계정을 꺼내서(?) 꼭 저와 함께 배포를 해보세요. 조금 연습하면 정말로 멋진 배포를 할 수 있게 됩니다.

자 그럼 오늘 필요한 것들은

필요한 것들을 비추는 동안 설명을 시작할거에요.

  • AWS 계정
  • 컴퓨터
  • 고양이

여기서, 다른건 없어도 괜찮지만 고양이는 꼭 있어야 돼요.
자, 모두 준비가 되셨으면 저를 따라 시작해볼게요~

그럼 AWS부터 준비해볼까요?

AWS Console 에 로그인부터 해볼게요.
자, 그럼 IAM 에 들어가볼까요?
그럼 사용자 탭이 보이실거에요.

사용자를 누르고, 보안 자격 증명 을 누를거에요.

엑세스 키 만들기 를 눌러서, Access KeyAccess Secret Key 를 만들거에요.

다 하셨으면, AWS Cli 를 설치할거에요.
그 후에 터미널에 aws configure 를 입력해서 정보를 입력하시면 돼요.
리전은 ap-northeast-2 를 입력하면 돼요.
어때요? 참 쉽죠?

그 다음은 Rust 프로젝트를 만들어볼거에요.

serverless-aws-rust-multi 라는 프로젝트를 보고 할거에요.

npx serverless install \
  --url https://github.com/softprops/serverless-aws-rust-multi \
  --name lambda-functions-app \
  && cd lambda-functions-app \
  && npm ci

이렇게 하면 기본 프로젝트가 만들어질거에요.
여기에 조금만 키보드를 누르면 아름다운 프로젝트가 만들어지겠죠.
개발자가 도망가도록 키보드를 마구마구 치세요

serverless.yml 을 조금 건드려볼게요

custom:
  rust:
    dockerless: true

도커를 쓰게 되면 제공되는 컨테이너의 rust 버전이 1.43 버전이거든요?
그런데 우리는 1.50 이상의 rust를 사용할거에요.

serverless-rust 페이지에 가서 x86_64-unknown-linux-musl 을 검색하세요.
그리고 설명서대로 하는거에요.

만약 이렇게 했는데도 안되서 망쳤다는 기분이 들더라도 너무 걱정하지 마세요.
조금만 흑마술을 부리면 금방 무슨일이 있었냐는듯이 해결될거에요.
걱정 마세요. 망친게 아닙니다. 행복한 삽질일 뿐이에요.

자, 도커에 흑마술을 부려봅시다.

docker pull rustserverless/lambda-rust:latest &&\
docker tag rustserverless/lambda-rust:latest softprops/lambda-rust:0.2.7-rust-1.43.1

이렇게 하고 아까 넣었던 dockerless 옵션을 다시 제거해주세요.
그럼 1.50 버전의 도커가 1.43 버전 도커로 둔갑해서 작동할거에요.

이렇게 하면 되지만 여러분은 어릴 때 부터 너무 흑마술에 심취하지 마세요.
그러다보면 40살에 대마법사가 되거든요.

이제 rust 코드를 건드려볼거에요.

world 경로에 있는 main.rs 파일을 보면 lambda_http 라는걸 사용하고 있어요.
이게 있어야 http 요청을 받았을 때 응답할 수 있어요.

req를 어떻게 다루는지 볼까요?

Body 를 받고싶으면 이렇게 하면 돼요.

use lambda_http::{Request, Context};
use serde_json::{Value, json}

async fn world(req: Request, _: Context) -> Result<Value, Error> {
    let body = json!(req.body());
    Ok(body)
}

그리고 다음은 url query strings를 받아볼거에요.
아주 쉬워요.

use lambda_http::{Request, RequestExt, Context};
use serde_json::{Value, json}

async fn world(req: Request, _: Context) -> Result<Value, Error> {
    let query_params = req.query_string_parameters();
    let mut query: HashMap<String, String> = HashMap::new();

    for (key, value) in query_params.iter() {
        query.insert(String::from(key), String::from(value));
    }
    Ok(json!(query))
}

마음껏 코딩하셨으면 이제 배포를 해볼까요?

우선 serverless.ymlregionap-northeast-2 로 할거에요.

npx sls deploy

그 뒤에 이렇게 하면 배포가 될거에요.

빌드가 오래걸리시나요?

그럼 그 동안 저번 시간에 나왔던 제 고양이를 소개해드릴게요.

하얀 아이가 샤갈이고, 검은 아이가 고마에요.
이 방송을 하는 동안 6살이 되었죠(?).

고양이와 같이 사는건 매우 즐거운 일이에요.
제가 너무 힘들면 가끔 대신 코딩을 해주기도 하거든요.

가끔 제가 코딩을 너무 못하면 고양이가 훈수를 두어주기도 합니다.

아, 어느새 배포가 다 되었군요.

터미널에 배포된 주소가 나올거에요. 눌러서 들어가보세요.
lambda_http 를 사용한 쪽은 응답이 오고, 안 쓴 쪽은 에러가 날거에요.

rust-serverless-lambda-template 여기엔 제가 미리 그려놨던 프로젝트가 있어요.
나무를 두세개 정도 더 그려놨어요.
보고, 따라 그리셔도 됩니다.

오늘은 여기까지 할게요.
그럼 여러분 안녕히계세요~

profile
Full StackOverFlow

4개의 댓글

comment-user-thumbnail
2021년 11월 8일

냥이 너무 귀여웡 다음에도 냥이 보여주시는거죠?

1개의 답글
comment-user-thumbnail
2021년 11월 9일

샤갈이 뺨 꾹눌러보고 싶네요...

1개의 답글