본문 바로가기
728x90

전체 글15

장기 액세스 키 대신 브리지 프로필로 Terraform 돌리기 ~/.aws/credentials에 든 장기 액세스 키의 문제는 유출 가능성 자체가 아니다. 유출을 알아챌 방법이 없다는 것이다. 만료가 없으니 계속 통하고, CloudTrail에는 사람이 아니라 IAM 사용자 이름만 남으며, 회수하려면 그 키를 쓰는 사람 전원이 다시 설정해야 한다. 그래서 사람에게는 키를 주지 않기로 했다. 그리고 이 편에서 제일 아찔했던 건 정책이 아니라 검증 도구가 틀린 것이었다.왜 없앴나장기 키의 문제를 하나씩 보면 이렇다.만료가 없으니 계속 통한다CloudTrail에는 사람이 아니라 그 IAM 사용자 이름만 남는다. 누가 썼는지 모른다회수하려면 그 키를 쓰는 사람 전원이 다시 설정해야 한다. 한 사람만 뺄 수가 없다세 번째가 실무에서 제일 크다. 사람 하나가 나갈 때 키를 못 .. 2026. 9. 11.
MySQL 타임존 설정, TIMESTAMP와 DATETIME이 다르게 움직인다 MySQL에서 시간이 9시간 어긋날 때 흔히 서버 타임존 하나만 본다. 그런데 갈리는 지점은 서버·세션·JDBC 세 곳이고, 셋이 서로 다른 값을 들고 있을 수 있다.더 고약한 건 TIMESTAMP와 DATETIME이 다르게 움직인다는 것이다. TIMESTAMP만 세션 타임존으로 변환되고 DATETIME은 저장된 그대로 나온다.그래서 증상이 "전부 9시간 밀림"이 아니라 "어떤 값은 밀리고 어떤 값은 안 밀림"으로 나타난다. 이게 원인 추적을 어렵게 만든다.컬럼 타입에 따라 다르게 움직인다이걸 먼저 알아야 나머지가 읽힌다. MySQL 문서가 명확하게 갈라 놓는다.TIMESTAMP — 저장할 때 세션 타임존에서 UTC로 바꿔 넣고, 읽을 때 UTC에서 세션 타임존으로 되돌린다. 세션 타임존이 바뀌면 같은 .. 2026. 9. 10.
Flyway MySQL 프로시저 syntax error — SQL이 아니라 파서가 문제였다 Flyway로 MySQL 저장 프로시저를 넣었더니 syntax error near '' at line 80으로 배포가 멈췄다. 80번 줄은 멀쩡했고, 그 줄만 떼어 DB에서 직접 실행하면 잘 만들어졌다.원인은 SQL이 아니라 Flyway 8.0의 MySQL 파서였다. END REPEAT를 프로시저의 끝으로 잘못 읽고 그 앞에서 문장을 잘라 버린다.에러는 DB가 내지만 원인은 파서에 있다. 그래서 SQL을 아무리 봐도 안 보인다.어떤 구조에서 나나스키마 변경을 Flyway로 관리한다. 앱이 뜰 때 미적용 마이그레이션을 순서대로 자동 실행하고, 이력은 FLYWAY_SCHEMA_HISTORY에 남는다. 별도 CLI를 돌리지 않는다.테이블만 다룰 때는 문제가 없었다. 저장 프로시저와 이벤트를 넣으면서 겪은 것들.. 2026. 9. 9.
Aurora 메이저 버전 업그레이드는 성공한 다음에 터진다 오픈을 앞두고 Aurora를 세 번 건드렸다. 리더 추가, 메이저 버전 업그레이드, 비밀번호 관리 방식 변경.셋 다 되돌리기가 어렵거나 불가능한 작업이라 준비에 시간을 많이 썼는데, 그런데도 예상 못 한 게 나왔다.특히 메이저 업그레이드는 성공한 다음에 터진다. 옵션 그룹이 조용히 바뀌어 있기 때문이다.리더를 붙였는데 트래픽이 안 갔다읽기 부하를 나누려고 리더 인스턴스를 추가했다. 코드도 맞고 엔드포인트도 생겼는데 리더로 쿼리가 안 갔다.원인은 JVM의 DNS 캐시였다.리더가 생기기 전에 앱이 cluster-ro- 엔드포인트를 한 번이라도 조회했다면, 그 시점엔 그게 writer를 가리킨다. JVM이 그걸 캐시하고 있으면 리더가 생겨도 계속 writer로 간다.리더를 추가하면 앱을 재기동한다. 이게 절차.. 2026. 9. 9.
S3 스토리지 클래스 전환 비용 계산 — 작은 객체는 옮길수록 손해다 S3 수명 주기로 오래된 파일을 싼 클래스로 옮기면 요금이 준다고 생각하기 쉬운데, 작은 객체는 옮길수록 손해다.8KB 파일을 Standard-IA로 보내면 128KB로 과금된다. 16배다. Deep Archive로 보내면 40KB 오버헤드가 붙어 48KB가 되고, 여기에 전환 요청 요금과 최소 180일 보관이 따라온다.그래서 AWS는 2024년 9월에 기본 동작을 바꿨다. 128KB 미만 객체는 이제 기본적으로 전환되지 않는다.전환 비용은 세 갈래로 붙는다싼 클래스로 옮긴다고 저장 요금만 계산하면 틀린다. 실제로는 이렇게 나뉜다.전환 요청 요금 — 객체 하나를 옮길 때마다 요청 1건이다. 100만 개를 옮기면 100만 건이다. 저장 요금이 아니라 요청 요금으로 붙는다.최소 과금 크기 — Standard.. 2026. 9. 7.
816건 넣으려고 16,268행을 잠갔다 — MySQL INSERT SELECT 락 실측 같은 테이블을 읽어서 넣는 INSERT ... SELECT는 REPEATABLE READ에서 읽은 범위 전체를 잠근다.실측해 보니 816건을 넣으려고 16,268행을 잠갔다. 테이블 전체 행 수보다 큰 값이고, 모든 행에 갭까지 잠갔다는 뜻이다.READ COMMITTED로 내리면 0이 된다. 다만 그게 안전한 전제가 하나 있다.무슨 작업이었나예약 슬롯 테이블에 21시 시간대를 추가해야 했다. 기존 행을 읽어서 시각만 바꿔 넣는, 같은 테이블 안에서의 INSERT ... SELECT다.INSERT INTO RESERVE_SLOT (office_code, slot_date, slot_time, ...)SELECT office_code, slot_date, '2100', ... FROM RESERVE_SLO.. 2026. 9. 6.
728x90