본문 바로가기

[Project] 프로젝트 삽질기61 (feat IAM MFA 강제) 들어가며NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. 프로덕트가 성장하면서 AWS 콘솔에 접근해야 하는 팀원이 조금씩 늘었습니다. 팀원들이 보다 안전하게 AWS 콘솔에 접근할 수 있는 환경을 구성하고 싶었습니다. 이를 위해 MFA 인증을 등록해야만 AWS 콘솔에 접근할 수 있도록 환경을 구축했습니다. 그럼 AWS 콘솔에 처음 접근하는 사용자에게 MFA 설정을 강제하려면 어떻게 해야 하는지 공유해 보려 합니다.            MFAMFA는 사용자가 계정에 로그인할 때 패스워드 입력 후 OTP와 같은 추가적인 인증 단계를 거쳐 보안을 강화하는 기술입니다. MFA를 활용하면 계정에 대한 무단 접근을 방지하고 보안을 강화할 수 있습니다. AWS는 고객의 데이터를 ..
[Project] 프로젝트 삽질기60 (feat aws-vault) 들어가며NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. AWS 환경에서 인프라를 관리하면서 문득 aws-cli 환경에 접근할 때 조금 더 안전하게 접근하려면 어떻게 해야 할까 알아보면서 aws-vault에 대해 알 수 있었습니다. aws-vault를 활용한다면, aws의 credentials 정보를 조금 더 안전하게 관리할 수 있다고 생각했습니다. 그럼 aws-vault를 어떻게 활용할 수 있는지 알아보겠습니다.                 aws-vaultAWS CLI를 로컬 환경에서 사용하는 경우 보통 access_key와 secret_key를 발급받습니다. 그리고 aws configure 명령어를 입력하여 사용자의 access_key, secret_key를..
[Project] 프로젝트 삽질기59 (feat transactional outbox) 들어가며NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. 저번 글에서 Transactional 데코레이터를 활용하면서 이벤트가 발행되지 않았다는 이유로 트랜잭션이 rollback 된다면 어떻게 대처해야 하는가에 대한 문제를 살펴봤습니다. 문제 해결을 위해서는 Transactional outbox 패턴을 적용해야 한다고 생각했습니다. 이번 글에서는 Transactional outbox 패턴이란 무엇이며, 패턴을 적용하면서 어떤 어려움이 있었는지 내용을 공유하고자 합니다.         문제점저번 글에서 작성한 문제를 다시 가져왔습니다. 만약 아래 로직처럼 데이터 저장 로직은 성공했지만 이벤트 발행에 실패할 경우, 트랜잭션은 어떻게 처리되어야 할까요? @Transact..
[Project] 프로젝트 삽질기58 (feat Transactional) 들어가며 NestJS와 PostgreSQL, TypeORM을 활용하여 프로덕트를 만들고 있습니다. 저번 글에서 커넥션 풀 누수 문제가 발생한 장애를 해결하는 과정을 공유했는데요. 장애를 해결한 후, 팀에서 커넥션 풀 누수 문제를 더 이상 겪지 않으려면 어떻게 해야 할까 고민했습니다. 이 글을 통해 팀 내에서 트랜잭션 제어 방식을 다르게 구성한 방법을 공유하고자 합니다. 문제 원인 TypeORM을 활용하면서 API를 구성할 때마다 매번 반복적으로 아래의 코드를 반복해서 작성했습니다. constructor(private readonly dataSource?: DataSource) {} const queryRunner = this.dataSource.createQueryRunner(); await queryR..
[Project] 프로젝트 삽질기57 (feat 커넥션 풀 누수) 들어가며 AWS Aurora PostgreSQL를 활용해서 서비스를 운영하고 있습니다. 성능 테스트를 하면서 Writer DB의 Connections 수가 특정 숫자 이상이 되면 커넥션을 더 이상 맺을 수 없어서 장애가 발생한다는 것을 파악했습니다. 장애를 겪을 것을 대비하여 RDS의 connections 수를 트래킹 하며 커넥션 수가 특정 개수 이상이 넘으면, slack으로 알림을 받도록 구성했습니다. 얼마 전, max connections 수가 특정 수를 넘었다는 알림을 받았습니다. 알림을 받은 이후 시간이 지나도, 커넥션 수가 떨어지지 않는 문제가 생겼습니다. 그 과정에서 팀에서는 어떤 문제를 겪었고, 이 문제를 어떻게 해결했는지 공유하고자 글을 씁니다. RDS 커넥션 풀 누수 저희 팀에서는 Clo..
[Project] 프로젝트 삽질기56 (feat debug) 들어가며 여러분들은 만약 테스트 코드를 작성하지 않고 API를 개발한다면 API가 정상 동작하는지 어떻게 확인하시나요? 아마 서버를 직접 실행한 후, API를 여러 번 호출해 보면서 개발한 API가 정상적으로 동작하는지 확인해야 할 것입니다. 그 과정에서 로직 중간에 console.log 코드를 작성해서 실행하며 동작을 확인하기도 합니다. console.log 코드를 작성해서 디버깅을 하다가 우연히 운영 환경의 서버로 코드가 머지될 경우, 불필요한 로그 출력 코드가 추가되는 문제도 발생할 수 있습니다. 저는 이런 문제를 겪지 않기 위해 서버 개발을 할 때 디버거를 활용합니다. 디버거를 활용하면 console.log 코드로 확인하는 방식 보다 API 동작에 대한 문제를 깊게 파악할 수 있습니다. 주변을 둘..
[Project] 프로젝트 삽질기55 (feat firestore, bigQuery, functions) 들어가며 NestJS와 TypeORM을 활용하여 프로덕트를 만들고 있습니다. 제가 개발하고 있는 서비스에는 채팅 기능이 존재합니다. 유저가 서비스 내에서 채팅을 할 때 생성된 데이터는 Firebase의 Firestore에 저장하고 있습니다. 한 번은, 사용자들이 언제, 어느 시간대에 채팅을 하는지와 관련된 행동 데이터를 분석하고 싶었습니다. 데이터를 분석하려면 Firestore의 데이터를 모두 조회해야 했는데, 전체 데이터를 조회하는 과정이 상당히 번거로웠습니다. 만약 Firestore에 저장된 데이터를 BigQuery로 옮긴다면, 보다 빠르고 효율적으로 채팅 데이터를 분석할 수 있다고 판단했습니다. Firestore의 데이터를 BigQuery로 옮기는 과정에서 Cloud Functions를 사용했습니다..
[Project] 프로젝트 삽질기54 (feat 검색 로그 구축 4) 들어가며 저번 글에서 적재한 로그 데이터를 분석하기 위한 방식에 대해 알아봤습니다. 이번 글에서는 추출한 데이터를 시각화하는 방식에 대해 정리해보려 합니다. 바로 시작하겠습니다. 데이터 시각화 데이터 시각화는 위처럼 구성했습니다. Athena를 활용하여 데이터를 조회하고, 조회한 데이터를 QuickSight에서 시각화하는 방식을 구성했습니다. 그럼 QuickSight로 어떻게 데이터를 시각화하는지에 대해 알아보겠습니다. QuickSight QuickSight는 AWS에서 제공하는 serverless managed BI 상품입니다. 여기서 BI란, Business Intelligence의 줄임말로, 데이터를 통합하고 분석해서 기업 활동에 연관된 의사결정을 돕는 프로세스입니다. QuickSight를 사용하여..
[Project] 프로젝트 삽질기53 (feat 검색 로그 구축 3) 들어가며 저번 글에서 검색 로그 구축을 위한 AWS 환경 세팅 방식과 로그 적재 방식에 대해 알아봤습니다. 이번 글에서는 적재한 로그 데이터를 분석하기 위한 방식에 대해 정리해보려 합니다. 바로 시작하겠습니다. 데이터 분석 아키텍처 데이터 분석 아키텍처는 위처럼 구성했습니다. AWS Glue Crawler를 활용하여 데이터가 모여 있는 S3버킷에 저장된 로그의 스키마를 생성했습니다. 그 후 AWS Athena를 활용하여 Glue Crawler를 활용해서 카탈로그화 한 데이터를 SQL문을 활용하여 조회하는 과정을 구축했습니다. 그럼 Glue를 활용하여 스키마를 생성하고, Athena를 활용하여 데이터를 조회하는 과정을 어떻게 구현할 수 있는지에 대해 알아보겠습니다. Glue Glue는 AWS에 저장된 데이..
[Project] 프로젝트 삽질기52 (feat 검색 로그 구축 2) 들어가며 저번 글에서 검색 로그 구축을 위해 필요한 사전 지식을 정리했다면, 이번 글에서는 검색 로그 구축을 어떻게 할 수 있는지와 관련된 내용을 정리해보려 합니다. 바로 시작하겠습니다. Kinesis Streams 데이터 수집 아키텍처는 위와 같이 구성했습니다. 그럼 먼저 Kinesis Streams, Kinesis Firehose를 구축하고, EC2에 연결하여 데이터를 전송하는 부분에 대해 알아보겠습니다. 먼저 AWS에서 검색창에 Kinesis라고 검색하여 들어가면 위와 같은 화면이 나올 것입니다. 여기서 데이터 스트림 생성 버튼을 클릭합니다. 그 후 data stream 이름을 설정합니다. 저는 검색 로그를 저장할 것이기 때문에 search_log라고 입력하고, 용량 모드는 온디멘드를 선택했습니다...