AwsS3Manager::downloadParallel | begin - "Missing credentials in config, if using AWS_CONFIG_FILE, s
Validation: 152eee54-bc6b-42a8-b05c-06e27941df1b
Verdict: APPROVED#
Completeness#
| Plan Item | Status | Evidence |
|---|---|---|
pnpm-workspace.yaml: catalog에 5개 @aws-sdk/* 패키지 등록 |
PASS | pnpm-workspace.yaml diff: lines +15-19에 @aws-sdk/client-s3: ^3.705.0, @aws-sdk/lib-storage: ^3.705.0, @aws-sdk/client-sqs: ^3.705.0, @aws-sdk/client-ecs: ^3.705.0, @aws-sdk/client-auto-scaling: ^3.705.0 5개 항목 추가 확인 |
base/package.json: aws-sdk 제거, 4개 @aws-sdk/* catalog 참조 추가 |
PASS | base/package.json diff: -"aws-sdk": "2.1599.0" 제거, +"@aws-sdk/client-ecs": "catalog:", +"@aws-sdk/client-s3": "catalog:", +"@aws-sdk/client-sqs": "catalog:", +"@aws-sdk/lib-storage": "catalog:" 4개 추가 확인 |
base/src/manager/aws-s3.manager.ts: v2 -> v3 마이그레이션 |
PASS | diff: -import * as AWS from 'aws-sdk' 제거, +import { S3Client, type ObjectCannedACL } from '@aws-sdk/client-s3' 및 +import { Upload } from '@aws-sdk/lib-storage' 추가. AWS.S3 -> S3Client, s3.upload callback -> new Upload({client, params}).done(), _region 필드 추가, setCredentials에서 credentials 객체 구조 사용, forcePathStyle 변환 확인 |
base/src/manager/aws-ecs.manager.ts: v2 -> v3 마이그레이션 |
PASS | diff: -import AWS from 'aws-sdk' 제거, +import { ECSClient, StopTaskCommand, RunTaskCommand, ListTasksCommand, type DesiredStatus } from '@aws-sdk/client-ecs' 추가. AWS.ECS -> ECSClient, maxRetries -> maxAttempts, callback -> client.send(new XxxCommand(params)) 패턴으로 stopMyTask, runTask, getAllTasks 3개 메서드 전환 확인 |
base/src/manager/aws-queue.manager.ts: v2 -> v3 마이그레이션 |
PASS | diff: -import AWS from 'aws-sdk' 제거, +import { SQSClient, GetQueueUrlCommand, ReceiveMessageCommand, DeleteMessageCommand, GetQueueAttributesCommand, ChangeMessageVisibilityCommand, MessageSystemAttributeName } from '@aws-sdk/client-sqs' 추가. export type { Message } re-export 추가. 5개 메서드(setQueue, receiveMessage, deleteMessage, getQueueAttributes, changeMessageVisibility) callback -> Command 패턴 전환 확인 |
base/src/base-service.ts: AWS.SQS.Message -> Message (7곳) |
PASS | diff: +import type { Message } from './manager/aws-queue.manager' 추가. _messageList, _messageInProcess, getter 2곳, addMessagesToList, runByMessage, deleteByMessage 총 7곳에서 AWS.SQS.Message -> Message 전환 확인 |
cupix-tesla-compute-agent/package.json: aws-sdk 제거, 3개 v3 패키지 추가 |
PASS | diff: -"aws-sdk": "^2.1407.0" 제거, +"@aws-sdk/client-auto-scaling": "catalog:", +"@aws-sdk/client-ecs": "catalog:", +"@aws-sdk/client-sqs": "catalog:" 추가 확인 |
cupix-tesla-compute-agent/src/model/qmAws.ts: v2 -> v3 마이그레이션 (3개 클라이언트, 12개 메서드) |
PASS | diff: -import AWS from 'aws-sdk' 제거. SQSClient, ECSClient, AutoScalingClient 3개 클라이언트 import 추가. new AWS.SQS() -> new SQSClient({region}) 등 변환. setQueueURL, receiveMessage, deleteMessage, runTask, stopEcsTask, listContainerInstances, describeContainerInstances, startTask, describeAutoScalingGroups, updateAutoScalingGroup 등 메서드 Command 패턴 전환 확인. ! non-null assertion 사용(lines 136-137)은 v3 타입이 optional로 변경되어 필요한 처리 |
cupix-tesla-compute-agent/src/model/qmJob.ts: AWS import 제거, v3 타입 사용 |
PASS | diff: -import AWS from 'aws-sdk' 제거, +import type { Message } from '@aws-sdk/client-sqs', +import type { ContainerOverride, Task } from '@aws-sdk/client-ecs' 추가. queueMessage: AWS.SQS.Message -> Message, makeContainerOverride 반환타입 -> ContainerOverride, updateTaskIdToJob 파라미터 -> Task[] 확인 |
cupix-tesla-compute-agent/src/manager/job.manager.ts: AWS import 제거, v3 타입 사용 |
PASS | diff: -import AWS from 'aws-sdk' 제거, +import type { Message } from '@aws-sdk/client-sqs', +import type { Task } from '@aws-sdk/client-ecs' 추가. createJobFromMessages 파라미터 Message[], tasks 변수 Task[] 확인 |
cupix-tesla-forge-agent/package.json: @aws-sdk/client-sqs: "catalog:" 추가 |
PASS | diff: +"@aws-sdk/client-sqs": "catalog:" 한 줄 추가 확인 |
cupix-tesla-forge-agent/src/forge-service.ts: AWS.SQS.Message -> Message (8곳) |
PASS | diff: +import type { Message } from '@aws-sdk/client-sqs' 추가. _messageList, _messageInProcess, getter 2곳, as AWS.SQS.Message cast, addMessagesToList, runByMessage, deleteByMessage 총 8곳 전환 확인 |
cupix-tesla-potree-agent/package.json: @aws-sdk/client-sqs: "catalog:" 추가 |
PASS | diff: +"@aws-sdk/client-sqs": "catalog:" 한 줄 추가 확인 |
cupix-tesla-potree-agent/src/potree-service.ts: AWS.SQS.Message -> Message (7곳) |
PASS | diff: +import type { Message } from '@aws-sdk/client-sqs' 추가. _messageList, _messageInProcess, getter 2곳, addMessagesToList, runByMessage, deleteByMessage 총 7곳 전환 확인 |
cupix-pano-postprocessor/package.json: aws-sdk 제거, v3 catalog 참조 |
PASS | diff: -"aws-sdk": "2.1599.0" 제거, +"@aws-sdk/client-s3": "catalog:", +"@aws-sdk/lib-storage": "catalog:" 추가 확인 |
cupix-pano-postprocessor/src/manager/aws-s3.manager.ts: v2 -> v3 마이그레이션 |
PASS | diff: -import * as AWS from 'aws-sdk' 제거, +import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3', +import { Upload } from '@aws-sdk/lib-storage' 추가. download(): getObject().createReadStream() -> send(new GetObjectCommand(...))+response.Body as Readable. uploadDirectoryByCredential(): new AWS.S3({...}) -> new S3Client({region, credentials, endpoint, forcePathStyle}), s3.upload().promise() -> new Upload({client, params}).done() 확인 |
base/src/manager/aws-s3.manager.spec.ts: mock 패턴 v3로 변환 |
PASS | diff: -import * as AWS from 'aws-sdk' 제거, -vi.mock('aws-sdk') -> +vi.mock('@aws-sdk/client-s3') + +vi.mock('@aws-sdk/lib-storage'). mockUploadDone mock 사용. mockS3.upload 관련 assertion -> mockUploadDone assertion 변환 확인 |
base/src/manager/aws-ecs.manager.spec.ts: mock 패턴 v3로 변환 |
PASS | diff: -import AWS from 'aws-sdk' 제거, -vi.mock('aws-sdk') -> +vi.mock('@aws-sdk/client-ecs'). mockSend mock 사용. mockEcs.stopTask/runTask/listTasks callback mock -> mockSend.mockResolvedValue/mockRejectedValue 패턴 변환 확인 |
agents/package.json: pnpm.onlyBuiltDependencies에서 aws-sdk 제거 |
PASS | diff: -"aws-sdk" 한 줄 제거 확인 |
Acceptance Criteria#
| Criterion | Status | Evidence |
|---|---|---|
import.*aws-sdk가 전체 agents 소스에서 0건 (spec 포함) |
PASS | grep -r 'import.*aws-sdk' applications/agents/ --include='*.ts' 결과 0건 확인. diff에서 모든 파일의 import AWS from 'aws-sdk' 및 import * as AWS from 'aws-sdk' 제거 확인. pnpm-lock.yaml에서도 aws-sdk 참조 0건 |
@aws-sdk/client-s3, @aws-sdk/client-sqs, @aws-sdk/client-ecs, @aws-sdk/client-auto-scaling import가 해당 파일에 존재 |
PASS | grep 결과: aws-s3.manager.ts(base, pano-postprocessor) -> @aws-sdk/client-s3; aws-queue.manager.ts, forge-service.ts, potree-service.ts, qmAws.ts, qmJob.ts, job.manager.ts -> @aws-sdk/client-sqs; aws-ecs.manager.ts, qmAws.ts, qmJob.ts, job.manager.ts -> @aws-sdk/client-ecs; qmAws.ts -> @aws-sdk/client-auto-scaling 모두 확인 |
pnpm-workspace.yaml catalog에 @aws-sdk/* 5개 패키지 등록 |
PASS | pnpm-workspace.yaml diff: @aws-sdk/client-s3, @aws-sdk/lib-storage, @aws-sdk/client-sqs, @aws-sdk/client-ecs, @aws-sdk/client-auto-scaling 5개 모두 ^3.705.0으로 등록 확인 |
base, pano-postprocessor, tesla-compute-agent의 package.json에서 aws-sdk 제거 |
PASS | 3개 package.json diff 모두에서 "aws-sdk" 제거 확인. grep "aws-sdk" --include=package.json 결과 pnpm 관련 package.json에서 0건 (legacy package-lock.json에만 잔존하나 이는 pnpm 미사용 파일) |
forge-agent, potree-agent의 package.json에 @aws-sdk/client-sqs: "catalog:" 추가 |
PASS | cupix-tesla-forge-agent/package.json diff: +"@aws-sdk/client-sqs": "catalog:" 추가 확인. cupix-tesla-potree-agent/package.json diff: +"@aws-sdk/client-sqs": "catalog:" 추가 확인 |
pnpm exec eslint lint 통과 (changed files) |
UNVERIFIABLE | diff만으로는 검증 불가 -- 런타임 실행 필요. 단, diff의 코드 구조상 명백한 syntax 오류 없음 |
pnpm exec nx run base -t test 테스트 통과 |
UNVERIFIABLE | diff만으로는 검증 불가 -- 런타임 실행 필요. spec 파일들의 mock 패턴이 v3 Command 패턴에 맞게 변환됨 |
Issues Found#
No blocking issues found.
Observations#
base-service.spec.ts에서testRunByMessage(message: AWS.SQS.Message)->testRunByMessage(message: any)로 변경하고,testMessage변수에서 타입 annotation을 제거함. 소스 코드의base-service.ts에서는 정확한Message타입을 사용하므로 런타임에 문제 없으나, spec에서 타입 안전성이 약간 감소함. 차단 이슈는 아님.cupix-pano-postprocessor/src/manager/aws-s3.manager.ts의uploadDirectoryByCredential()에서region: 'us-east-1'이 하드코딩으로 추가됨. AWS SDK v3의S3Client는 region이 필수이므로 합리적인 추가이나, credential 객체에서 region을 동적으로 가져오는 것을 추후 고려할 수 있음.qmAws.tslines 136-137에서targetGroup.MaxSize!와targetGroup.DesiredCapacity!non-null assertion이 추가됨. AWS SDK v3 타입에서 이 필드들이 optional로 변경되었기 때문이며, 실제 API 응답에서는 항상 존재하므로 실용적 처리. 더 안전한 방법은 null check이나, 기존 로직과 동일 동작을 유지함.aws-ecs.manager.ts에서 v2의retryDelayOptions: {base: Constants.RetryInterval}이 v3로 마이그레이션 시 제거됨. v3의ECSClient는retryMode를 통해 재시도 전략을 설정하며,maxAttempts만 전달됨. 기본 backoff 전략이 v2와 다를 수 있으나, 대부분의 경우 v3 기본값이 적절함.aws-queue.manager.ts에서AttributeNames: ['ApproximateReceiveCount']->MessageSystemAttributeNames: [MessageSystemAttributeName.ApproximateReceiveCount]로 올바르게 변환됨. v3에서AttributeNames는 deprecated이므로 정확한 마이그레이션.package-lock.json에 여전히aws-sdk참조가 있으나, 이 프로젝트는 pnpm을 사용하므로(pnpm-workspace.yaml,pnpm-lock.yaml) 해당 파일은 사용되지 않는 legacy artifact임.