ES /docs

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, 도메인 조율 불필요 두 개만 반영:

  1. Cupix::Aws::Kinesis 클라이언트에 명시적 timeout / retry 파라미터 추가 — request path 에서 최악 15s block 이 재발하는 것을 방지.
  2. 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_timeoutretry_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::OpenTimeout wrap) 가 기존 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_client describe 블록에 새 example 추가 — Aws::Kinesis::Client.newhttp_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.rbHTTP_OPEN_TIMEOUT, retry_limit, http_open_timeout 추가만 포함.
  • git diff origin/develop -- lib/cupix/event_service.rbSeahorse::Client::NetworkingError / Aws::Kinesis::Errors::ServiceError rescue 추가만 포함.
  • bundle exec srb tc lib/cupix/aws/kinesis.rb lib/cupix/event_service.rb 회귀 0.
  • bundle exec rspec spec/lib/cupix/aws/kinesis_spec.rb pass (신규 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.rbAws::Kinesis::Client.new 인자 검증 example 1개 추가. EventService 는 기존 spec 이 없어 이번 PR 범위에서 신규 파일 도입은 하지 않음 (memory: "keep changes minimal").