Failed to put records: Failed to open TCP connection to kinesis.us-west-2.amazonaws.com:443 (executi
Fix Plan: Kinesis put_records TCP timeout hardening
Scope#
RCA 의 "즉시 조치" 는 없음 (단발성, 이미 resolved) 이지만 사용자가 cluster 를 approved 로 승인. RCA "단기 개선(1주 이내)" 3개 항목 중 pure-code, low-risk, 도메인 조율 불필요 두 개만 반영:
Cupix::Aws::Kinesis클라이언트에 명시적 timeout / retry 파라미터 추가 — request path 에서 최악 15s block 이 재발하는 것을 방지.Cupix::EventService.publish_event의 rescue 를 실제 발생하는 예외까지 확대하고warn로그로 downgrade — 순간적 네트워크 지연이 API 500 으로 확대되지 않도록 (동기 호출 자체는 유지).
제외 항목 (별도 트랙):
- KinesisPutRecordsWorker 로 이관 —
publish_event실패가 API 요청 성공/실패의 하드 게이트인지 도메인 확인이 필요. 이는 이벤트 시맨틱스 변경이므로 아키텍처 리뷰가 필요. RCA 본문에도 "domain 확인 필요" 로 명시. 자동 PR 범위에서 제외하고 별도 Jira 로 후속 처리 권장.
Changes#
tesla: lib/cupix/aws/kinesis.rb#
- What:
kinesis_client메서드가Aws::Kinesis::Client.new를 호출할 때 명시적http_open_timeout과retry_limit을 전달하도록 변경. 기본값(open 15s, retry 3) 대신 open 5s / retry 2 를 사용해, 순간 네트워크 지연 시 request thread 가 최대 ~5s 만 block 되게 함. - Why: RCA Root Cause Summary — aws-sdk-core 기본
http_open_timeout: 15s가 request path 에서 그대로 노출되어 사용자 요청 실패로 확대됨. 명시적 상수 도입은lib/cupix/http_client.rb(TSLA-13560) 에서 검증된 동일 패턴. - Lines: 19-21 (
kinesis_client메서드 내부의::Aws::Kinesis::Client.new(...)인자 확장). 상수는 파일 상단class Kinesis하위에HTTP_OPEN_TIMEOUT = 5,RETRY_LIMIT = 2로 도입.
tesla: lib/cupix/event_service.rb#
- What:
rescue RestClient::Exception => e절 앞에rescue Seahorse::Client::NetworkingError, Aws::Kinesis::Errors::ServiceError => e절을 추가. 새 rescue 는Cupix::Logger.warn로 기록하고Cupix::Errors::System를 raise 하지 않고 nil 반환 (event publish 실패가 caller 요청을 실패시키지 않게 한다). 기존RestClient::Exception경로와 성공 경로는 그대로 유지. - Why: RCA Fix Recommendation — 실제 발생 예외 (
Seahorse::Client::NetworkingError=Net::OpenTimeoutwrap) 가 기존rescue RestClient::Exception를 우회하여 caller (Eventable::Events::Base.create_event) 로 그대로 전파되고, model callback 실패가 API 500 로 이어짐. Kinesis 순간 네트워크 지연은 event telemetry 손실에 국한되어야 하며 사용자 요청 실패로 확대되어서는 안 됨. - Lines: 50 직전에 새 rescue 블록 추가 (약 3-6 줄).
tesla: spec/lib/cupix/aws/kinesis_spec.rb#
- What:
.kinesis_clientdescribe 블록에 새 example 추가 —Aws::Kinesis::Client.new가http_open_timeout: 5, retry_limit: 2를 포함하는 kwargs 로 호출되는지 검증. - Why: 상수/타임아웃 변경이 소리없이 회귀되지 않도록 계약을 spec 으로 명시. 기존 memoization 스펙과 같은 스타일로 추가.
- Lines: 기존 6-21 describe 블록에 1개 example 추가 (약 5-8 줄).
Acceptance Criteria#
-
git diff origin/develop -- lib/cupix/aws/kinesis.rb가HTTP_OPEN_TIMEOUT,retry_limit,http_open_timeout추가만 포함. -
git diff origin/develop -- lib/cupix/event_service.rb가Seahorse::Client::NetworkingError/Aws::Kinesis::Errors::ServiceErrorrescue 추가만 포함. -
bundle exec srb tc lib/cupix/aws/kinesis.rb lib/cupix/event_service.rb회귀 0. -
bundle exec rspec spec/lib/cupix/aws/kinesis_spec.rbpass (신규 example 포함). -
KinesisPutRecordsWorker관련 파일 (app/workers/kinesis_put_records_worker.rb) 은 변경되지 않음 (이관은 별도 트랙).
Tests#
- 기존 테스트:
spec/lib/cupix/aws/kinesis_spec.rb(기존 2 example) — 통과 유지. - 신규 테스트:
spec/lib/cupix/aws/kinesis_spec.rb에Aws::Kinesis::Client.new인자 검증 example 1개 추가.EventService는 기존 spec 이 없어 이번 PR 범위에서 신규 파일 도입은 하지 않음 (memory: "keep changes minimal").