clone toy projects/node_express_sns 썸네일형 리스트형 AWS 람다 사용하기 이번에는 S3에 올린 이미지를 리사이징한 후 줄어든 이미지를 다시 S3에 저장해보겠습니다. 사용자가 사이즈가 너무 큰 이미지를 올렸을 경우, 적절한 크기와 용량으로 이미지를 변경하는 것입니다. 이미지 리사이징은 CPU를 많이 사용하는 작업이어서 람다로 분리했습니다. nodebird 폴더 외부에 aws-upload 폴더를 만든 후 package.json을 작성합니다. handler 함수가 람다 호출 시 실행되는 함수입니다. 매개변수로 event와 context, callback이 주어집니다. event는 호출 상황에 대한 정보가 담겨 있고, context는 실행되는 함수 환경에 대한 정보가 담겨 있습니다. 직접 console.log해서 어떠한 정보들이 들어 있는지 확인해보는 것이 좋습니다. callback.. 더보기 AWS S3 사용하기 이 장에서는 서버리스 아키텍처와 노드를 함께 사용하는 방법을 소개합니다. 이미지를 업로드한 후, 리사이징해서 클라우드 저장소에 업로드할 것입니다. 선호하는 클라우드 서비스에 따라 16.2절(AWS)이나 16.4절(GCP) 중 하나를 선택해서 진행하면 됩니다. 서버리스 이해하기 서버리스는 영어로 ‘serverless’입니다. ‘server(서버)+less(없는)’이지만, 사실 서버가 없는 것은 아닙니다. 서버를 클라우드 서비스가 대신 관리해주므로 개발자나 운영자가 서버를 관리하는 데 드는 부담이 줄어든다는 의미입니다. 즉, 개발자는 자신의 서비스 로직을 작성하는 데만 집중할 수 있게 되는 것입니다. 서버리스 컴퓨팅을 할 때는 이전 장의 AWS EC2나 구글 컴퓨트 엔진(Google Compute Engin.. 더보기 AWS light sail 사용해서 배포하기 aws의 light sail 로 들어가서 create instance 클릭 인스턴스 위치 선택 화면에서 원하는 지역을 고릅니다. 기본적으로 서울이 선택되어 있는데, 여러분의 위치와 가까울수록 속도에 이점이 있습니다. 블루프린트는 노드를 선택하면 됩니다. 인스턴스 화면에 나오는 퍼블릭 IP에 브라우저로 접근하면 Congratulations! 화면이 뜹니다. 기본적으로 비트나미(Bitnami) 서버가 실행되고 있는데, 이 서버를 종료하고 우리의 NodeBird 서버를 띄울 예정입니다. 인스턴스 화면에서 Connect using SSH(SSH를 사용하여 연결) 버튼을 누릅니다. 브라우저 새 창에서 Lightsail용 콘솔이 실행됩니다. 이제 이 SSH를 사용해 명령어를 입력합니다. 이 SSH는 Lightsai.. 더보기 서비스 운영을 위한 패키지[redis, nvm] connect-redis 멀티 프로세스 간 세션 공유를 위해 레디스와 익스프레스를 연결해주는 패키지입니다. 기존에는 로그인할 때 express-session의 세션 아이디와 실제 사용자 정보가 메모리에 저장됩니다. 따라서 서버가 종료되어 메모리가 날아가면 접속자들의 로그인이 모두 풀려버립니다. 또한, Warning: connect.session() MemoryStore is not designed for a production environment, as it will leak memory, and will not scale past a single process라는 경고 메시지도 발생합니다. 이를 해결하기 위해 세션 아이디와 실제 사용자 정보를 데이터베이스에 저장합니다. 이때 사용하는 데이터베이스가 레.. 더보기 서비스 운영을 위한 패키지[pm2, winston, helmet, hpp] pm2 이 패키지는 ‘개발할 때 nodemon을 쓴다면, 배포할 때는 pm2를 쓴다’는 말이 있을 정도로 유용합니다. 가장 큰 기능은 서버가 에러로 인해 꺼졌을 때 서버를 다시 켜주는 것입니다. 또 하나 중요한 기능은 바로 멀티 프로세싱입니다. 멀티 스레딩은 아니지만 멀티 프로세싱을 지원해 노드 프로세스 개수를 한 개 이상으로 늘릴 수 있습니다. 기본적으로는 CPU 코어를 하나만 사용하는데, pm2를 사용해서 프로세스를 여러 개 만들면 다른 코어들까지 사용할 수 있습니다. 클라이언트로부터 요청이 올 때 알아서 요청을 여러 노드 프로세스에 고르게 분배합니다. 그럼 하나의 프로세스가 받는 부하가 적어지므로 서비스를 더 원활하게 운영할 수 있습니다. 단점도 있습니다. 멀티 스레딩이 아니므로 서버의 메모리 같은.. 더보기 서비스 운영을 위한 패키지[morgan,express-session,시퀄라이즈,cross-env, sanitize-html, csurf] 지금까지는 서버 개발을 localhost에서 진행했습니다. 별다른 설정 없이 서버 작업 결과를 볼 수 있어 편리하긴 하지만, 혼자만 볼 수 있다는 문제가 있습니다. 배포시에는 다른 사람이 사용하는 서비스이므로 개발 환경과 동일하게 진행할 수는 없습니다. 서버도 멈추지 않게 유지해야 하고, 에러 내역도 관리해야 합니다. 또한, 각종 보안 위협에도 대처해야 합니다. 이러한 작업을 쉽게 해주는 패키지도 알아볼 것입니다. morgan과 express-session 현재 익스프레스 미들웨어 중 일부가 개발용으로 설정되어 있습니다. 이 미들웨어들을 배포용으로 설정할 것입니다. process.env.NODE_ENV는 배포 환경인지 개발 환경인지를 판단할 수 있는 환경 변수입니다. 저는 주로 배포 환경일 때는 morg.. 더보기 부하 테스트 이번 절에서는 다른 종류의 테스트를 진행해보겠습니다. 바로 부하 테스트 (loadtest)입니다. 서버가 얼마만큼의 요청을 견딜 수 있는지 (또는 수용할 수 있는지) 테스트하는 방법입니다. 내 코드가 실제로 배포되었을 때 어떤 문법적, 논리적 문제가 있을지는 유닛 테스트와 통합 테스트를 통해 어느 정도 확인할 수 있습니다. 그러나 내 서버가 몇 명의 동시 접속자나 일일 사용자를 수용할 수 있는지 예측하는 일은 매우 어렵습니다. 특히 실제 서비스 중이 아니라 개발 중일 때는 예측하는 것이 더 어려워집니다. 코드에 문법적, 논리적 문제가 없더라도 서버의 하드웨어 제약 때문에 비즈니스가 중단될 수 있습니다. 대표적인 예가 "OOM (Out of Memory)" 문제입니다. 서버는 접속자들의 정보를 저장하기 위.. 더보기 통합 테스트 이번 절에서는 하나의 라우터를 통째로 테스트해볼 것입니다. "routes" 폴더에 "auth.test.js"를 작성합니다. 하나의 라우터에는 여러 개의 미들웨어가 붙어있고, 다양한 라이브러리가 사용됩니다. 이런 것들이 모두 유기적으로 잘 작동하는지 테스트하는 것이 통합 테스트 (integration test)입니다. npm install -D supertest Supertest 패키지를 사용해 auth 라우터들을 테스트할 것입니다. Supertest를 사용하기 위해서는 app 객체를 모듈로 만들어 분리해야 합니다. "app.js" 파일에서 app 객체를 모듈로 만든 후, "server.js"에서 불러와 Listen합니다. "server.js"는 app의 포트 리스닝만 담당합니다. npm start 명령어.. 더보기 이전 1 2 3 다음