본문 바로가기

전체 글

서버리스 사진첩 만들기 어플리케이션의 기능 이미지가 업로드되면, 원본과 별도로 썸네일을 생성하고, 이를 별도의 버킷에 저장해야 합니다. 썸네일 이미지는 가로 200px의 크기를 가집니다. 썸네일을 저장할 별도의 버킷은 람다 함수의 환경 설정으로 구성되어야 합니다. 썸네일 생성이 완료되면, 메일로 해당 썸네일 URL과 함께 전송이 되어야 합니다. Amazon SNS를 활용합니다. S3 이벤트가 SQS로 전송되게 만들고, SQS로부터 이벤트를 받아 람다가 실행하게 만들어봅시다. S3의 Pre-signed URL 기능을 이용하여, 업로드 전용 URL을 획득하고, 이를 통해 이미지를 S3 업로드할 수 있게 만들어봅시다. 아키텍쳐 구성 서버리스 애플리케이션을 구성할 것이므로, AWS 람다를 사용한다. 람다의 트리거 기능을 사용하여 s3.. 더보기
[lambda]서버리스 애플리케이션 성능 최적화 대표적인 서버리스 애플리케이션 중 하나로 AWS의 람다가 있다. 서버의 환경관리를 해 줄 필요없고, 자동으로 확장하므로 아주 편리한 서비스이다. 그러나 서비리스의 가장 큰 단점 중 하나인 cold starts 문제가 있다. 이것이 무엇인지 알아보고 해결하기 위해 어떤 방법이 있는지 알아보자. cold starts와 latency 람다가 API를 통해 function을 실행시키도록 요청을 받을 때, 실행환경을 준비한다. 이 때 function에 필요한 코드를 다운 받는다. 설정에 따라 s3 버킷에서 가져올 수도 있고, ECR에서 컨테이너 이미지를 통해 가져올 수도 있다. 그 이후 메모리, 런타임, 환경설정한 것들에 따라 환경 설정에따라 실행환경을 만든다. 실행환경이 모두 만들어졌으면, 람다는 초기 코드를 .. 더보기
[MSA]API Gateway를 사용하여 간단한 서비리스 애플리케이션을 만들어보자 API Gateway-Lambda-DynamoDB 3-tier 아키텍처를 만들어볼 것이다. 여기서 람다함수로 DynamoDB에 레코드를 추가하는 간단한 코드를 사용한다. API Gateway의 API Key와 권한 부여자를 사용해 볼 것이다. 람다배포 serverlessland의 Lambda to DynamoDB 과정을 참고하여 sam을 통해 빌드, 배포까지 진행한다. 배포까지 진행하였으면 aws lambda invoke --function-name {Lambda함수의Arn를입력} --invocation-type Event \ --payload '{ "Metadata": "Hello" }' \ response.json --cli-binary-format raw-in-base64-out {"Metadata.. 더보기
[JS]OOP: Object Oriented Programming, 소프트웨어의 목적 오늘 마이크로 서비스의 비동기 통신방법인 메시지 서비스에 대해 공부했다. 서비스 간 결합을 loosely 하게 가져가면서 의존성을 낮출 수 있고 혁신의 가능성을 높여주기 때문에 굳이 메시지 서비스 단계를 아키텍처에 추가하는 것이라 보았다. 뭐 서비스 간 그렇게 한다는 이유는 이해했다. 그런데 이 의존성을 낮추는 행동은 소프트웨어 전반에 해당하는 궁극적 목표라고 들었다. 프런트엔드 개발자는 UI를 설계할 때, 컴포넌트화를 목표로 한다. 백엔드 개발자는 객체 지향 프로그래밍에서는 의존성 주입을 목표로 한다. 마이크로 서비스는 비동기 통신을 이용해 서비스 간 독립성을 부여한다. OOP는 객체지향 프로그래밍이다. 정말 많이 들은 개념이지만, 잘 모르기에 이번 기회에 정리해보고자 한다. 먼저 보자 class Un.. 더보기
[MSA]Circuit Breaker를 활용하여 부분 실패를 막자 MSA를 적용한 서비스에서 "부분 실패"가 발생한다면? MSA를 적용한 서비스는 여러 개 서비스 컴포넌트로 구성되고, 각 컴포넌트 간 호출을 하는 방식으로 독립적이지만 느슨하게 연결되어 있다. (Losely coupled) 이런 방식에는 하나의 컴포넌트에 장애가 발생하면 그것에 종속된 컴포넌트까지 장애가 전파되는 단점이 있다. 이해를 돕기 위해 "배달의 민족"과 유사한 배달 서비스를 생각해보자. 배달 서비스는 MSA를 적용하여 주문과 결재가 각각 독립적인 서비스로 구성되어있다고 하자. 위 그림에서 server A가 주문 서비스라고 하고, server B가 결재 서비스라 하자. 주문 서비스는 api호출을 통해 결재 서비스와 통신을 하는데, 결재 서비스에 문제가 생겨 응답을 하지 못하는 상황에 처했다면, 주.. 더보기
[MSA]NoSQL DB의 Eventual Consistency 마이크로 서비스란 기존의 하나의 서비스를 작은 서비스 단위로 나누어, 각 서비스가 독립적이지만 긴밀하게 연결되어 있는 상태를 유지할 수 있도록 구성한다. 그래서 수평 확장이 용이하게 되고, 서비스별 독립성이 보장되어 고가용성을 달성할 수 있다. 독립성을 보장하기 위해서는 각 서비스별 배포, 운영이 가능해야한다. 그래서 각 서비스별 NoSQL 데이터베이스를 사용하여 분산서비스를 구성하는 경우가 많다. 아래와 같은 그림처럼 각 서비스별 데이터베이스를 가지고 있어 독립적인 서비스로 사용할 수 있다. 그러나 결국 MSA는 하나의 서비스를 가르키는 말인데, 데이터 베이스가 이렇게 많아도 될까?라는 의문이 든다. MSA를 위해 DB를 꼭 분리해야할까? 꼭 그렇진 않다. 항상 어떠한 행동을 할 때 따를 수 있는 비용.. 더보기
마이크로 서비스와 서버리스 서버리스는 무엇일까? 말 그대로 서버가 없다는 뜻이지만, 실제로 서버가 없이 백엔드 로직을 처리할 수는 없다. 서버리스는 서버의 소프트웨어적인 부분, 즉 보안, 업데이트, 백업과 같은 관리과정을 대신해 줌으로써 서버에 대한 걱정 없이 애플리케이션 개발에만 집중할 수 있도록 하는 서비스이다. AWS의 EC2로 인해 서버를 하드웨어적으로 구축해야하는 부담을 덜어주었다면, 서버리스로 인해 소프트웨어적으로 관리해야 하는 부담을 덜어주었다. 마이크로 서비스는 무엇일까? 기존에는 프론트, 백, 데이터 베이스 개발팀으로 나뉘어 각자의 기능들을 개발하여 하나의 애플리케이션을 만들었었다. 이를 모놀리틱(Monolitic)이라 한다. 마이크로 서비스는 필요한 비즈니스 로직 별로 각 개발자들을 구성하여 하나의 독립된 서비스.. 더보기
[AWS]React ERR: missing script Codepipeline을 사용하여 프론트엔드 앱을 깃허브 소스를 빌드하여 s3에 배포하는 것을 자동화하고자 한다. build단계에서 다음과 같은 에러를 만났다. [Container] 2022/04/05 02:33:37 Running command npm run build npm ERR! missing script: build npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2022-04-05T02_33_37_516Z-debug.log [Container] 2022/04/05 02:33:37 Command did not exit successfully npm run build exit status 1 [Contai.. 더보기