코드스테이츠_Devops_4기 24

final) 프로젝트 마무리 회고

드디어 파이널 프로젝트가 끝났다! 내가 할 수 있을까 .. 싶었는데 역시나 항상 함께하는 팀원들이 있어서 영차영차 만들 수 있었다 프로젝트 소개 마라톤 대회 결과 기록 시스템 : 마라마라톤 (mrmrmthon) 개인 사용자와 대회 주최자를 위한 시스템 로그인 기능을 통해 토큰 발급 사용자에 따라 가능한 CRUD 작업이 다름 유저 데이터 베이스를 분리하여 관리 기록 데이터를 기반으로 사용자별 점수를 기록하는 시스템은 데이터 유실을 막기 위해 SQS를 통해 느슨하게 결합 가용성, 내결함성, 확정성, 보안성을 고려하여 시스템 구성 참고로 마라마라톤 이름 제가 아이디어를 냈답니다?(❁´◡`❁) 아키텍쳐 1️⃣ 개발자가 앱 개발을 하여 GitHub에 올리고 새로운 버전을 릴리즈하면 GitHubAction을 통한 ..

final) sns를 통해 웹훅으로 디스코드 메시지 전송하기

시간이 남으면 만들어 보자고 했던 웹훅 한번 만들어봤습니다. 원래 이런 아키텍쳐였는데 웹훅 개발을 하다보니 굳이 큐를 통해 메시지를 전달하지 않아도 되어서 sns에서 바로 람다가 디스코드 메시지를 전송하도록 했다. 람다를 만들고 기존에 우리가 만들어 둔 sns를 트리거로 붙여주었다 이때 자동으로 sns는 람다를 구독한다 이 구독이 뭔가하고 지워봤는데 지우니까 실행이 안되고 구독이 없다는 에러가 나서 다시 구독 설정을 해주었다, sns를 타고 람다까지 진입한 데이터 소스 코드를 수정해서 디스코드 메시지를 이쁘게 만들어주었다. 쨘 디스코드에서 웹훅을 할 수있도록 웹훅봇? 을 하나 만들어주어야한다. 그러면 기존 공식 기록 데이터베이스에 값이 들어가면 sns sqs를 통해 해당하는 사람에게 포인트가 적립되는 람..

final) IaC terraform 코드 작성

이것저것 작은 실수나 오타 빼고 리얼 개빡치는 오류나 설정을 작성해 보겠숩니다. 1. rds가 자꾸 default vpc에 맨들어지고 난리 보안그룹은 새로 만든 vpc에서 사용하는 보안그룹인디 rds는 default vpc에 만들어져서 안맞는다고 ㅈㄹ.. 그래서 rds의 vpc설정을 찾아보았다.. 콘솔에서는 vpc를 고르면 알아서 프라이빗 서브넷에 rds가 만들어졌는데, 테라폼은 뭐 서브넷 그룹으로 설정해줘야하는 것 같아서 서브넷 그룹일 만들어보았다 https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/mem-ug/SubnetGroups.html 서브넷 및 서브넷 그룹 - Amazon ElastiCache 이 페이지에 작업이 필요하다는 점을 알려 주셔서..

final) 서브넷 설정과 Grafana

서브넷 설정을 위해 새로운 VPC를 만들고 퍼블릭 서브넷과 프라이빗 서브넷을 만들었다 보안그룹도 새로 만들었당 일단 우리팀은 하나의 보안그룹을 사용하기로 해서 하나에 다 열어주었당 ECS 클러스터도 새로만든 vpc의 퍼블릭 서브넷에 만들어주었다 서비스도 만들긔 마찬가지로 퍼블릭 서브넷과 보안그룹까지 넣어주었다 elb도 붙여줌 데이터베이스도 새로 만들었다 메인 디비로 사용하는 다이나모디비는 따로 서브넷 설정할 필요는 없고 rds 만 서브넷 설정을 해주면서 다시 만들었다. rds는 vpc만 설정해주면 알아서 프라이빗 서브넷에 위치시킨다고 한다 끗~ 모니터링을 위해 그라파나를 띄울 ec2를 하나 만들어주었당 vpc 설정과 퍼블릭 서브넷 설정 그라파나를 도커로 올릴꺼라서 이러케.. 퍼블릭 IP 자동할당도 해주었..

final) 다이나모 디비를 트리거로 사용하는 람다함수만들기

다이나모 디비에 특정 테이블에 데이터가 들어가면 람다함수가 동작되도록 구현 시작했다. 트러블슈팅 1. 다이나모디비의 Stream 권한 설정 다이나모를 통해서 람다가 동작하려면 스트림설정을 해줘야한다. DynamoDB 스트림에 대해서만 읽기 액세스 권한을 부여하는 IAM 정책(테이블은 부여하지 않음) - Amazon DynamoDB 스트림에 대해서만 읽기 액세스 권한을 부여하는 IAM 정책(테이블은 부여하지 않음) 테이블에서 DynamoDB Streams를 활성화하면 테이블 항목의 모든 수정에 대한 정보가 캡처됩니다. 자세한 내 docs.aws.amazon.com 정책 만들어주었다. 그리고 람다함수를 정책을 추가해서 다시 생성해주었다 람다함수 트리거로 다이나모디비 붙이기 성공 그리고 람다함수의 값을 전달할..

Section3 실습과제 회고작성

야크쉐이빙 이번 실습과제를 진행하면서 만났던 잘못생각했던 부분이나 에러? 등을 야크쉐이빙을 해보도록 합시당. 1. serverless 프레임 워크로 배포한 애플리케이션은 삭제시에도 serverless 프레임워크로 삭제 실수로 serverless로 배포를 해서 aws 콘솔에서 삭제를 했었다. lamda와 apigateway가 만들어져서 각각 삭제를 해주었는데 이후 해당 앱을 다시 배포하니 해당 람다를 찾을 수 없다는 메시지가 나왔다. 람다를 콘솔에서 생성해야하나.. 싶었는데 팀원들의 도움으로 serverless remove 명령어를 이용하여 serverless 프레임워크로 삭제를 시켜주고 배포하니 정삭적으로 배포가 되었다. 2. 하나의 람다에서 각기 다른 두 가지 로직을 처리하는 구조 재고가 100개 이상..

Section3 실습과제 Day3

step 4를 진행하는 날이 되었습니당. 데이터베이스의 재고를 증가시키는 Lambda 함수 생성 𝅺먼저 강의록에 있는 API를 직접 쏴보았다 일단 직접 함수를 통해 디비를 update하는 stock-increase-lambda를 배포해주었댱 트러블 슈팅 -1 stock-increase-lambda 를 배포를 하고 콘솔에서 삭제를 했었는데 deploy가 되지 않았다. 그래서 serverless remove 명령어를 사용해서 삭제하고 다시 배포하니 정상 동작이 되었다 트러블 슈팅 -2 axios 가 install 이 안되는 현상이 있었다. axios install를 해도 package.json이 생기지를 않았다. 그래서 npm install을 하고 axios install를 해주었다. 윈도우에서 나타나는 현..

Section3 실습과제 Day2

실습과제가 시작되었당 또.. 조낸 귀찮아서 이때까지 블로깅을 1도 안했지만 언젠가 할거라는 믿음... 희망.. 뭐 ,, 그런걸 품고 나자신을 믿어보는거지.. 임시저장만 3개네.. 그래도 실습은 해야할것같아서 영차영차 씁니당... Step 1 : Lambda 서버(Sales API) - DB 연결 일단 만들어져있는 rds랑 람다함수를 연결해주었다. 트러블슈팅 -1 이상하게 윈도우 환경에서 .env 파일을 못읽어서 하드코딩해서 진행했당 유후~! 테스트에서는 별 이상 없었다 postman으로 정상 동작하는 것을 확인하고 serverless로 람다함수를 배포해주었다. 그리고 람다함수 환경변수로 지정해주었다. Step 2 : “재고 없음” 메시지 전달 시스템 구성 이제 재고가 없을 경우 구매하지 못하고 해당 메시..

Section3 마이크로서비스

Section3 이 시작되었습니다. 난생 처음 듣는 마이크로서비스~ 공부해보겠습니다 마이크로서비스 구조와 특징 마이크로서비스? 마이크로 서비스 아키텍처 애플리케이션을 다음과 같은 서비스 모음으로 구성하는 아키텍처 스타일입니다. 독립적으로 배포 가능 느슨한 결합 비즈니스 역량 중심으로 구성 소규모 팀 소유 유지보수에 유리하고, 테스트 가능해야 함 [출처 : https://microservices.io/] 서비스로서의 컴포넌트화 라이브로서의 컴포넌트화 서비스로서의 컴포넌트화 특징 프로그램 내 링크. 메모리상에서 함수 호출 개별적인 프로세스. 각 프로세스가 HTTP 또는 RPC로 통신 배포편의성 전체 프로그램 재배포 서비스 단위의 배포 컴포넌트 결합성 강함 약함 호출 비용 적음 높음 비즈니스 수행에 따른 구성..

Section2 실습과제 Day 4

드뎌 대망의 실습과제 마지막날! 마일스톤10 API 요구사항에 맞춰 서버 애플리케이션을 작성합니다. 데이터베이스에 접속해, 원하는 데이터가 잘 들어갔는지 확인해 봅니다. 프론트엔드가 잘 작동하는지도 같이 확인합니다. 일단은 가이드라인에 맞춰 디비 하나 생성해주었당 그리곤 WAS 소스코드를 수정하여 api 요청하는 코드를 짜주었다 노드js는 처음이라 쉽지 않았지만.. 똑쟁이 팀원들 덕분에 또 잘 완성할 수 있었다. 'use strict' module.exports = async function (fastify, opts) { fastify.get('/', async function (req, reply) { // 몽고디비의 데이터베이스를 지정 const database = this.mongo.client...