Ruby on Jets로 api 서버 만들기

slowwalker2·2020년 5월 23일
0

개요

뭔가 만들고 싶었다. 회사에서 쓰는 기술을 또 복습하자니 지겹기도 하고, 슬슬 aws 프리티어도 다되어가니 상주서버를 두기는 금전적인 부담감이 있었다. 그래서 선택한 Ruby on Jets.
평가판이지만 Amazon RDS Proxy 도 지원을 시작해서 Lambda 만으로 백엔드를 구성해봐도 괜찮겠다 싶었다.

그래서 Ruby on Jets 가 뭔데

공식문서를 보면 이렇단다. 여느때와 같이 구글번역을 사용했음.

Jets는 서비스를 쉽게 만들고 배포 할 수있는 Ruby 서버리스 프레임 워크입니다. 
여기에는 API를 구축하고 AWS Lambda에 배포하는 데 필요한 모든 것이 포함됩니다. 
Jets는 또한 AWS 서비스와 리소스를 결합하는 기능을 작성하는 데 적합합니다.

참고로 AWS Lambda 는 2018년 11월부터 Ruby 런타임환경을 지원한다. 최근에 회사에서 하는 작업이 Thumbnail 처리를 배치서버에서 Lambda 로 이관하는 일인데, 원래 돌아가던 코드를 그대로 카피페할 수 있어서 참 좋드라. 여담이지만 Ruby2.5 런타임환경엔 ImageMagick이 기본으로 들어있다(왜지?). 그래서 따로 Layer 를 구성하지 않아도 편하고 좋았따.

응. 일단 jets new 를 해볼까

내 맥은 소중하니까 도커를 쓴다. Jets 는 ruby2.5를 지원한다.

docker run -it --rm -v ${PWD}:/app ruby:2.5.3 \
  gem install jets && \
  jets new walkers-jets --api --no-database

근데 이게 웃긴게 --api 옵션을 붙여도 webpacker 어쩌고 하는 파일들을 만들어버리더라. 그래서 나중에 하나하나 삭제하느라 좀 귀찮았다.
글고 --no-database 를 안붙이면 에러가 나드라. 프로젝트 생성이 안되는건 아닌데 보기 싫어서 첨엔 --no-database 로 진행해서 나중에 db설정을 붙였당.

본격적인 환경구축

실행환경 만들기.

FROM ruby:2.5.3

RUN apt-get update -qq && \
    apt-get install -y \
      build-essential \
      libpq-dev \
      vim \
      zip \
      unzip \
      rsync \
      --no-install-recommends && \
      rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY Gemfile Gemfile.lock ./
RUN gem install bundler -v 1.17.3 && \
  bundle install --system

COPY . ./

EXPOSE 8888
CMD ["jets", "server", "--host", "0.0.0.0"]

프론트엔드는 리액트로 구성할꺼라 node 관련 라이브러리는 안넣었다.
공홈에는 요래 써있었다.

https://rubyonjets.com/docs/install/

For apps with HTML pages, jets uses webpacker to compile assets,
which requires yarn. Node version manager, nvm, is recommended 
if you want to manage node versions.

개발

jets 는 rails 랑 너~무 닮아있다. 그러니 Rails 경험자는 그냥 걱정없이 손을 담궈봐도 괜찮다. 근데 rails 프로젝트의 디플로이도 실험적으로 지원을 한다고 하니 관심있는 사람들은 해보셔도.
글고 Jets 서버리스 프레임워크지만 로컬에선 그냥 하나의 서버를 띄우는 것 처럼 동작확인이 가능한 것이다. 소스코드 반영도 바로바로 되니 매우 좋음.

디플로이

기본 aws credential 이 필요하다. 난 아직 별도 CI/CD환경이 없으니 로컬에서 바로 때려넣는다. docker-compose 를 쓰고있으니 대충 이런 커맨드를 때리고있음. 결론은 jets deploy 땅 치면 다 알아서 해줍니다!

docker-compose exec \
  -e JETS_ENV=production \
  -e AWS_REGION=xxx \
  -e AWS_ACCESS_KEY_ID=xxx \
  -e AWS_SECRET_ACCESS_KEY=xxx \
    web jets deploy

근데 한가지 주의해야하는 점이, route.rb 의 모든 라우팅설정이 Lambda 화 되니, CRUD 를 모두 필요로하는게 아니라면 resources :posts 같은 설정은 지양하는게 좋겠다.

이것도 여담인데, github action이 한달에 3000분까지 무료니까 쓰는게 이득임.

결과는 이러함. walkers-jets-prodjets deploy 코맨드를 통해 만들어진 API 이다.

결론

쓰레기똥을 연성했지만, 암튼 잘 동작한다. 되게 느린데 잘 보면 움직이긴 한다.
실제 서비스에서 쓸만한지는 좀더 만져봐야 알겠지만, 관심있는 분들은 만져보셔도 좋을듯요!

profile
띨띨함

0개의 댓글