전체 282

AWS IPv4 요금변경

사이드 프로젝트를 하던 중, 요금이 너무 많이 나오는 것 같아서 요금을 추적해 보니, IPv4에 대한 새로운 요금 정산 방식이 추가되어서 그렇다고 한다. https://aws.amazon.com/ko/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/ New – AWS Public IPv4 Address Charge + Public IP Insights | Amazon Web Services We are introducing a new charge for public IPv4 addresses. Effective February 1, 2024 there will be a charge of $0.005 per IP per hour for al..

SSH 트랩 만들기

인터넷을 보다가 신기한 프로그램이 있어서 하나 가져와봤다. https://github.com/shizunge/endlessh-go GitHub - shizunge/endlessh-go: A golang implementation of endlessh exporting Prometheus metrics, visualized by a Grafana dashboa A golang implementation of endlessh exporting Prometheus metrics, visualized by a Grafana dashboard. - GitHub - shizunge/endlessh-go: A golang implementation of endlessh exporting Prometheus metri..

잡다한 이야기 2023.12.03

Github action 개선하기

먼저, 현재 프로젝트의 github action은 한개의 step으로 이루어져 현재 진행 단계를 알기가 힘들었다. 이것은 빌드 및 배포를 통합한 github action이다. 그래서 해당 작업을 좀 더 알아보기 쉽게 바꾸어 보기로 했다. 먼저 배포 과정부터 정리해 보았다. tag 입력 확인디펜던시 다운로드빌드배포환경 설정배포성공 또는 실패 결과 슬랙 전송 위의 4가지 단계로 정규화를 시킬수 있었다. 여기서 공통으로 묶을 수 있는 작업을을 function 형태로 묶어보고 싶었다. 그래서 찾아보던 중 function과 비슷하게 사용 가능한 reusable workflows가 있었다. 해당 기능은 말 그대로 workflow를 재사용 가능하게 하는 기능이였다. 출시된지 얼마 안된거 같지만, 내가 원하는 기능이기..

Postgres 자연어 검색하기

Postgres에 있는 문자를 자연어 검색을 할 필요가 있어서 자연어 검색에 대해서 찾은 내용들을 정리해 볼까 한다. 먼저 테스트 환경은 다음과 같다. M1 Pro, postgres 14.x, organization 테이블의 name 칼럼에 100만개의 문자열 입력 동일한 문자열을 구하는 방법은 다음과 같다.select name from organization where name = '문자열' 하지만 해당 sql은 완벽히 매치가 되는 문자열에 대해서만 검색이 가능하므로, index를 추가하면 검색 속도는 좋아지겠으나 exact match만 지원하므로 검색에 제한이 생긴다. 다음 방법은 like를 사용한 full text search를 사용하는 방법이다. 사용법은 다음과 같다.select name from..

서버 인프라/DB 2023.11.18

Typeorm querybuilder에서 bigint number로 받기

typeorm에서 querybuilder를 사용해서 데이터를 뽑아오는 작업을 했다. postgres에서 pk를 Bigint로 설정 후 querybuilder에서 받아오니 무조건 string으로 가져오는 문제가 있었다. 공식 문서를 찾아 보니 bigint가 string으로 넘어오는 것은 의도한 동작으로 보인다. https://typeorm.io/entities 하지만 타 ORM을 살펴보니 Bigint 타입은 바로 숫자로 사용이 되는 것으로 보였다. (JPA는 Long으로, Django는 정수 타입으로 바로 캐스팅) 그리고 기존의 개발된 코드를 보니 transformer를 사용해서 repository에서 바로 가져올 때는 number 타입으로 가져오는 것을 볼 수 있었다. 그래서 기존의 repository와..

Sonoma 업데이트 후 react native 실행 안되는 오류

역시 맥 업데이트는 함부로 하면 안된다. 이번에 Monterey에서 Sonoma 업데이트 이후 ios 시뮬레이터를 돌리려는 순간, 다음과 같은 에러가 떴다. error Error: Command was killed with SIGABRT (Aborted): xcodebuild -list -json 2023-10-03 17:13:06.373 xcodebuild[63549:4107744] DVTErrorPresenter: Unable to load simulator devices. Domain: DVTCoreSimulatorAdditionsErrorDomain Code: 3 Failure Reason: The version of the CoreSimulator framework installed on thi..

카테고리 없음 2023.10.03

VPC Peering 사용하기

이번에 서버를 글로벌 확장을 하게 되면서 각 VPC간에 연결을 해야 할 상황이 왔다. 그래서 Peering을 하면서 간단히 정리해 보려고 한다. 개요 처음에는 각 국가의 서버 정보가 달라야 하기 때문에 아키텍쳐 전체를 복사하려고 했으나, 모니터링 및 기타 중앙에서 관리해야 하는 앱이 있고, 해당 앱에 대해서는 처음부터 구축하기에는 공수가 많이 들었다. 그래서 서비스되는 애플리케이션은 Terraform을 사용해서 복사하고, BI 또는 모니터링 애플리케이션에 대해서는 AWS의 내부 네트워크를 사용해서 타 리전의 애플리케이션에 접속하여 외부 네트워크를 거치지 않고 안전하게 데이터에 접근할 수 있게 할 계획이다. 먼저 VPC Peering과 비슷한 서비스인 Transit Gateway에 대해서 조사해 보았다. ..

NestJS Graceful shutdown

실행중인 NestJS를 종료하고 싶은데, 실행중인 작업이 있으면 종료하기 애매할 것이다. 해당 세션은 종료가 된 이후에 업데이트가 되어야 하기 때문이다. 이러한 문제를 NestJS는 shutdown에 관련한 인터페이스를 제공하여 SIGTERM 신호가 들어올 때의 동작을 정의한다. 구현 import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ShutdownSignal } from '@nestjs/common'; const PORT = 3001; async function bootstrap() { const app = await NestFactory.create(AppModule); app.en..

express에서 공통 트랜잭션 ID 부여하기

express를 사용한 서버를 만들면서 각 트랜잭션마다 공통적인 ID가 있으면 좋겠다는 생각이 들었다. 이러한 생각에 기반하여 여러가지 방법을 찾아 보았는데, 역시 동시성 제어 관련해서 문제가 있었다. 해당 문제와 관련해서 해결 방법을 생각해 보았다. 개요 한개의 요청마다 고유ID를 부여하여 로그를 쉽게 남길 수 있게 하고 싶다. 이 때 동시성 제어와 관련한 문제를 해결해 보려고 한다. 사례 조사 오래전부터 사용되었던 Spring 프레임워크에서는 ThreadLocal를 사용하고 있었다. Java는 기본적으로 멀티스레드를 지원하는 언어이기 때문에 동시에 여러개의 트랜잭션을 처리할 때 스레드를 나누어서 처리한다. 이 때 ThreadLocal를 사용하여 각 스레드마다 특정 값을 저장할 수 있다. 이 덕분에 각..

12 Factor App 이란?

개요 개발 경험이 많고 Heroku 플랫폼을 운영한 사람들이 정리한 규칙이다. 현대의 클라우드 애플리케이션 (SaaS)을 효율적으로 운영하기 위한 개발 규칙이다. 주요 내용 1. Codebase 코드베이스와 앱은 일대일 상관관계가 있다. → 코드는 한곳에서 개발 및 배포되어야 한다. 코드베이스가 여러개인 경우 → 분산 시스템으로 간주한다. 각각의 코드베이스는 12 factor를 준수한다. 여러앱이 동일한 코드를 공유하는경우 → 12 factor를 위반한 경우이다. 공유되는 코드를 라이브러리화 하고 각 앱에 종속성을 주입한다. 앱 배포가 여러개인경우 → branch를 활용하여 배포 분리 2. Dependencies 애플리케이션은 전체 패키지의 암묵적인 존재에 절대 의존하지 않는다. 애플리케이션의 모든 종속..