GitHub actions runner 변경으로 인해 testcontainers 호환 트러블 슈팅
·
상황갑작스럽게 PR의 CI가 실패하는 상황이 발생했다.기존에 정상적으로 성공하던 코드베이스가 실패하고 있었다.목표원인을 파악해서 CI를 정상적으로 만들자는 목표를 세웠다.실행먼저 CI가 왜 실패하는지 먼저 파악했다.데이터베이스를 띄우는 통합 테스트들이 실패하고 있었고, ContextLoad 테스트에서도 터지고 있었다.FestabookApplicationTests > contextLoads FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractB..
GitHub Actions와 AWS 간 작업을 위한 OIDC 활용 임시 자격 증명 발급의 이해 및 방법
·
개요본 문서는 GitHub actions에서 개발자가 AWS의 IAM Access Token을 발급받아 관리하지 않고 CI/CD 과정에서 짧은 시간 유효한 임시 토큰을 발급받아 사용하는 방식이 어떤 방식으로 이뤄지는지 설명한다.자격 증명 획득 흐름AWS에서는 자격 증명을 AWS 외부 애플리케이션에 장기간 보관하지 않는 것을 강력히 권장한다.아무래도 권한 액세스 키를 관리해야하기 때문이다. 보안적으로 노출될 위험도 존재하고, 퇴사자가 발생하거나 정보를 알고있는 사람이 외부로 노출되었을 경우와 같은 불필요한 위험을 감수해야한다.따라서 AWS에서는 OIDC 토큰을 발급받아 이를 AWS가 검증하여 단기 자격증명을 발급해주는 방식을 제공한다.간단한 흐름은 다음과 같다.Identity Provider에 대한 정보를..
OAuth 2.0 Authorization Code Grant 방식
·
개요본 문서는 OAuth 2.0의 Authorization Code Grant 방식의 흐름과 용어들을 설명한다.OAuth 2.0의 Authorization Code Grant 방식의 전체적인 흐름을 이해하고 싶은 독자들을 위해 작성했다.자세한 구현 세부사항들은 해당 기능을 제공하는 개발 문서를 읽기 바란다. 설명에 덧붙여 카카오 로그인 다이어그램에서도 같은 흐름을 제공함도 보여준다.용어 정리Resource Owner: 사용자 즉, 리소스의 주인이다.Client: 리소스의 주인으로부터 권한을 위임받으려는 서비스이다.Authorization Server: 클라이언트가 리소스의 소유자의 권한을 얻을 수 있도록 도와주는 서버이다.Resource Server: 리소스 서버는 보호되는 리소스를 호스팅하는 서버이다...
OAuth와 OIDC의 역사
·
OAuth란?Open Authorization의 약자로, 사용자의 비밀번호와 같은 민감 정보를 노출하지 않고 하나의 서비스가 다른 서비스에 있는 사용자의 데이터 혹은 기능에 접근할 수 있도록 권한을 위임하는 표준입니다.예를 들어 내가 만든 서비스가 사용자의 네이버 캘린더에 접근해서 일정을 등록하는 기능이 필요하다면, OAuth를 구현하여 사용자의 네이버 비밀번호를 입력받지 않고도 권한을 위임받아 처리할 수 있도록 합니다.비밀번호를 평문으로 제공받거나 사용하기에는 보안적인 위험 요소들이 많았기 때문에 이런 방법을 고안했습니다.OAuth 1.0a초기의 OAuth 1.0a는 다음의 이유로 사라졌습니다.클라이언트(권한을 위임받는 서비스)에게 높은 연산 작업을 요구했다. 키를 총 4번 생성하는데, 이 작업은 CP..
festabook의 TPS 기준 서버 및 MySQL 튜닝
·
들어가며festabook의 서버 설정 튜닝을 위해 TPS를 측정하면서, 향상시킨 이야기이다.festabook의 가장 주요 서비스인 지도 정보 조회 api를 기준으로 TPS를 측정시키고, 여러가지 실험을 해보면서 TPS가 향상되는지 확인하면서 튜닝을 진행했다.서버 TPS 측정 환경 설정해당 게시글에서 이야기하는 TPS는 RPS와 혼용해서 사용했다. 하나의 API를 트랜잭션 단위로 잡고, 계산했다.실제로 k6 환경을 구성하는 이야기는 또 게시글을 작성하겠다. 해당 글에서는 어떤 판단기준으로 채택했는지만 작성했다.k6 - TPS 측정 도구TPS 측정 도구로는 다양하게 있었지만 그 중에서 우리는 k6를 채택했다.k6는 자바스크립트를 이용해서 스크립트를 작성하기 때문에 코드를 읽기 편했다.xk6-dashboard..
festabook MySQL 설정 튜닝
·
들어가며festabook 서비스에서 설정한 MySQL 서버의 설정들에 대해서 알아보자.MySQLMySQL의 설정 파일은 /etc/mysql/mysql.conf.d/mysqld.conf에 있다.festabook에서는 총 3가지의 옵션을 조정했다.max_connections = 80innodb_buffer_pool_size = 1536Minnodb_buffer_pool_instances = 2하나씩 알아보자.max_connections동시 클라이언트 연결의 최대 허용 수이다.연결 관리자 스레드는 서버가 수신하는 네트워크 인터페이스에서 클라이언트 연결 요청을 처리한다. 데몬 스레드로 동작하기 때문에 SHOW PROCESSLIST에 보이지는 않는다.만약 서버가 max_connections 한도에 도달하여 새로운..
HikariCP의 커넥션 수를 낮추는 것이 어떻게 CPU 경합을 줄일 수 있을까?
·
들어가며이번에 HikariCP를 학습하면서 github wiki를 읽게 되었다.https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing간략히 요약하면 다음과 같다.우리는 CPU가 단일 코어라도 시분할 방식을 통해 여러 프로세스, 스레드들을 동시에 실행하는 것 처럼 사용하고 있다. 하지만, 당연하게도 이 방식은 스레드 수가 적을수록 성능이 높아진다. CPU들이 여러 스레드 혹은 프로세스를 동시에 실행하는 것 처럼 보이게 하기 위해 눈에 보이지 않을 속도로 프로세스와 스레드를 갈아끼우면서 실행하기 때문이다. 이때 컨텍스트 스위칭이 발생하고 오버헤드가 발생하기 때문에 결과적으로 성능은 다소 떨어질 수 있다. 즉, CPU 코어가 4개 있을 때 성능 ..
데이터베이스 점진적 무중단 마이그레이션 트러블 슈팅
·
원인prod 환경이 구축되면서, 사용자의 데이터를 애플리케이션과 데이터베이스의 변경이 발생할 때마다 삭제할 수 없기 때문에 신중하게 데이터베이스의 스키마를 변경해야한다.이때 스키마를 변경하면서도, 기존의 데이터를 유지해야한다.또한, 데이터베이스의 스키마를 변경하면서도 애플리케이션이 중단 없이 실행되어야 사용자가 불편함을 느끼지 않기 때문에 데이터베이스 무중단 마이그레이션 작업이 필요하다.현재 문제 상황데이터베이스의 수정이 발생하여 마이그레이션 작업을 진행하려고 한다.이때, 다음의 3단계를 거친다.데이터베이스에 변경된 구조를 적용한다. 이때, 이전 버전과 새로운 버전이 함께 사용할 수 있는 스키마가 되도록 구현한다.데이터베이스에 있는 값들을 새로운 구조에 맞게 데이터를 이전한다. 예를 들어 name 필드가..