docker

22 개의 포스트

gitlab

Cursor와 GitLab으로 Java 현대화하기 (새 탭에서 열림)

Java 8에서 21로의 현대화는 단순한 버전 업그레이드가 아니라 빌드·런타임·의존성·API·동시성·테스트·컨테이너·운영 동작을 함께 다루는 복합 작업이다. 따라서 Cursor로 모든 변경을 한 번에 수행하기보다, 작은 문제를 단계적으로 해결하고 GitLab의 이슈 계층, CI/CD, 보안 검사, 코드 리뷰, 영향 분석으로 안전성을 검증해야 한다. 글은 실패한 테스트 수정에서 시작해 품질 게이트를 마련하고, 특정 HTTP 연결 경계를 Java 21 방식으로 현대화하는 흐름을 제시한다. ## Cursor와 GitLab의 역할 분담 - Cursor는 코드베이스 안에서 다음과 같은 집중 작업에 적합하다. - 실패한 테스트의 원인 추적 - 구현 코드와 테스트 분석 - 제한된 범위의 수정안 작성 - 로컬 테스트 실행 - 브랜치와 머지 리퀘스트 생성 - GitLab은 AI가 만든 변경을 소프트웨어 개발 생명주기 안에서 검증하는 역할을 한다. - Epic과 하위 이슈로 현대화 계획을 지속적이고 검토 가능하게 관리 - GitLab MCP 서버로 이슈, 논의, 파이프라인, 의존성 등 프로젝트 문맥을 Cursor에 제공 - CI/CD, 보안 스캔, 코드 리뷰, 코드 소유자 승인, 영향 분석 수행 - Duo Agent Platform의 Code Review Flow와 Developer Flow로 프로젝트별 품질 기준 적용 - AI 에이전트의 속도 자체가 안전성을 보장하지 않으므로, 모든 에이전트 생성 머지 리퀘스트도 일반 변경과 동일한 검증 절차를 거쳐야 한다. ## 예제 시스템과 현대화 범위 - 대상은 Tanuki IoT Platform의 Java HTTP metrics collector다. - 이 컴포넌트는 다음 작업을 수행한다. - 상태 점검 및 유지보수 HTTP 엔드포인트에 `GET` 요청 - 응답 상태와 응답 시간 등의 메트릭 기록 - Rust 기반 metrics-store 백엔드에 `POST /api/metrics` 요청 - 백엔드의 HTTP 응답을 확인 - Java 애플리케이션과 Rust 백엔드 사이의 실제 HTTP 계약이 존재하므로, Java 런타임 현대화가 운영 경계에 미치는 영향을 테스트할 수 있다. - 환경에는 Java 8과 Java 21, Maven, Docker, Docker Compose, GitLab MCP 서버가 필요하다. - 저장소의 `AGENTS.md`에는 프로젝트 구조와 Maven 테스트 명령이 있어 Cursor가 로컬 개발 규칙을 따르는 데 활용된다. ## 실패한 엔드투엔드 테스트 수정 - 문제는 엔드포인트의 기대 HTTP 상태 코드 처리에서 발생한다. - 사용자는 특정 상태 코드를 기대하도록 설정할 수 있다. - 구현은 모든 `2xx` 응답만 성공으로 간주한다. - 따라서 `503`을 정상적인 기대값으로 설정해도 테스트가 실패한다. - 엔드투엔드 테스트는 이미 문제를 드러내고 있었지만 CI/CD 작업이 `allow_failure` 상태여서 실패가 지속적인 경고음으로만 남아 있었다. - Cursor에는 관찰 가능한 문제를 직접 설명하고 다음 순서로 작업하도록 요청한다. - 먼저 분석 작성 - 구현과 실패 테스트 추적 - 수정 적용 - 테스트 재실행 - Cursor는 엔드포인트 설정에서 `HttpCollector`와 실패한 엔드투엔드 테스트까지 경로를 추적해 불일치의 원인을 찾는다. - 집중 테스트와 전체 Maven 테스트가 통과한 뒤 브랜치와 머지 리퀘스트를 만든다. - 테스트가 결정적이고 안정적으로 통과하면, 기존에 실패를 허용하던 엔드투엔드 작업을 필수 검증 단계로 전환할 수 있다. ## 머지 리퀘스트 기반 검증 - 머지 리퀘스트 생성 후 자동으로 다음 검증이 실행된다. - 빌드 - 단위 및 통합 테스트 - 엔드투엔드 테스트 - 보안 스캔 - GitLab Duo Code Review는 프로젝트의 Java 전용 리뷰 지침에 따라 변경을 검토한다. - 리뷰에서 구체적인 문제가 발견되면 Developer Flow를 통해 수정한 뒤 병합한다. - 머지 리퀘스트는 단순한 결과물 제출 수단이 아니라 다음을 수행하는 협업·의사결정 공간이다. - 변경 의도 설명 - 테스트 및 파이프라인 결과 확인 - 리뷰 의견 처리 - 에이전트가 만든 코드의 품질 증거 축적 - 이 단계에서 실제 버그를 런타임 마이그레이션과 섞지 않고 먼저 수정함으로써, 이후 현대화 작업의 행동 기준선과 회귀 방지 테스트를 확보한다. ## Java 8에서 Java 21로 넘어가기 위한 품질 게이트 - Java 21 현대화는 앞선 테스트 버그 수정과 달리 훨씬 넓은 범위를 가진다. - 기존 Java modernization epic에는 다음과 같은 계획 문맥이 포함되어 있다. - 하위 작업 항목 - 팀 논의 - 조사 결과와 관련 머지 리퀘스트 - 과거 파이프라인 기록 - 의존성 정보 - 보안 취약점 및 관련 발견 사항 - 이러한 정보를 Cursor에 제공하면 단순히 소스 코드를 바꾸는 것이 아니라 프로젝트의 개발 이력과 운영 제약을 반영한 변경 계획을 세울 수 있다. - 글의 접근 방식은 전체 마이그레이션을 한 번에 수행하지 않고, 먼저 품질 게이트를 마련한 뒤 영향 범위가 명확한 경계부터 현대화하는 것이다. ## 실용적인 적용 순서 - 먼저 하나의 실패한 테스트나 제한된 버그를 선택한다. - Cursor로 원인 분석, 수정, 테스트 실행을 수행한다. - 변경을 작은 머지 리퀘스트로 제출하고 CI/CD와 자동 리뷰를 통과시킨다. - 그다음 Epic과 이슈, MCP를 통해 Java 21 마이그레이션의 전체 문맥을 연결한다. - 모든 테스트, 보안 검사, 코드 소유자 승인, 영향 분석 결과를 품질 게이트로 사용한다. - 마지막으로 HTTP 연결 처리처럼 하나의 경계를 골라 현대화하고, Java 애플리케이션과 Rust 백엔드 사이의 실제 계약이 유지되는지 검증하는 것이 안전하다.

aws

전체 수명 주기 제어로 격리된 샌드박스 실행하기: AWS Lambda, MicroVM 도입 | Amazon Web Services (새 탭에서 열림)

AWS Lambda MicroVMs는 사용자나 AI가 생성한 신뢰할 수 없는 코드를 사용자별로 격리된 실행 환경에서 실행하도록 설계된 서버리스 컴퓨팅 기능이다. Firecracker 기반의 VM 수준 격리, 스냅샷을 활용한 빠른 시작·재개, 메모리와 디스크 상태를 유지하는 실행 세션을 제공하면서도 인프라를 직접 운영할 필요가 없다. 특히 AI 코딩 도구, 온라인 개발 환경, 데이터 분석, 취약점 스캐너처럼 사용자별 장기 실행 환경이 필요한 서비스의 기존 격리·성능 trade-off를 줄이는 것이 핵심이다. ## 사용자별 격리 실행 환경이 필요한 이유 - AI 코딩 어시스턴트, 대화형 코드 실행 환경, 데이터 분석 플랫폼, 취약점 스캐너, 사용자 스크립트를 실행하는 게임 서버 등이 주요 대상이다. - 기존 방식에는 각각 한계가 있다. - **가상 머신**: 강력한 격리를 제공하지만 시작에 수분이 걸릴 수 있다. - **컨테이너**: 빠르게 시작되지만 공유 커널 때문에 신뢰할 수 없는 코드를 안전하게 격리하려면 추가적인 보안 강화가 필요하다. - **서버리스 함수**: 이벤트 기반 요청-응답 처리에 적합하지만, 사용자 상호작용 사이에 상태를 유지하는 장기 세션에는 적합하지 않다. - 직접 가상화 인프라를 구축하면 낮은 지연 시간과 강한 격리를 모두 확보할 수 있지만, 상당한 운영·보안 전문성이 필요하다. ## Firecracker 기반 VM 수준 격리 - 각 사용자 또는 세션은 독립된 MicroVM을 할당받는다. - MicroVM 간 커널과 리소스를 공유하지 않으므로 한 사용자가 실행한 신뢰할 수 없는 코드가 다른 사용자 환경이나 호스트 시스템에 접근하는 것을 막는다. - AWS Lambda에서 대규모로 사용되어 온 Firecracker 기술을 기반으로 하므로, 자체 가상화 시스템을 구축하는 대신 AWS의 운영 성숙도를 활용할 수 있다. ## MicroVM Image 생성 과정 - 애플리케이션 코드와 Dockerfile을 ZIP 파일로 패키징해 Amazon S3에 업로드한다. - `public.ecr.aws/lambda/microvms:al2023-minimal` 기반 이미지에서 Python, pip 등을 설치하고 애플리케이션을 구성할 수 있다. - 예시 애플리케이션은 Gunicorn으로 실행되는 Flask API이며, `0.0.0.0:5000` 포트에서 요청을 처리한다. - 다음과 같은 CLI 명령으로 이미지를 생성한다. ```bash aws lambda-microvms create-microvm-image \ --code-artifact uri=<path/to/s3/artifact.zip> \ --name <VM_image_name> \ --base-image-arn arn:aws:lambda:us-east-1:aws:microvm-image:al2023-1 \ --build-role-arn <IAM role ARN> ``` - Lambda는 ZIP 파일을 가져와 Dockerfile을 빌드하고 애플리케이션을 초기화한다. - 초기화가 끝난 실행 중인 디스크와 메모리 상태를 Firecracker 스냅샷으로 저장한다. - 빌드 로그는 다음 CloudWatch Logs 경로에서 확인할 수 있다. ```text /aws/lambda/microvms/<image-name> ``` ## 스냅샷 기반 빠른 시작과 재개 - MicroVM은 일반적인 콜드 부팅 대신 사전에 초기화된 스냅샷에서 시작한다. - 애플리케이션 프로세스, 설치된 패키지, 메모리 상태 등이 준비된 상태이므로 실행 직후부터 요청을 처리할 수 있다. - 이후 생성되는 MicroVM도 동일한 이미지 스냅샷에서 복원되므로 초기화 시간을 줄일 수 있다. - 대규모 대화형 세션도 사용자 입장에서 즉시 반응하는 수준의 시작·재개 성능을 목표로 한다. ## 상태를 유지하는 세션과 유휴 정책 - 실행 중인 MicroVM은 다음 상태를 세션 동안 유지한다. - 메모리 상태 - 디스크 상태 - 실행 중인 프로세스 - 일정 시간 요청이 없으면 MicroVM을 일시 중지할 수 있다. - 중지 시 메모리와 디스크 상태를 보존하고, 요청이 다시 들어오면 해당 상태에서 자동으로 재개한다. - 예시 설정은 15분 유휴 후 중지하고, 5분 동안 중지 상태를 유지한 뒤 요청이 오면 자동 재개하도록 구성한다. ```bash aws lambda-microvms run-microvm \ --image-identifier arn:aws:lambda:<region>:<acct>:microvm-image:my-image \ --execution-role-arn arn:aws:iam::<acct>:role/MicroVMExecutionRole \ --idle-policy '{"maxIdleDurationSeconds":900,"suspendedDurationSeconds":300,"autoResumeEnabled":true}' ``` ## 엔드포인트와 요청 인증 - MicroVM을 실행하면 Lambda가 고유 ID와 전용 엔드포인트 URL을 제공한다. - 별도의 네트워킹 구성을 하지 않아도 애플리케이션에 접근할 수 있다. - CLI로 단기 인증 토큰을 생성한 뒤 HTTPS 요청의 `X-aws-proxy-auth` 헤더에 포함해 요청을 보낸다. - MicroVM이 중지된 뒤 다시 요청해도 애플리케이션 상태가 유지된 채 복원되므로 클라이언트는 중지·재개 과정을 직접 처리할 필요가 없다. ## 실용적인 활용과 추천 Lambda MicroVMs는 단순한 단발성 함수보다 사용자별로 지속되는 안전한 실행 환경이 필요한 서비스에 적합하다. 사용자 코드 실행, AI 에이전트의 도구 호출, 온라인 IDE, 샌드박스형 분석 환경을 구축한다면 컨테이너 직접 격리나 VM 운영을 대체할 수 있는 후보로 검토할 만하다. 다만 실제 도입 전에는 IAM 실행 역할, 인증 토큰 관리, 유휴·재개 정책, 상태 보존 범위와 비용을 서비스의 세션 패턴에 맞게 검증하는 것이 좋다.

gitlab

GitLab Duo Agent Platform으로 배포 프로세스 자동화 (새 탭에서 열림)

GitLab Duo Agent Platform의 커스텀 에이전트를 활용하면 새로운 마이크로서비스를 기존 GitOps 배포 흐름에 자동으로 편입할 수 있다. 에이전트는 애플리케이션의 저장소 구조와 매니페스트, 파이프라인, Dockerfile을 분석해 필요한 설정을 생성하고 수정한다. 에이전트와 생성 결과가 GitLab 안에서 버전 관리·권한 통제되므로 자동화 속도와 엔터프라이즈 거버넌스를 함께 확보할 수 있다는 것이 글의 결론이다. ## TanukiBank의 마이크로서비스 온보딩 사례 - 가상의 은행 애플리케이션인 TanukiBank에 `intra-account-transfers` 마이크로서비스를 추가하는 상황을 예로 든다. - 기존 애플리케이션에는 계좌 간 송금 UI가 있지만 이를 처리할 백엔드 서비스가 없어 Transfer 버튼이 동작하지 않는다. - 새 서비스는 기존 GitOps 배포 규칙에 맞게 다음 요소를 모두 구성해야 한다. - Kubernetes 배포 매니페스트 - 컨테이너 이미지 빌드 및 전달 파이프라인 - 이미지 자동 업데이트 설정 - 네임스페이스, 포트, 호스트명 참조 ## TanukiBank의 GitOps 배포 구조 - GitLab 그룹에는 각 마이크로서비스를 담는 `services` 하위 그룹이 있다. - 배포 과정은 두 프로젝트와 Flux 컴포넌트가 연계되는 구조다. - **Tanuki Bank - Delivery**: 환경별 배포 매니페스트와 전달 파이프라인 관리 - **Flux Config**: Flux 관련 매니페스트 관리 - **Flux Image Automation Controller**: 서비스 레지스트리의 새 이미지를 감지하고 Delivery 프로젝트의 매니페스트 갱신 - **Flux CD Controller**: Delivery 프로젝트의 상태를 Kubernetes 클러스터의 실행 상태와 동기화 - 새 서비스가 추가되면 서비스 저장소, Delivery 프로젝트, Flux 설정을 모두 정확히 수정해야 한다. - 수동 작업에서는 특정 파일이나 참조를 빠뜨릴 경우 배포 실패가 발생할 수 있다. ## GitLab Duo를 이용한 시스템 프롬프트 생성 - GitLab Agentic Chat에 TanukiBank 그룹과 하위 그룹의 구조 및 파일을 분석하도록 요청한다. - Duo는 다음 자료를 조사해 커스텀 에이전트용 시스템 프롬프트를 작성한다. - Kubernetes 매니페스트 - 설정 파일 - Dockerfile - 프로젝트 간 의존성 - 기존 GitOps 규칙 - 생성된 프롬프트에는 다음과 같은 내용이 포함된다. - 에이전트가 따라야 할 작업 규칙 - 결과 보고 방식 - 사용할 도구 - 이 프롬프트는 현재 애플리케이션의 GitOps 구조를 반영한 것이므로, 향후 배포 방식이 바뀌면 다시 생성해야 한다. ## 커스텀 에이전트 생성 및 적용 - `application-agents`라는 별도 프로젝트를 만들어 에이전트를 관리한다. - GitLab의 **AI > Agents > Managed** 메뉴에서 `TanukiBank Microservice Onboarder` 에이전트를 생성한다. - 에이전트 생성 시 다음을 설정한다. - 이름과 설명 - 공개 여부 - Duo가 추천한 도구 - 앞서 생성한 시스템 프롬프트 - 이후 에이전트를 GitOps를 담당하는 다음 프로젝트에서 사용할 수 있도록 활성화한다. - `Tanuki Bank - Delivery` - `Flux Config` - 각 프로젝트의 Agentic Chat 에이전트 목록에 해당 에이전트가 표시되면 설정이 완료된 것이다. ## Developer 플로우로 새 서비스 구현 - `services` 그룹에 `intra-account-transfers` 프로젝트를 만든다. - 프로젝트 이슈에 마이크로서비스 요구사항을 작성하고 **Generate MR with Duo**를 실행한다. - Developer foundational flow가 다음 작업을 자동으로 수행한다. - 이슈의 사양 분석 - 서비스 코드 구현 - 브랜치 생성 - Merge Request 생성 - 이슈와 MR 연결 - 로컬에서 `curl` 명령으로 동작을 확인한 뒤 MR을 병합한다. - 파이프라인이 실행되어 새 서비스의 컨테이너 이미지를 서비스 프로젝트의 내장 레지스트리에 업로드한다. ## 커스텀 에이전트를 통한 GitOps 온보딩 - 서비스 자체는 생성됐지만 GitOps 설정에는 아직 등록되지 않은 상태다. - Delivery 프로젝트의 `manifests/dev`에 서비스 매니페스트가 없음 - 전달 파이프라인에 서비스 참조가 없음 - Flux Config의 `image-update-automation.yaml`에 이미지 자동화 항목이 없음 - 새 서비스 프로젝트에서도 `TanukiBank Microservice Onboarder`를 활성화한다. - Delivery 프로젝트의 Agentic Chat에서 커스텀 에이전트를 선택한다. - 서비스 이름과 호스트명을 전달해 온보딩을 요청한다. - 에이전트는 새 서비스의 Dockerfile을 읽어 포트를 확인하고, 이에 맞는 매니페스트와 파이프라인 설정을 생성·수정한다. - 제공된 글은 이 작업이 진행되는 지점에서 끝나므로, 이후 생성된 변경 사항과 실제 Kubernetes 배포 결과는 본문에 포함되어 있지 않다. 새 마이크로서비스 온보딩 절차가 반복적이고 규칙 기반이라면, 프로젝트 구조와 GitOps 규칙을 반영한 커스텀 에이전트를 만들어 자동화하는 것이 효과적이다. 다만 시스템 프롬프트가 현재 배포 구조에 강하게 의존하므로, GitOps workflow 변경 시 프롬프트와 에이전트 동작을 함께 재검토해야 한다.

gitlab

대규모 환경에서 CI/CD 관측성을 구축하는 방법 (새 탭에서 열림)

GitLab 셀프 매니지드 환경에서 CI/CD 가시성을 확보하는 것은 대규모 데브옵스 플랫폼의 성능 최적화와 안정적인 운영을 위한 필수 과제입니다. 이 글은 Prometheus와 Grafana, 그리고 전용 익스포터를 활용하여 원시 파이프라인 데이터를 실시간 대시보드로 변환하고 의사결정에 필요한 핵심 통찰을 얻는 기술적 방법론을 제시합니다. 이를 통해 기업은 인프라 투자 효율성을 높이고 병목 현상을 체계적으로 해결할 수 있는 데이터 기반의 관리 체계를 구축할 수 있습니다. ### 실시간 통찰을 위한 다층적 대시보드 구성 효과적인 CI/CD 옵저버빌리티를 위해 다음과 같은 네 가지 핵심 대시보드를 구성하여 운영 가시성을 확보합니다. * **파이프라인 개요 대시보드:** 전체 실행 횟수, 시간 흐름에 따른 성공/실패율, 평균 소요 시간 추이를 시각화합니다. 상태별 색상 코딩을 통해 플랫폼 팀이 성능 저하를 즉각적으로 감지할 수 있도록 합니다. * **작업(Job) 성능 대시보드:** 개별 작업의 실행 시간 분포(히스토그램)와 가장 느린 상위 10개 작업을 분석합니다. 프로젝트 및 스테이지별 실패 히트맵을 통해 최적화가 필요한 병목 지점을 특정합니다. * **러너 및 인프라 대시보드:** Node Exporter의 호스트 지표(CPU, 메모리, 디스크)와 파이프라인 대기 시간을 결합하여 분석합니다. 인프라 포화도와 작업 지연의 상관관계를 파악하여 러너 스케일링이나 인스턴스 업그레이드 등의 용량 계획 수립에 활용합니다. * **배포 빈도 대시보드:** 환경별 배포 횟수와 소요 시간을 추적하여 DORA 지표를 관리합니다. 엔지니어링 리더십은 이를 통해 릴리스 속도와 메인 브랜치 대비 커밋 지연 상태(Environment Drift)를 점검할 수 있습니다. ### 옵저버빌리티 구현을 위한 핵심 기술 스택 GitLab의 원시 데이터를 수집하고 시각화하기 위해 두 가지 주요 익스포터와 컨테이너 기반 인프라를 사용합니다. * **GitLab CI Pipelines Exporter:** GitLab API를 통해 파이프라인 소요 시간, 작업 상태, 배포 정보 등 CI/CD 관련 핵심 메트릭을 수집합니다. * **Node Exporter:** 러너가 실행되는 호스트의 하드웨어 및 OS 지표를 수집하여 인프라 수준의 통찰을 제공합니다. * **Grafana 파일 기반 프로비저닝:** 모든 대시보드를 코드로 관리하고 자동으로 배포하여 여러 환경에서 일관된 모니터링 환경을 유지합니다. 프로젝트나 브랜치별 필터링을 위한 변수 설정이 가능합니다. ### 엔터프라이즈급 Kubernetes 배포 아키텍처 대규모 환경에서는 확장성과 보안을 위해 Kubernetes 클러스터에 각 컴포넌트를 분리된 Deployment로 배포하는 것이 권장됩니다. * **네임스페이스 및 보안 관리:** `gitlab-observability`와 같은 전용 네임스페이스를 생성하고, GitLab API 접근을 위한 Personal Access Token(`read_api` 권한)을 Kubernetes Secret으로 안전하게 관리합니다. * **익스포터 배포:** `gitlab-ci-pipelines-exporter`를 Deployment로 구성하고, ConfigMap을 통해 수집 대상 프로젝트 및 설정을 주입합니다. * **데몬셋 활용:** `Node Exporter`는 DaemonSet으로 배포하여 클러스터 내 모든 노드의 메트릭을 빠짐없이 수집합니다. * **Prometheus 통합:** 수집된 모든 메트릭은 Prometheus로 집계되며, 이를 Grafana의 데이터 소스로 연결하여 시각화 체계를 완성합니다. 대규모 CI/CD 환경을 운영하는 조직이라면 단순한 로그 확인을 넘어, 이와 같은 통합 옵저버빌리티 스택을 구축할 것을 권장합니다. 특히 인프라 비용 최적화와 개발 생산성 향상을 목표로 한다면, DORA 메트릭과 인프라 지표를 연계한 분석이 병목 현상 해결의 결정적인 열쇠가 될 것입니다. 중간 규모 이하의 환경이나 PoC 단계에서는 Docker Compose를 통해 빠르게 프로토타입을 구축해본 후 Kubernetes로 확장하는 전략이 효과적입니다.

netflix

넷플릭스의 카메라 파일 처리 규모 확장 (새 탭에서 열림)

넷플릭스는 전 세계에서 생성되는 방대한 양의 카메라 원본 푸티지를 효율적으로 처리하기 위해 '미디어 프로덕션 스위트(MPS)'를 구축하고, 이를 업계 표준 솔루션인 FilmLight API(FLAPI)와 통합했습니다. 자체 엔진을 처음부터 개발하는 대신 검증된 외부 기술을 클라우드 기반의 서버리스 환경에 내재화함으로써, 복잡한 메타데이터 관리와 고해상도 이미지 프로세싱의 일관성을 확보했습니다. 이를 통해 제작 현장의 수동 작업을 자동화하고 기술적 오류를 최소화하여 창작자들이 오로지 작품의 퀄리티에만 집중할 수 있는 확장성 있는 제작 생태계를 마련했습니다. ### 미디어 프로덕션 스위트(MPS)의 도입 배경 * **제작 복잡도 해소**: 글로벌 제작 규모가 커짐에 따라 파일 관리 업무(File Wrangling)가 창의적인 의사결정 시간을 잠식하고, 지역 및 업체별로 미디어 처리 방식이 일관되지 않는 문제가 발생했습니다. * **휴먼 에러 방지**: 수동으로 진행되는 미디어 관리 프로세스는 실수가 발생하기 쉽고 감사(Audit)가 어려워, 이를 자동화하고 표준화할 필요성이 커졌습니다. * **효율성 극대화**: 반복적인 워크플로우를 공통 플랫폼으로 통합하여 프로덕션부터 포스트 프로덕션까지의 미디어 이동을 간소화하고자 했습니다. ### 핵심 엔진으로서의 FilmLight API(FLAPI) 통합 * **신뢰성 있는 컬러 사이언스**: 업계에서 널리 사용되는 Baselight 및 Daylight의 엔진을 API 형태로 활용하여, 다양한 카메라 포맷에 대한 검증된 디베이어링(Debayering)과 컬러 처리를 보장받았습니다. * **최신 포맷 대응**: 매번 출시되는 새로운 카메라와 녹화 포맷에 대응하기 위해 자체 엔진을 유지보수하는 대신, 전문 파트너사인 FilmLight의 기술력을 활용해 유연성을 확보했습니다. * **인프라 호환성**: FLAPI를 도커(Docker) 이미지로 패키징하여 넷플릭스의 클라우드 인프라와 전 세계 프로덕션 컴퓨팅 센터에 동일하게 배포함으로써 작업의 일관성을 유지합니다. ### 메타데이터 파싱 및 워크플로우 검사 * **데이터 정규화**: 푸티지 입고 시 FLAPI를 통해 카메라 메타데이터를 추출하고, 이를 넷플릭스의 표준 스키마로 변환하여 하위 프로세스에서 검색 및 재사용이 가능하도록 만듭니다. * **자동화된 검증**: 타임코드 및 릴(Reel) 이름을 기반으로 푸티지를 매칭하고, 처리 과정에서 발생할 수 있는 오류를 추적하거나 파이프라인 전체의 유효성을 검사하는 데 활용합니다. ### VFX 플레이트 생성 및 결과물 자동화 * **정밀한 이미지 처리**: ASC FDL(Framing Decision Lists)을 활용한 크롭 및 디스퀴즈(De-squeeze), AMF(ACES Metadata Files)를 통한 일관된 컬러 파이프라인 적용으로 정확한 VFX 소스를 생성합니다. * **워크플로우 일관성**: 제작 현장의 데일리 작업부터 최종 완성 단계까지 동일한 컬러 변환이 적용되도록 보장하며, 이를 통해 VFX 업체 등 협업 파트너에게 정확한 OpenEXR 파일을 제공합니다. * **사전 검증**: 워크플로우 전문가가 워크스테이션에서 내린 결정사항을 클라우드 파이프라인에 그대로 적용하여 실제 촬영 시작 전 프로세스를 완벽히 검증할 수 있습니다. ### 클라우드 네이티브 미디어 팩토리 아키텍처 * **서버리스 및 컨테이너화**: 고성능 GPU 워크스테이션에 의존하는 전통적인 방식에서 벗어나, 리눅스 도커 이미지 기반의 서버리스 함수로 작업을 분산 처리합니다. * **CPU 기반 확장성**: 특정 고사양 하드웨어 대신 범용 CPU 인스턴스에서 작동하도록 최적화하여, 클라우드의 유연한 컴퓨팅 자원을 활용한 대규모 병렬 처리를 실현했습니다. * **상태 없는(Stateless) 운영**: 각 작업 단위가 독립적이고 상태를 유지하지 않도록 설계하여, 오류 발생 시 즉각적으로 재실행할 수 있는 높은 운영 신뢰성을 확보했습니다. 넷플릭스의 사례는 모든 기술을 내재화하기보다 업계 표준 솔루션을 클라우드 네이티브 환경에 전략적으로 통합함으로써 얻을 수 있는 확장성의 이점을 잘 보여줍니다. 대규모 미디어 처리가 필요한 기업이라면 단일 장비의 성능 향상보다는 작업을 원자화(Atomicity)하고 API 기반의 클라우드 병렬 처리 구조를 구축하는 것이 비용 효율성과 안정성 측면에서 유리합니다.

cloudflare

에이전트형 클라우드 구축: Agents Week 2026에서 출시한 모든 것 (새 탭에서 열림)

Cloudflare는 인공지능 에이전트가 주요 워크로드로 자리 잡는 미래를 위해 기존의 클라우드 구조를 재정의한 'Cloud 2.0(에이전트 클라우드)' 비전을 제시했습니다. 수천만 개의 에이전트 세션이 동시에 실행될 수 있도록 연산 인프라부터 보안, 도구 모음까지 스택 전반에 걸친 대대적인 신규 기능들을 공개했습니다. 이를 통해 개발자들은 단순한 프로토타입을 넘어 확장성과 보안을 갖춘 에이전트 기반 애플리케이션을 생산 환경에서 구현할 수 있게 되었습니다. **에이전트 전용 연산 환경 및 워크플로우** * **Git 호환 저장소 'Artifacts':** 에이전트가 생성한 코드와 데이터를 관리하기 위해 수천만 개의 레포지토리를 생성할 수 있고, 표준 Git 클라이언트와 연동되는 버전 관리 저장소를 제공합니다. * **격리된 실행 환경 'Sandboxes' (GA):** 에이전트에게 셸, 파일 시스템, 백그라운드 프로세스를 갖춘 독립된 컴퓨터 환경을 제공하며, 작업 중단 지점부터 즉시 재개할 수 있는 영속성을 보장합니다. * **상태 저장 및 확장성:** 'Durable Object Facets'를 통해 에이전트가 생성한 앱마다 독립된 SQLite 데이터베이스를 할당하며, 개선된 워크플로우 엔진으로 최대 50,000개의 동시 실행을 지원합니다. **에이전트를 위한 보안 및 ID 관리** * **Cloudflare Mesh:** 에이전트가 프라이빗 네트워크 내의 데이터베이스나 API에 안전하게 접근할 수 있도록 제로 트러스트 기반의 비공개 네트워크 연결을 지원합니다. * **Managed OAuth:** 에이전트가 보안상 취약한 서비스 계정 대신, 사용자를 대행해 내부 애플리케이션에 안전하게 인증하고 탐색할 수 있는 체계를 구축했습니다. * **비인간 식별자(Non-human Identity) 보호:** 에이전트용 API 토큰의 권한 범위를 세밀하게 제어하고 자동 취소 기능을 도입하여 자격 증명 유출에 따른 리스크를 최소화했습니다. **에이전트의 사고와 소통을 돕는 툴박스** * **다중 채널 소통 지원:** 실시간 음성 상호작용(STT/TTS) 기능을 약 30줄의 코드로 구현할 수 있게 되었으며, 이메일을 직접 송수신하고 처리할 수 있는 'Cloudflare Email Service' 베타를 출시했습니다. * **추론 성능 및 효율 최적화:** LLM의 품질 저하 없이 모델 크기를 22% 압축하는 'Unweight' 기술을 도입하여 더 빠르고 경제적인 추론 인프라를 구축했습니다. * **통합 추론 및 기억:** 14개 이상의 모델 공급자를 연결하는 통합 추론 레이어와 함께, 에이전트가 과거의 맥락을 기억하고 지속적으로 학습할 수 있는 'Agent Memory' 서비스를 제공합니다. 이번 발표는 에이전트가 단순히 텍스트를 생성하는 도구를 넘어, 독립적인 실행 환경과 보안 권한을 가지고 업무를 수행하는 '실행 주체'로 거듭나도록 돕는 데 초점이 맞춰져 있습니다. 대규모 에이전트 시스템을 구축하려는 팀이라면 Cloudflare가 제공하는 Sandboxes와 Mesh 기반의 보안 아키텍처를 활용하여 인프라 구축 비용과 보안 리스크를 획기적으로 낮출 수 있을 것입니다.

github

깃허브, AI 기반 탐지 기능으로 애플리케이션 보안 범위 확장 (새 탭에서 열림)

GitHub는 AI 기반 보안 탐지를 도입해 CodeQL만으로는 충분히 다루기 어려운 언어와 프레임워크까지 애플리케이션 보안 범위를 확장한다. 이 기능은 풀 리퀘스트에서 취약점을 탐지하고 Copilot Autofix로 수정안까지 제안해, 코드 병합 전에 위험을 발견·해결하는 것을 목표로 한다. 공개 프리뷰는 2026년 2분기 초에 제공될 예정이다. ## CodeQL과 AI 탐지를 결합한 보안 검사 - CodeQL은 지원 언어에 대해 깊은 의미 분석을 제공하는 기존 정적 분석 엔진이다. - 현대 저장소에는 Shell/Bash 스크립트, Dockerfile, Terraform(HCL), PHP 등 다양한 생태계의 코드가 함께 포함된다. - GitHub는 CodeQL과 AI 기반 탐지를 결합한 하이브리드 모델로 이러한 영역까지 보안 검사 범위를 넓힌다. - AI 탐지는 전통적인 정적 분석으로 지원하기 어려운 코드에서 잠재적 취약점과 수정 제안을 찾아낸다. - 내부 테스트에서 30일 동안 17만 건 이상의 결과를 처리했으며, 개발자 긍정 피드백 비율은 80%를 넘었다. - 이 기능은 보안·코드 품질·코드 리뷰를 지원하는 GitHub의 에이전트형 탐지 플랫폼을 기반으로 한다. ## 풀 리퀘스트에서 취약점 조기 발견 - 풀 리퀘스트가 생성되면 GitHub Code Security가 변경 사항에 적합한 방식을 자동으로 선택해 분석한다. - 지원 언어에는 CodeQL 정적 분석을 사용한다. - 추가 생태계에는 AI 기반 보안 탐지를 적용한다. - 결과는 기존 코드 스캐닝 결과와 함께 풀 리퀘스트 안에 표시된다. - 탐지 대상에는 다음과 같은 문제가 포함된다. - 안전하지 않은 문자열 결합 방식의 SQL 쿼리나 명령어 - 취약한 암호화 알고리즘 - 민감한 리소스를 노출하는 인프라 구성 - 개발자는 별도 보안 도구로 이동하지 않고 코드 리뷰 과정에서 위험을 확인할 수 있다. ## Copilot Autofix를 통한 수정 자동화 - 취약점을 찾는 것뿐 아니라 빠르고 안전하게 수정하는 것도 보안 운영의 핵심이다. - Copilot Autofix는 탐지 결과를 바탕으로 개발자가 검토·테스트·적용할 수 있는 수정안을 제안한다. - 2025년 Autofix는 46만 건 이상의 보안 경고 해결에 사용됐다. - Autofix를 사용한 경우 평균 해결 시간은 0.66시간으로, 사용하지 않은 경우의 1.29시간보다 짧았다. - 탐지와 자동 수정 제안을 연결해 취약점 발견부터 해결까지의 시간을 줄인다. ## 병합 시점의 보안 정책 적용 - GitHub는 코드가 검토되고 승인되는 병합 지점에서 보안 결과를 통제할 수 있도록 한다. - 보안 탐지, 수정 제안, 정책 집행을 풀 리퀘스트에 통합하면 배포 이후가 아니라 병합 전에 위험을 차단할 수 있다. - 팀은 개발자가 기존 워크플로를 벗어나지 않으면서 보안 기준을 적용할 수 있다. - 장기적으로는 정적 분석의 정확성과 AI의 맥락 이해를 결합한 더 발전된 탐지 체계로 확장될 예정이다. 실무에서는 CodeQL이 지원하는 핵심 언어뿐 아니라 Shell, Docker, Terraform, PHP 등을 사용하는 저장소에도 해당 기능을 검토할 만하다. 다만 AI가 제안한 수정안은 반드시 개발자가 코드 의도와 테스트 결과를 확인한 뒤 병합하는 것이 좋다.

aws

AWS 클라우드와 함께한 20년 – 시간이 정말 빠르네요! | Amazon Web Services (새 탭에서 열림)

AWS는 지난 20년 동안 240개 이상의 클라우드 서비스를 구축하며 기술 혁신의 표준을 제시해 왔습니다. 단순한 인프라 제공을 넘어 딥러닝, 생성형 AI, 그리고 에이전트형 AI로 이어지는 기술 트렌드를 고객 중심의 관점에서 선도하고 있습니다. 특히 지난 10년은 컨테이너, 서버리스, 커스텀 실리콘, 그리고 AI 민주화를 통해 개발자와 기업이 이전에는 불가능했던 가치를 창출할 수 있도록 생태계를 확장해 온 과정이었습니다. ### 기술 트렌드에 대응하는 AWS의 혁신 철학 * 2006년 Amazon S3 출시 이후 AWS는 API 경제를 개척하며 개인 연구자와 기업 모두가 대규모 프로젝트를 수행할 수 있는 강력한 도구를 제공하기 시작했습니다. * AWS의 혁신은 단순히 화려한 유행을 쫓는 것이 아니라, 고객의 실제 목소리에 귀를 기울이고 가장 시급한 과제를 해결하는 '고객 중심'의 원칙을 따릅니다. * 기술 환경은 딥러닝의 등장에서 시작해 거대언어모델(LLM) 기반의 생성형 AI를 거쳐, 현재는 스스로 작업을 수행하는 에이전트형 AI(Agentic AI)로 빠르게 진화하고 있습니다. ### 클라우드 인프라와 데이터 아키텍처의 고도화 * **컨테이너 및 서버리스:** Amazon ECS와 EKS를 통해 대규모 컨테이너 관리를 단순화했으며, Fargate를 도입해 인프라 관리 부담 없이 서버리스 환경에서 컨테이너를 배포할 수 있게 했습니다. * **고성능 데이터베이스:** Amazon Aurora는 고가용성 관계형 DB의 표준을 세웠으며, 최근에는 0으로 스케일링이 가능한 Serverless v2와 초고속 분산 SQL 데이터베이스인 Aurora DSQL로 진화했습니다. * **하이브리드 클라우드:** AWS Outposts를 통해 저지연 데이터 처리가 필요한 온프레미스 환경에서도 AWS와 동일한 인프라 및 서비스를 사용할 수 있는 일관된 경험을 제공합니다. ### 커스텀 실리콘을 통한 성능 및 비용 최적화 * **AWS Graviton:** Arm 기반의 자체 프로세서를 개발하여 클라우드 워크로드에서 최고의 가격 대비 성능을 실현했으며, 현재 9만 명 이상의 고객이 이를 활용해 비용을 절감하고 있습니다. * **AI 전용 칩셋:** 추론용 Inferentia와 학습용 Trainium 칩을 통해 생성형 AI 애플리케이션 운영에 필요한 최적의 토큰 경제성을 제공하며, Anthropic과 같은 주요 AI 기업들의 워크로드를 지원합니다. ### AI 민주화와 에이전트 기술의 미래 * **Amazon Bedrock:** 다양한 업계 선도 모델을 안전하게 활용할 수 있는 플랫폼을 제공하며, 최근에는 'AgentCore'를 통해 복잡한 워크플로우를 자동화하는 에이전트 구축 기능을 강화했습니다. * **Amazon Nova 및 Titan:** 자체 모델인 Titan 시리즈에 이어 프론티어급 성능의 Nova 모델을 출시했으며, 특히 브라우저 UI 작업을 자동화하는 Nova Act 등 실질적인 업무 자동화 도구를 선보였습니다. * **차세대 AI 코딩:** Amazon Q Developer에서 한 단계 진화한 Kiro(에이전트형 AI 개발 도구)는 독립적인 개발 작업을 수행하는 자율 에이전트 기능을 통해 프로토타입부터 프로덕션까지의 개발 과정을 혁신하고 있습니다. AWS의 지난 20년은 기술이 소수의 전유물이 아닌 모두의 도구가 되는 과정이었습니다. 이제 기업들은 단순한 클라우드 전환을 넘어, SageMaker와 Bedrock 같은 플랫폼을 활용해 비즈니스 핵심에 AI를 내재화하고 에이전트 기술을 도입하여 운영 효율성을 극대화하는 'AI 퍼스트' 전략으로 나아가야 합니다.

kakao

학생에서 개발자로: 로또 구현부터 레거시 개선까지, 서버의 흐름을 배우다 (새 탭에서 열림)

서버 개발은 복잡해 보이지만, 설계 이유를 질문하고 검증하는 과정을 거치면 막연함을 줄일 수 있다는 것이 글의 핵심 주장입니다. 카카오의 기술 온보딩은 TDD·객체지향 구현, 레거시 인수 테스트, 리팩터링을 단계적으로 수행하며 유지보수 가능한 구조와 안전한 변경 능력을 길렀습니다. 결국 좋은 개발자는 코드를 작성하는 데 그치지 않고, 설계·테스트·협업·AI 활용의 기준을 스스로 세우는 사람이라는 결론입니다. ## 기술 온보딩의 목표와 구성 - 온보딩은 총 3단계로 진행되었습니다. 1. TDD와 OOP 기반 기능 구현 2. 레거시 코드에 대한 인수 테스트 작성 3. 테스트로 보호된 레거시 코드 리팩터링 - 정답을 전달하기보다 다음과 같은 질문을 반복하며 설계의 근거를 고민하게 했습니다. - 왜 이렇게 설계했는가? - 이 책임은 정말 해당 객체가 가져야 하는가? - 이 테스트는 무엇을 보호하는가? - 목표는 유지보수 가능한 구조 설계, 레거시 분석 및 안전한 개선, 협업과 AI를 포함한 책임 있는 개발 역량을 기르는 것이었습니다. - 서버뿐 아니라 FE, Android, iOS 직군도 참여했으며, 기술 스택과 관계없이 좋은 엔지니어링의 기준은 공유될 수 있다는 점을 강조했습니다. ## 질문과 협업으로 서버 개발의 막연함 줄이기 - 트래픽, 동시성, 확장성, 데이터베이스 설계처럼 추상적으로 느껴지는 주제를 실제 구현과 리뷰를 통해 구체화했습니다. - 매일 데일리 미팅에서 트러블슈팅을 공유하고, 페어 프로그래밍으로 설계를 논의하며, PR 리뷰에서 구현 이유를 설명했습니다. - 이를 통해 개발은 개인의 코딩 능력만으로 완성되는 일이 아니라는 점을 체감했습니다. - 코드의 동작 여부보다 스스로 설계를 설명하고 변경의 영향을 예측하는 능력을 중요하게 다뤘습니다. ## 로또 게임 구현: TDD와 객체지향 설계 - 첫 번째 미션은 로또 가격, 자동·수동 발급, 당첨 통계를 구현하는 과제였습니다. - 다음과 같은 제약 조건이 설계 개선을 유도했습니다. - 들여쓰기 깊이 1단계 유지 - 메서드 10라인 이하 - 원시값 포장과 일급 컬렉션 사용 - `else` 사용을 줄이고 Early Return 활용 - TDD 방식으로 테스트를 먼저 작성해 요구사항과 설계를 점검했습니다. ### 랜덤 로직의 테스트 가능성 확보 - 랜덤 번호 생성은 실행마다 결과가 달라 테스트가 어려웠습니다. - 이를 해결하기 위해: - 번호 생성 전략을 인터페이스로 추상화하고 - 생성 전략을 외부에서 주입받으며 - 테스트 전용 Generator를 별도로 구현했습니다. - 그 결과 테스트에서 생성 값을 통제할 수 있었고, 구현체에 대한 결합도도 낮아졌습니다. - TDD는 단순히 테스트를 추가하는 방식이 아니라, 테스트 가능한 구조를 설계하게 만드는 도구로 작용했습니다. ### 값 객체와 캐싱에 대한 고민 - 같은 값을 가진 객체를 매번 새로 생성할지, 재사용할지 고민하며 객체의 정체성과 값의 동일성을 구분했습니다. - 1부터 45까지의 로또 번호처럼 값의 범위가 제한된 경우 캐싱 전략을 검토할 수 있었습니다. - 이 미션을 통해 기능 구현보다 객체의 책임, 생성 방식, 재사용 가능성 등 설계 기준을 고민하게 되었습니다. ## 인수 테스트: 레거시를 안전하게 이해하기 - 두 번째 미션에서는 실제 서비스 수준의 레거시 코드를 바로 수정하지 않고, 먼저 인수 테스트를 작성했습니다. - 테스트가 보호해야 할 대상은 다음과 같았습니다. - 사용자의 행동 - 시스템의 반환 결과 - 외부에서 관찰 가능한 상태 변화 - 단순히 성공 여부만 확인하는 것이 아니라, 결과가 정확한지 검증하는 Strong Assertion 전략을 적용했습니다. - Cucumber 기반 BDD를 사용해 비개발자도 이해할 수 있는 시나리오 형태로 테스트를 구성했습니다. - 테스트를 개발자만의 코드가 아니라 팀 전체가 공유하는 실행 가능한 명세로 바라보았습니다. ### 운영 환경과 테스트 환경 맞추기 - “내 컴퓨터에서는 동작한다”는 문제를 줄이기 위해 Production Parity를 적용했습니다. - 구체적으로: - H2 대신 운영과 같은 PostgreSQL 사용 - Docker 기반으로 실행 환경 통일 - Gradle Task를 이용한 테스트 자동화 - 환경 차이로 인한 테스트 결과의 불일치를 줄이고, 누구나 동일한 조건에서 테스트를 실행할 수 있게 했습니다. ### 테스트 데이터 격리 - 테스트 간 데이터 의존성을 제거하기 위해 다음 전략을 사용했습니다. - 외래 키 관계를 고려한 역순 삭제 - `TRUNCATE ... CASCADE` - 공통 Cleanup 유틸리티 작성 - 모든 테스트가 초기화된 동일한 상태에서 시작하도록 보장해 테스트의 재현성과 안정성을 높였습니다. - 중요한 것은 특정 도구를 사용하는 것보다 상황에 맞는 데이터 격리 방법을 선택하는 판단 기준이라고 설명합니다. ## 레거시 리팩터링: 구조와 동작의 분리 - 세 번째 미션의 핵심은 레거시 코드를 단순히 “클린 코드”로 바꾸는 것이 아니라, 안전한 변경의 기준을 세우는 것이었습니다. - 가장 중요한 원칙은 구조 변경과 동작 변경을 분리하는 것입니다. - 구조를 개선할 때는 기존 동작을 유지 - 동작을 변경할 때는 구조 개선과 섞지 않기 - 이렇게 변경 목적을 분리하면 코드 리뷰와 테스트를 통해 변경 범위를 명확히 검증할 수 있습니다. - 의도하지 않은 동작 변화가 발생하면 리뷰에서 이를 찾아내고, 변경을 통제하는 능력을 기를 수 있었습니다. ## AI와 협업할 때의 검증 범위 - 리팩터링 과정에서 AI를 활용해 넓은 범위의 코드 개선을 빠르게 시도했습니다. - 그러나 AI에게 한 번에 큰 범위의 변경을 요청하면 수정량이 커져 검증이 어려워지는 문제가 발생했습니다. - 따라서 AI의 제안을 그대로 수용하기보다 변경 범위를 작게 나누고, 각 변경을 테스트와 리뷰로 확인하는 방식이 필요하다는 교훈을 얻었습니다. - AI는 개발자를 대신하는 도구가 아니라, 개발자가 책임 있게 검토하고 통제해야 하는 협업 도구로 다뤄졌습니다. 실무에서는 기능 구현 전에 책임과 설계 이유를 설명할 수 있는지 확인하고, 레거시 코드는 먼저 외부 동작을 보호하는 테스트를 마련하는 것이 좋습니다. 이후 구조 변경과 동작 변경을 분리해 작은 단위로 개선하며, AI를 사용할 때도 변경 범위를 제한하고 반드시 테스트와 리뷰로 검증하는 접근이 안전합니다.

gitlab

Docker 보안 강화 이미지를 활용한 GitLab 컨테이너 가상 레지스트리 (새 탭에서 열림)

GitLab의 Container Virtual Registry는 분산된 여러 외부 레지스트리를 하나의 엔드포인트로 통합하여 관리 효율성과 보안을 동시에 해결하는 풀스루 캐시(pull-through cache) 솔루션입니다. 개발자는 개별 레지스트리의 인증 정보를 직접 관리할 필요 없이 단일 URL을 통해 이미지를 불러올 수 있으며, 첫 호출 시 캐싱된 이미지를 사용하여 빌드 속도를 획기적으로 개선합니다. 특히 보안이 강화된 Docker Hardened Images(DHI)를 도입할 때 발생하는 운영상의 복잡성을 제거하고 전사적인 보안 표준 준수를 용이하게 합니다. **멀티 레지스트리 환경의 운영 한계** * 플랫폼 팀은 일반적으로 Docker Hub, dhi.io(보안 이미지), MCR(.NET), Quay 등 3~5개의 레지스트리를 동시에 관리하며, 각기 다른 인증 방식과 네트워크 지연 문제를 겪습니다. * CI/CD 설정 내에 레지스트리별 로직이 파편화되어 자격 증명 관리가 복잡해지며, 동일한 이미지를 반복해서 외부망으로부터 다운로드하느라 빌드 시간이 늘어납니다. * 보안 강화를 위해 Docker Hardened Images와 같은 새로운 레지스트리를 도입하려 해도, 모든 팀의 파이프라인 설정을 변경해야 하는 운영적 마찰이 발생합니다. **가상 레지스트리의 작동 메커니즘** * 사용자가 GitLab의 가상 레지스트리 URL로 이미지를 요청하면 시스템은 우선 내부 캐시를 확인하고, 없을 경우 설정된 업스트림 레지스트리들을 순차적으로 검색합니다. * 업스트림에서 찾은 이미지는 자동으로 캐싱되며, 이후의 요청은 외부망을 거치지 않고 GitLab 인프라 내에서 즉시 제공됩니다. * 업스트림 레지스트리별로 우선순위를 지정할 수 있으며, 캐시 유효 기간(기본 24시간)을 설정하여 이미지의 최신성을 유지할 수 있습니다. **보안 이미지(DHI) 도입 가속화** * Docker Hardened Images는 CVE가 거의 없고 SBOM을 제공하는 등 보안상 우수하지만, 별도의 인증이 필요하여 전사 도입이 까다롭습니다. * 가상 레지스트리를 사용하면 관리자가 한 번만 dhi.io 자격 증명을 설정하면 되므로, 개발 팀은 개별 인증 없이 보안 이미지를 손쉽게 사용할 수 있습니다. * 가상 레지스트리의 캐시 기록을 통해 팀들이 실제로 어떤 이미지를 사용하고 있는지 모니터링할 수 있어, 일반 이미지에서 보안 이미지로의 전환 현황을 파악하는 감사 도구로 활용 가능합니다. **시스템 구성 및 설정 프로세스** * **레지스트리 생성**: Python 클라이언트 등을 이용해 특정 그룹 내에 가상 레지스트리를 생성하고 고유 ID를 할당받습니다. * **업스트림 등록**: Docker Hub(`registry-1.docker.io`), Microsoft MCR, Quay.io 등을 업스트림으로 등록하며, 각 업스트림별로 캐시 유지 시간을 개별 설정합니다. * **인증 통합**: dhi.io와 같이 유료나 보안이 필요한 레지스트리는 사용자 이름과 액세스 토큰을 가상 레지스트리 레벨에서 중앙 집중식으로 설정합니다. * **단일 엔드포인트 활용**: 모든 파이프라인에서 각기 다른 도메인 대신 `gitlab.com/virtual_registries/container/<ID>/<image>` 형태의 단일 주소를 사용하도록 통일합니다. 보안과 성능이라는 두 마리 토끼를 잡아야 하는 플랫폼 엔지니어에게 GitLab 가상 레지스트리는 필수적인 도구입니다. Docker Hardened Images를 최상위 업스트림으로 설정하여 가상 레지스트리를 구성하면, 개발자에게 추가적인 학습이나 설정의 부담을 주지 않으면서도 조직 전체의 컨테이너 보안 공급망을 자연스럽게 강화할 수 있습니다.

github

내부 살펴보기: GitHub (새 탭에서 열림)

GitHub Agentic Workflows는 에이전트를 기존 CI/CD에 통합하되, 에이전트의 비결정성과 프롬프트 인젝션 위험을 전제로 설계된 보안 아키텍처를 사용합니다. 핵심은 자유로운 에이전트 작성과 통제된 실행을 분리하고, 워크플로를 명시적인 권한·출력·네트워크·감사 제약이 있는 GitHub Actions로 컴파일하는 것입니다. 특히 에이전트에 비밀을 직접 제공하지 않고, 계층적 격리와 단계적 쓰기 검증으로 피해 범위를 제한합니다. ## 에이전트 자동화가 만드는 새로운 위협 - 에이전트는 저장소 상태와 외부 입력을 해석해 런타임에 자율적으로 결정을 내리므로 기본적으로 신뢰할 수 없습니다. - GitHub Actions는 구성 요소들이 하나의 신뢰 도메인에서 실행되는 비교적 개방적인 환경입니다. - 에이전트가 손상되면 다음과 같은 행동이 가능해질 수 있습니다. - MCP 서버와 상호작용 - 인증 토큰과 환경 변수 접근 - 임의의 인터넷 호스트로 네트워크 요청 - 악성 이슈·웹 페이지를 통한 프롬프트 인젝션 실행 - 원치 않는 커밋, 댓글, 이슈 생성 - 따라서 기본 보안 모드는 에이전트가 읽거나 쓰면 안 되는 상태에 접근하고, 허가되지 않은 통신 채널을 악용한다고 가정합니다. ## 다층 방어 구조 GitHub Agentic Workflows는 **기반 인프라(substrate)**, **구성(configuration)**, **계획(planning)**의 세 계층으로 방어합니다. - **기반 인프라 계층** - GitHub Actions 러너 VM과 신뢰된 컨테이너를 사용합니다. - 컨테이너 격리, 커널 수준 통신 경계, 권한 있는 작업과 시스템 호출 중재를 제공합니다. - 사용자 수준 구성 요소가 손상되어 컨테이너 내부에서 임의 코드를 실행하더라도 격리 경계를 넘는 피해를 제한합니다. - **구성 계층** - 어떤 구성 요소를 실행하고 서로 어떻게 연결할지 선언적으로 정의합니다. - 허용되는 통신 채널과 각 구성 요소의 권한을 결정합니다. - 에이전트 API 키와 GitHub 토큰 같은 외부 자격 증명을 어떤 컨테이너에 주입할지 통제합니다. - 컴파일러, 방화벽 정책, MCP 설정 등이 이 계층에 포함됩니다. - **계획 계층** - 구성 계층이 정한 구성 요소들을 언제, 어떤 순서로 실행할지 결정합니다. - 구성 요소 간 데이터 교환을 명시한 단계적 워크플로를 생성합니다. - 안전한 출력 시스템을 통해 쓰기 작업을 검증하고 제한하는 역할을 담당합니다. ## 에이전트에 비밀을 제공하지 않는 설계 - 일반적인 GitHub Actions 환경에서는 여러 프로세스가 환경 변수와 설정 파일에 저장된 토큰을 볼 수 있습니다. - 프롬프트 인젝션을 받은 에이전트는 셸 도구를 이용해 다음 정보에 접근할 수 있습니다. - 설정 파일 - SSH 키 - Linux `/proc` 상태 - 워크플로 로그 - 탈취한 자격 증명은 외부 웹사이트로 전송하거나 공개 이슈·풀 리퀘스트·댓글에 삽입할 수 있습니다. - 이를 막기 위해 에이전트를 별도 컨테이너에서 실행하고 네트워크 경로를 제한합니다. - 인터넷 접속은 방화벽을 통해 통제 - MCP 호출은 신뢰된 MCP 게이트웨이를 통해서만 허용 - LLM 호출은 API 프록시를 통해 중계 - MCP 게이트웨이는 별도의 신뢰 컨테이너에서 MCP 서버를 실행하며, MCP 인증 정보에 독점적으로 접근합니다. - 에이전트 컨테이너는 LLM 인증 토큰을 직접 보지 않고, 격리된 API 프록시가 인증을 대신 처리하는 구조를 사용합니다. ## 네트워크와 권한의 제한 - 에이전트와 방화벽 사이에 전용 사설 네트워크를 구성해 인터넷 연결을 통제합니다. - 허용 목록 기반 방화벽 정책으로 에이전트가 통신할 수 있는 대상과 채널을 제한합니다. - MCP 서버와 LLM API를 직접 노출하지 않고 각각 게이트웨이와 프록시 뒤에 배치합니다. - 이 구조는 에이전트가 손상되더라도 임의의 외부 호스트로 데이터를 반출하거나 인증 서비스를 직접 악용하는 가능성을 줄입니다. ## 안전한 쓰기와 감사 가능성 - 에이전트가 저장소나 GitHub 객체에 직접 자유롭게 쓰지 못하도록 출력 단계를 별도로 통제합니다. - 계획 계층의 안전한 출력 시스템은 다음을 담당하도록 설계됩니다. - GitHub 쓰기 작업의 허용 여부 결정 - 호출 가능한 기능과 호출 횟수 제한 - 출력에서 비밀 정보 제거 - 부적절하거나 원치 않는 내용 조정 - 에이전트의 실행 결과와 외부 효과를 추적할 수 있도록 모든 작업을 기록하는 원칙을 적용합니다. - 결과적으로 에이전트의 자유로운 추론 능력은 유지하되, 실제 커밋·댓글·이슈 생성 같은 효과는 검증된 단계와 명시적 정책을 거쳐야 합니다. ## 실용적인 결론 에이전트 기반 CI/CD를 도입할 때는 에이전트를 일반 스크립트처럼 신뢰하지 말고, 처음부터 침해 가능성을 전제로 설계해야 합니다. 별도 컨테이너 격리, 비밀의 프록시 위임, 허용 목록 네트워크, 단계적 쓰기 검증, 전체 감사 로그를 함께 적용하는 것이 안전한 기본값입니다.

netflix

넷플릭스의 마운트 메 (새 탭에서 열림)

넷플릭스는 컨테이너 런타임을 현대화하는 과정에서 수백 개의 컨테이너가 동시에 부팅될 때 시스템이 멈추거나 헬스 체크가 실패하는 심각한 병목 현상에 직면했습니다. 조사 결과, 이는 컨테이너 보안을 위해 도입된 사용자 네임스페이스(User Namespace)의 `idmap` 마운트 작업이 리눅스 커널의 VFS(가상 파일 시스템) 전역 잠금 장치에서 경합을 일으키기 때문으로 밝혀졌습니다. 특히 이러한 현상은 구형 다중 소켓(NUMA) 하드웨어 아키텍처에서 더욱 두드러지게 나타났으며, 최신 단일 소켓 인스턴스로 전환함으로써 스케일링 성능을 크게 개선할 수 있었습니다. **컨테이너 보안 강화와 마운트 폭증의 관계** - 넷플릭스는 보안 강화를 위해 각 컨테이너에 고유한 사용자 범위를 할당하는 새로운 런타임(Kubelet + Containerd)으로 전환했습니다. - 파일 소유권을 실제로 변경하는 비용을 줄이기 위해 커널의 `idmap` 마운트 기능을 사용하는데, 이는 각 레이어마다 `open_tree`, `mount_setattr`, `move_mount` 등의 호출을 발생시킵니다. - 50개의 레이어를 가진 컨테이너 100개를 동시에 실행할 경우, 이론적으로 약 20,000번 이상의 마운트 관련 작업이 수행되며 이는 커널의 마운트 테이블 전역 락(Global Lock)에 엄청난 부하를 줍니다. **커널 및 하드웨어 수준의 병목 현상 진단** - 시스템 분석 결과, CPU는 커널의 `path_init()` 함수 내 시퀀스 락(Sequence Lock)을 기다리는 스핀 루프(Spin Loop)에서 대부분의 시간을 소비하며 'Pause' 명령어를 반복 실행했습니다. - TMA(Topdown Microarchitecture Analysis) 분석에 따르면 파이프라인 슬롯의 95.5%가 경합된 액세스로 인해 중단되었으며, 57%는 가짜 공유(False Sharing)로 인해 발생했습니다. - 여러 코어가 동일한 캐시 라인에 접근하려고 시도하면서 캐시 라인 바운싱(Cache Line Bouncing) 현상이 발생하여 시스템 성능이 급격히 저하되었습니다. **인스턴스 아키텍처에 따른 성능 차이** - 테스트 결과, 5세대 인텔 듀얼 소켓 인스턴스인 `r5.metal`은 100개 이상의 컨테이너가 동시에 실행될 때 성능이 급격히 저하되며 실패하는 모습을 보였습니다. - 반면, 단일 소켓 및 단일 NUMA 도메인을 사용하는 7세대 인스턴스(`m7i.metal-24xl`, `m7a.24xlarge`)는 높은 동시성 환경에서도 훨씬 낮은 지연 시간과 높은 성공률을 유지했습니다. - 이는 NUMA 아키텍처의 프로세서 간 상호 연결(Interconnect) 대기 시간이 전역 락 경합 상황에서 병목 현상을 수배로 증폭시키기 때문입니다. 대규모 컨테이너 환경을 운영한다면 컨테이너 이미지의 레이어 수를 최소화하여 마운트 발생 횟수를 줄여야 합니다. 또한, 컨테이너 생성 및 삭제가 빈번한 워크로드의 경우 다중 소켓 기반의 구형 인스턴스보다는 메모리 접근 대기 시간이 짧고 락 경합에 유리한 최신 단일 소켓 혹은 단일 NUMA 노드 아키텍처를 선택하는 것이 성능 안정성에 유리합니다.

gitlab

클로드와 함께하는 GitLab Duo Agent 플랫폼이 개발을 가속화합니다 (새 탭에서 열림)

GitLab Duo Agent Platform은 Anthropic의 Claude와 같은 외부 AI 모델을 GitLab 워크플로우에 직접 통합하여 소프트웨어 개발 전 과정을 자동화합니다. 기존 AI 도구들이 개발 워크플로우와 분리되어 발생했던 맥락 단절 문제를 해결하고, 프로젝트의 요구사항을 깊이 이해하여 코드 생성부터 파이프라인 구축까지 복잡한 다단계 작업을 자율적으로 수행합니다. 이를 통해 팀은 개발 속도를 획기적으로 높이는 동시에 코드의 일관성과 보안을 유지할 수 있는 강력한 협업 환경을 구축하게 됩니다. ### 아이디어에서 코드로의 전환 (From Idea to Code) * 프로젝트 이슈에 기재된 사양과 설명을 기반으로 외부 에이전트가 애플리케이션 개발 전체 프로세스를 주도합니다. * 에이전트는 프로젝트의 맥락을 분석하여 풀스택 Java 웹 애플리케이션, 비즈니스 로직, UI 컴포넌트를 생성하고 리뷰 준비가 완료된 병합 요청(Merge Request)을 자동으로 생성합니다. * 백엔드 Java 클래스, 프론트엔드 HTML/CSS/JS, 빌드 구성 파일이 포함된 결과물을 제공하며, 개발자는 자연어 대화를 통해 이를 즉시 테스트하고 반복적으로 개선할 수 있습니다. ### 자동화된 지능형 코드 리뷰 (Code Review) * 병합 요청 단계에서 에이전트를 호출하여 코드의 강점, 취약점, 우선순위별 개선 사항을 포함한 종합적인 분석 보고서를 제공받을 수 있습니다. * 보안 평가, 테스트 노트, 코드 메트릭 및 승인 상태 권장 사항을 포함하여 시니어 개발자가 아키텍처 결정과 같은 고차원적인 작업에 집중할 수 있도록 돕습니다. * 일관된 리뷰 기준을 적용함으로써 운영 환경에 배포되기 전 잠재적인 오류를 선제적으로 차단합니다. ### CI/CD 파이프라인 및 컨테이너화 자동화 (Pipeline Creation) * 배포 자동화가 설정되지 않은 환경에서 에이전트에게 요청하여 완전한 형태의 CI/CD 파이프라인 구성을 생성할 수 있습니다. * 프로젝트의 Java 버전에 최적화된 Dockerfile을 생성하고, GitLab 컨테이너 레지스트리에 이미지를 빌드 및 배포하는 단계를 자동으로 구성합니다. * 수동 설정 없이도 빌드, 이미지 생성, 레지스트리 푸시 단계가 포함된 파이프라인이 즉시 가동되어 배포 효율성을 극대화합니다. GitLab Duo Agent Platform은 AI를 단순한 보조 도구가 아닌, 조직의 표준을 준수하고 자율적으로 업무를 완수하는 '신뢰할 수 있는 협업자'로 격상시킵니다. 반복적인 수동 작업을 줄이고 개발 사이클 전반의 지능형 자동화를 구현하고자 하는 팀에게 이 플랫폼은 생산성 혁신을 위한 핵심적인 솔루션이 될 것입니다.

gitlab

GitLab 메트릭스 및 레지스트리 기능이 CI/CD 병목 현상을 줄이는 데 도움을 줍니다. (새 탭에서 열림)

GitLab이 새롭게 선보이는 CI/CD 작업 성능 메트릭과 컨테이너 가상 레지스트리 기능은 개발 및 운영 팀이 직면한 인프라 복잡성과 파이프라인 병목 현상을 직접 해결하는 데 중점을 둡니다. 별도의 타사 도구 없이도 GitLab 내부에서 작업별 성능 데이터를 분석하고 여러 외부 소스의 컨테이너 이미지를 통합 관리 및 캐싱함으로써, 전체적인 개발 워크플로우의 속도와 안정성을 동시에 개선할 수 있습니다. ## CI/CD 작업 성능 메트릭을 통한 병목 지점 시각화 그동안 파이프라인의 성능 저하나 실패 원인을 파악하기 위해 별도의 대시보드를 구축하거나 로그를 수동으로 분석해야 했던 번거로움이 해결되었습니다. * **성능 지표 제공**: 각 작업(Job)별로 중앙값(P50) 및 최악의 케이스(P95) 실행 시간을 제공하여, 평상시 속도와 비정상적으로 느려진 시점을 명확히 구분할 수 있습니다. * **실패율 추적**: 특정 작업의 실패 빈도를 파악하여 불안정한(flaky) 작업을 식별하고 파이프라인의 신뢰도를 높일 수 있습니다. * **통합 분석 대시보드**: 프로젝트 수준의 CI/CD 분석 페이지에서 지난 30일간의 데이터를 기반으로 작업 이름, 단계(Stage)별 정렬 및 검색이 가능합니다. * **기술적 요구사항**: GitLab Premium 및 Ultimate 티어에서 사용 가능하며, 셀프 호스팅 환경의 경우 ClickHouse가 구성되어 있어야 합니다. 향후 빌드, 테스트, 배포 단계별 그룹화 기능이 추가될 예정입니다. ## 컨테이너 가상 레지스트리를 활용한 이미지 관리 최적화 Docker Hub, Harbor, Quay 등 여러 레지스트리에 흩어져 있는 이미지를 개별적으로 관리하며 발생하는 인증 및 대역폭 비용 문제를 단일 엔드포인트를 통해 해결합니다. * **단일 엔드포인트 통합**: 여러 업스트림 레지스트리를 하나의 GitLab 가상 레지스트리 주소로 통합하여, 파이프라인 설정에서 번거로운 개별 인증 과정을 줄일 수 있습니다. * **풀스루 캐싱(Pull-through Caching)**: 첫 번째 호출 이후 이미지를 GitLab 내부에 캐싱하여 외부 네트워크 대역폭 비용을 절감하고 이미지 풀 속도를 향상합니다. * **지원 범위**: 현재 Docker Hub, Harbor, Quay 등 장기 토큰 인증을 사용하는 레지스트리를 지원하며, 향후 AWS ECR이나 Google Artifact Registry 같은 클라우드 기반 레지스트리로 확장될 계획입니다. * **운영 방식**: GitLab 18.9 버전부터 API를 통해 설정 가능하며, SaaS 사용자는 기능 플래그 활성화를 통해 베타 버전에 참여할 수 있습니다. 성능 저하로 고민하는 플랫폼 팀이라면 이번 베타 기능을 통해 파이프라인의 병목 구간을 우선적으로 점검해 보길 권장합니다. 특히 여러 외부 레지스트리를 혼용하는 환경에서는 가상 레지스트리를 도입함으로써 관리 포인트를 일원화하고 대역폭 비용을 효과적으로 줄일 수 있습니다. 해당 기능들은 커뮤니티 피드백을 바탕으로 개선되고 있으므로, 실제 도입 후 개선 제안을 공유하는 것도 좋은 방법입니다.

datadog

Agent Go 바이너리 크기를 최대 77% 줄인 방법 (새 탭에서 열림)

Datadog은 에이전트 바이너리 크기가 5년 사이 3배 이상 비대해진 문제를 해결하기 위해, 기능 삭제 없이 Go 바이너리 크기를 최대 77% 줄이는 성과를 거두었습니다. 이들은 체계적인 의존성 감사, 코드 리팩토링, 링커 최적화 복원을 통해 1.22 GiB에 달하던 아티팩트를 5년 전 수준으로 되돌렸으며, 이 과정에서 발견한 Go 컴파일러의 특성을 활용해 Kubernetes 등 다른 대규모 오픈소스 프로젝트에도 기여했습니다. ### 데이터독 에이전트의 빌드 구조와 비대화 문제 * 데이터독 에이전트는 단일 제품처럼 보이지만, 실제로는 OS, 아키텍처, 환경(Docker, K8s, IoT 등)에 따라 수십 개의 서로 다른 빌드 구성을 가집니다. * 수백 개의 외부 라이브러리(Cloud SDK, 컨테이너 런타임 등)를 사용하며, Go 빌드 태그와 의존성 주입(Dependency Injection)을 통해 기능을 제어합니다. * 5년간의 기능 추가로 인해 Linux amd64 패키지의 압축 전 크기가 428MiB에서 1,248MiB로 약 192% 증가했으며, 이는 네트워크 비용 상승과 서버리스/IoT 환경에서의 사용 제약을 초래했습니다. ### Go 의존성 제거를 위한 전략적 접근 * **컴파일러의 패키지 처리 이해**: Go 컴파일러는 패키지 단위로 동작하며, 빌드 제약 조건에 맞는 파일 내에서 `main` 패키지로부터 전역적으로 도달 가능한(reachable) 모든 임포트를 포함합니다. * **빌드 태그 활용**: 불필요한 의존성을 포함하는 파일에 특정 빌드 태그(`//go:build`)를 추가하여, 해당 기능이 필요 없는 빌드에서는 컴파일 단계부터 제외되도록 구성했습니다. * **심볼 분리 및 리팩토링**: 무거운 의존성을 사용하는 특정 함수나 심볼을 별도의 패키지로 격리했습니다. 이를 통해 해당 기능이 꼭 필요한 바이너리에서만 해당 패키지를 임포트하도록 구조를 개선했습니다. ### 바이너리 분석 및 시각화 도구 활용 * **`go list`**: 특정 OS와 아키텍처, 빌드 태그 조합에서 포함되는 패키지 목록을 추출하여 의존성 현황을 파악했습니다. * **`goda`**: 패키지 임포트 관계를 그래프로 시각화하여, 특정 무거운 패키지가 어떤 경로를 통해 바이너리에 포함되었는지 추적했습니다. * **`go-size-analyzer`**: 바이너리 내부에서 각 의존성 패키지가 차지하는 실제 바이트 크기를 텍스트나 인터팩티브 웹 화면으로 분석하여 최적화 우선순위를 정했습니다. * **링커의 한계 파악**: 단순 임포트만으로도 `init` 함수 실행이나 전역 변수 초기화가 발생하여 링커가 해당 코드를 제거하지 못하는 경우가 있음을 확인하고 이를 관리했습니다. 대규모 Go 프로젝트에서 바이너리 크기를 줄이려면 단순한 코드 최적화를 넘어, `goda`나 `go-size-analyzer` 같은 도구로 의존성 그래프를 분석하고 빌드 태그를 활용해 패키지 간의 결합도를 낮추는 아키텍처적 접근이 필수적입니다. 특히 사용하지 않는 기능이 `init` 함수나 리플렉션(reflection)으로 인해 링커 최적화를 방해하지 않도록 주의 깊게 설계해야 합니다.