ES /docs

UploadCpcLogWorker::perform | error on job 88615 - Function not found: arn:aws:lambda:eu-central-1:0

RCA: UploadCpcLogWorker - Function not found: cupix-json-collector-dc96

Error Log#

Datadog Logs

text
UploadCpcLogWorker::perform | error on job 88615 - Function not found: arn:aws:lambda:eu-central-1:002596530511:function:cupix-json-collector-dc96:$LATEST

Impact#

  • Service: cupixworks-worker
  • 발생 횟수: 46
  • 최초 발생: 2026-04-06T07:47:10.310Z
  • 최근 발생: 2026-04-07T06:41:47.385Z

Root Cause Summary#

EU 리전(eu-central-1)의 AWS Lambda 함수 cupix-json-collector-dc96가 존재하지 않거나 삭제되어, UploadCpcLogWorkercreate_capture_3d_reconstruction 종류의 job을 처리할 때 CPC JSON collector Lambda를 호출하면 Function not found 에러가 발생합니다. aws.yaml 설정에서 production-eu-central-1 환경의 cpc_json_collector_function_namecupix-json-collector-dc96으로 지정되어 있으나, 해당 Lambda 함수가 실제 AWS 계정의 eu-central-1 리전에 존재하지 않습니다. 이 에러는 EU 리전에서만 발생하며, 다른 리전(US, AU, CA 등)에서는 정상 동작합니다. 에러가 rescue StandardError로 잡혀서 Sidekiq retry 없이 무시되므로, 영향받는 capture의 CPC JSON 수집이 수행되지 않습니다.

Technical Analysis#

Code Path#

  • Entry point: app/workers/upload_cpc_log_worker.rb:5perform(id) 메서드
  • Job 조회 후 jobable_type == 'Capture'인 경우만 처리 (upload_cpc_log_worker.rb:7-9)
  • job.upload_cpc_part_log 호출 후 (upload_cpc_log_worker.rb:11), job의 kind가 create_capture_3d_reconstruction인 경우 Lambda 호출 진행 (upload_cpc_log_worker.rb:13-19)
  • Failure point: lib/cupix/aws/lambda.rb:43lambda_client.invoke() 호출 시 AWS SDK가 ResourceNotFoundException (Function not found) 발생
ruby
# app/workers/upload_cpc_log_worker.rb:5-25
def perform(id)
  Cupix::Logger.info("UploadCpcLogWorker::perform | begins on job #{id}")
  job = ::Job.find_by_id(id)
  return if job.nil?
  return if job.jobable_type != 'Capture'

  job.upload_cpc_part_log

  if job.kind == 'create_capture_3d_reconstruction'
    capture_id = job.jobable_id
    Cupix::Logger.info("UploadCpcLogWorker::perform | run cpc json collector on job #{id}, capture #{capture_id}")
    Cupix::Aws::Lambda.run_cpc_json_collector(
      model_name: 'captures',
      model_key: capture_id
    )
  end

  Cupix::Logger.info("UploadCpcLogWorker::perform | done on job #{id}")
rescue StandardError => e
  Cupix::Logger.error("UploadCpcLogWorker::perform | error on job #{id} - #{e.message}")
end

Lambda 호출 코드에서 $AWS[:lambda][:cpc_json_collector_function_name] 값을 function name으로 사용:

ruby
# lib/cupix/aws/lambda.rb:39-59
def run_cpc_json_collector(opts = {})
  raise Cupix::Errors::Argument.new(code: 'ARG10001', reason: 'model_name is blank') if opts[:model_name].blank?
  raise Cupix::Errors::Argument.new(code: 'ARG10001', reason: 'model_key is blank') if opts[:model_key].blank?

  resp = lambda_client.invoke(
    function_name: $AWS[:lambda][:cpc_json_collector_function_name],
    invocation_type: 'RequestResponse',
    payload: {
      bucket_name: $AWS[:s3][:cpc_results_bucket_name],
      service_name: Cupix::Tesla.service_name,
      model_name: opts[:model_name],
      model_key: opts[:model_key]
    }.to_json
  )

  resp
rescue => e
  raise e
else
  resp
end

Lambda client는 CUPIX_REGION 환경변수로 리전을 결정:

ruby
# app/models/concerns/aws_adapter/lambda.rb:8-10
def lambda_client
  Aws::Lambda::Client.new region: ENV['CUPIX_REGION'] || 'us-west-2'
end

config/aws.yaml에서 production-eu-central-1 환경은 cupix-json-collector-dc96을 function name으로 지정:

yaml
# config/aws.yaml:501-502
    lambda:
      cpc_json_collector_function_name: 'cupix-json-collector-dc96'

기대 동작: Lambda client가 eu-central-1 리전에서 cupix-json-collector-dc96 함수를 invoke하면 CPC JSON 데이터가 수집됨.

실제 동작: AWS SDK가 ResourceNotFoundException을 반환 — 해당 함수가 eu-central-1 리전에 존재하지 않음. 에러가 rescue StandardError로 잡혀 로그만 남기고 worker가 종료됨.

Log Evidence#

사용한 Datadog 쿼리:

text
service:cupixworks-worker status:error "UploadCpcLogWorker" "Function not found"
Time range: 2026-04-06T06:00:00Z to 2026-04-07T07:30:00Z

46건 모두 동일한 에러 패턴 — 모두 eu-central-1 리전의 cupix-json-collector-dc96 Lambda:

text
2026-04-06T07:47:10.310Z ERROR UploadCpcLogWorker::perform | error on job 88615 - Function not found: arn:aws:lambda:eu-central-1:002596530511:function:cupix-json-collector-dc96:$LATEST
2026-04-06T08:08:22.523Z ERROR UploadCpcLogWorker::perform | error on job 88607 - Function not found: arn:aws:lambda:eu-central-1:002596530511:function:cupix-json-collector-dc96:$LATEST
2026-04-06T12:33:20.142Z ERROR UploadCpcLogWorker::perform | error on job 88648 - Function not found: arn:aws:lambda:eu-central-1:002596530511:function:cupix-json-collector-dc96:$LATEST
2026-04-06T17:33:36.899Z ERROR UploadCpcLogWorker::perform | error on job 88672 - Function not found: arn:aws:lambda:eu-central-1:002596530511:function:cupix-json-collector-dc96:$LATEST
2026-04-07T00:36:34.128Z ERROR UploadCpcLogWorker::perform | error on job 88697 - Function not found: arn:aws:lambda:eu-central-1:002596530511:function:cupix-json-collector-dc96:$LATEST
2026-04-07T06:41:47.385Z ERROR UploadCpcLogWorker::perform | error on job 88702 - Function not found: arn:aws:lambda:eu-central-1:002596530511:function:cupix-json-collector-dc96:$LATEST

실패 job 중 하나(88702)의 전체 lifecycle — begins, Lambda 호출 시도, 에러 발생이 동일 초에 기록됨:

text
2026-04-07T06:41:47Z INFO  UploadCpcLogWorker::perform | begins on job 88702
2026-04-07T06:41:47Z INFO  UploadCpcLogWorker::perform | run cpc json collector on job 88702, capture 33175
2026-04-07T06:41:47Z ERROR UploadCpcLogWorker::perform | error on job 88702 - Function not found: arn:aws:lambda:eu-central-1:002596530511:function:cupix-json-collector-dc96:$LATEST

참고: 성공하는 job(다른 리전 또는 create_capture_3d_reconstruction이 아닌 kind)은 "done" 로그까지 정상 출력:

text
2026-04-07T07:29:39Z INFO  UploadCpcLogWorker::perform | begins on job 31962
2026-04-07T07:29:39Z INFO  UploadCpcLogWorker::perform | done on job 31962

Fix Recommendation#

즉시 조치 (Critical)#

  1. Lambda 함수 복원: AWS Console 또는 Terraform으로 eu-central-1 리전에 cupix-json-collector-dc96 Lambda 함수를 재배포합니다.

    • 인프라 코드: cupix-infrastructure/cupix-service/cpc-collector/main.tf
    • Lambda 소스: cupix-infrastructure/cupix-service/cpc-collector/code/cupix-json-collector.py
    • Terraform의 random_string.service_keydc96을 생성했으므로, 기존 Terraform state에서 해당 workspace를 확인하고 terraform apply를 실행해야 합니다.
  2. 영향받은 capture 재처리: Lambda가 복원된 후, 실패한 job들의 capture에 대해 CPC JSON 수집을 재실행해야 합니다. 영향받은 capture ID 목록을 Datadog 로그에서 추출할 수 있습니다 (예: capture 33175, 33185, 33186, 33098 등).

단기 개선 (1주 이내)#

  1. 에러 핸들링 개선 (app/workers/upload_cpc_log_worker.rb:23-24): 현재 rescue StandardError로 모든 에러를 잡아 로그만 남기므로, Lambda 호출 실패가 무시됩니다. ResourceNotFoundException과 같은 인프라 에러는 별도로 분류하여 알림을 보내거나, retry 대상에서 분리해야 합니다.

  2. Lambda 존재 여부 헬스체크: worker 시작 시 또는 주기적으로 설정된 Lambda 함수의 존재 여부를 확인하는 로직 추가를 고려합니다.

장기 개선 (재발 방지)#

  1. 인프라 배포 검증: 각 리전별 Terraform apply 후 Lambda 함수 존재 여부를 자동으로 검증하는 CI/CD 파이프라인 단계 추가.
  2. 리전별 인프라 일관성 모니터링: 모든 production 리전에서 필수 Lambda 함수들이 존재하는지 주기적으로 확인하는 모니터링 추가.

Monitoring#

  • Lambda 함수 호출 실패 알림 추가:
text
service:cupixworks-worker status:error "Function not found" "cupix-json-collector"
  • AWS CloudWatch에서 Lambda invoke 에러 메트릭 모니터링:
text
aws.lambda.errors{functionname:cupix-json-collector-dc96, region:eu-central-1}

Risk Assessment#

  • Risk level: medium
  • 예상 복잡도: standard — Lambda 함수 재배포로 즉시 해결 가능하나, 영향받은 capture의 CPC JSON 데이터가 누락된 상태이므로 재처리가 필요합니다. EU 리전의 create_capture_3d_reconstruction job만 영향을 받으며 (46건), 다른 리전은 정상입니다.