현대 DevOps 엔지니어의 역할
현대 DevOps 엔지니어의 역할은 기술적인 측면에서 매우 복잡합니다. 다양한 프로그래밍 언어(Node.js, 배치 스크립트, Python 등)에 대한 숙련도가 필수적이며, 배포 과정 내 테스트 자동화 통합에 대한 이해도 요구됩니다. 또한, 자동화된 파이프라인에서 코드 통합자로서 다양한 클라우드 서비스의 기본 기능을 숙지해야 합니다.
이러한 기술적 복잡성에도 불구하고, DevOps 엔지니어에게 기술적 능력만이 최우선은 아닙니다. 기술적 능력을 익히는 것이 중요하지만, 실제 DevOps 전문가들의 의견을 종합해 보면, 소프트 스킬이 훨씬 더 중요하다는 것을 알 수 있습니다.
주요 DevOps 기술
스크럼 팀 내에서 DevOps 엔지니어의 상호 작용을 관찰하면 매우 흥미롭습니다. 종종 팀의 스토리 내 특정 기능에 대한 기술 정보 때문에 나머지 팀은 스토리의 구체적인 내용에 대한 세부 정보가 부족한 경우가 많습니다.
그러나 다양한 자동화 테스트의 실행과 검증을 포함하여 팀의 결과물을 실행 가능한 배포 파이프라인에 통합하는 능력은 필수적입니다. 더 이상 단순한 기술 전문가만으로는 충분하지 않습니다. 커뮤니케이션 능력은 성공의 핵심 요소가 됩니다. 이제 가장 중요한 DevOps 기술들을 자세히 살펴보겠습니다.
소프트 스킬의 중요성
DevOps 기술 목록에서 소프트 스킬이 최우선 순위를 차지하는 이유는 애자일 팀 내부에서의 협업과 논의가 매우 중요하기 때문입니다. 이유가 궁금하시다면 다음과 같은 주요 논거를 참고해 주십시오.
- DevOps 엔지니어는 개발 팀과의 적응력이 부족하면 효과적으로 일할 수 없습니다. 개발 팀은 소프트웨어 또는 플랫폼 기능의 기반을 구축합니다. DevOps 엔지니어는 이러한 기능을 위한 라이브 환경을 구축하고 운영하는 역할을 담당합니다.
- 또한, 소프트웨어 플랫폼에 접근하려는 외부 이해관계자의 주요 연락 담당자입니다. 요청을 이해하고 자동화된 클라우드 환경의 모든 기술적인 복잡성을 이해관계자가 이해할 수 있도록 비기술적인 용어로 변환해야 합니다. 개발팀과 외부 이해관계자 사이의 중요한 중개자 역할을 하는 것입니다.
- 일반적으로 특정 기술은 학습 시스템을 통해 습득할 수 있지만, 적절한 소프트 스킬을 익히려면 개인의 성찰과 성장이 필요합니다. 스스로를 다양한 관점에서 바라보고 개선 영역을 파악하는 것은 쉽지 않습니다.
네트워킹의 중요성
최신 클라우드 플랫폼의 기술 환경은 매우 복잡하여 쉽게 길을 잃을 수 있습니다. 파일 시스템 서비스, 다양한 데이터베이스 서비스, 백엔드 API, 서버 또는 서버리스 아키텍처, 프런트엔드 서비스, 머신 러닝 모델, 하이브리드 환경, 가상 사설망, 고가용성 로드 밸런서, 다양한 실시간 스트리밍 서비스 등 다양한 요소들을 다뤄야 합니다.
모든 것을 다 아는 것은 불가능하지만, DevOps 엔지니어는 이러한 모든 요소를 연결하여 기능적인 소프트웨어 플랫폼을 만드는 방법을 알아야 합니다. 따라서 강력한 네트워크 커뮤니티를 구축하는 것이 필수적입니다.
분산 시스템 통신의 단순성과 효율성 사이에서 최적의 균형을 찾는 것은 DevOps 엔지니어가 인지하고 팀에 솔루션을 제공해야 할 과제 중 하나입니다.
일반적으로 구축 중인 인프라가 플랫폼의 보안 문제를 심각하게 다루기 시작할 때 충분히 성숙했다는 것을 알 수 있습니다. 이는 DevOps 엔지니어의 또 다른 중요한 영역입니다.
기존의 검증된 연락처를 고수하는 대신, 팀에서 요청하는 새로운 서비스를 처리하기 위해 새로운 연락처를 지속적으로 찾아야 합니다.
소프트웨어 테스트
특히 애자일 환경에서는 소프트웨어 릴리스의 유연성이 매우 중요합니다. 2주간의 스프린트 주기로 구성된 스크럼 환경에서 2주마다 새로운 프로덕션 출시가 이루어질 수 있습니다.
계획, 추정, 개발, 테스트 및 릴리스를 포함하는 전체 프로젝트 라이프사이클을 고려할 때, 가능한 한 많은 단계에서 강력한 자동화가 없이는 목표를 달성하기 어렵습니다.
이러한 설정에서 성공(그리고 생산 배포 시간 단축)을 위한 주요 전제 조건은 테스트 자동화에 집중하는 것입니다. 자동화된 테스트와 함께 배포 속도가 빨라지면 사용자가 개발자에게 피드백을 제공하는 데 걸리는 시간이 단축됩니다.
DevOps 엔지니어는 다양한 테스트 팀의 결과를 CI/CD 파이프라인에 통합해야 합니다.
- 각 저장소 커밋 후 단위 테스트 스크립트 실행을 활성화해야 합니다. 존재하지 않을 경우, 개발자와 협력하여 생성해야 합니다.
- 완전히 통합되고 일관된 테스트 환경에 배포되는 CI/CD 파이프라인에 통합 테스트 사례를 포함해야 합니다. 개발팀이 사용하는 모든 개발 환경에서 통합 테스트를 실행하는 것은 의미가 없습니다. 통합 테스트 사례는 모든 서비스가 배포되고 데이터가 일관적인 환경에서 완벽하게 실행되어야 합니다.
- 실제 엔드투엔드 테스트 사례를 CI/CD 파이프라인에 통합해야 합니다. 통합 테스트 또는 사용자 승인 테스트 환경에 대한 각 마스터 코드 배포에 대해 필수 실행으로 만들어야 합니다. 이를 통해 모든 중요하고 핵심적인 비즈니스 프로세스가 실패 없이 실행될 수 있습니다.
무리하지 않고 모든 중요한 프로세스를 포괄하는 방식으로 효과적인 테스트 사례를 작성하는 것은 또 다른 중요한 과제입니다. DevOps 엔지니어가 반드시 혼자 할 필요는 없습니다. 비즈니스 분석가 또는 품질 보증 관리자가 네트워크의 일부(팀 내부가 아니더라도)가 되어 이를 지원하고 정확한 단계를 정의할 수 있습니다. 하지만 이를 자동화된 실행 코드로 변환하는 것은 DevOps 엔지니어의 역할입니다.
CI/CD 및 코드형 인프라(IaC)
이미 여러 차례 언급했듯이, IaC(그리고 이를 CI/CD 파이프라인을 통해 실행하는 것)는 DevOps 엔지니어의 핵심 결과물입니다. 개발팀의 모든 입력(다양한 서비스 기능 형태)이 실제 인프라 환경과 연결되고, 서비스 출력으로 사용 가능한 소프트웨어를 형성하여 다양한 환경에 반복적으로 배포할 수 있도록 하는 것이 바로 IaC입니다.
따라서 이는 DevOps 엔지니어의 주요 과제 중 하나입니다. 특히 요구 사항이 클라우드에 구애받지 않는다면, Terraform과 같은 언어를 사용하여 IaC를 작성하고 코드에 클라우드 공급자별 미묘한 차이가 포함되지 않도록 해야 합니다. 클라우드에 구애받지 않는 인프라 코드 스크립트로 전환하는 것은 숙련된 엔지니어에게도 어려운 작업입니다.
수동 배포 단계만 사용하여 클라우드 인프라를 유지 관리하는 것은 거의 불가능합니다. 과거에는 온프레미스 환경에서 표준이었지만, 애자일 환경에서는 수동 배포로 살아남기 어렵습니다. 이러한 전환은 필연적이지만, 고통스러울 수 있습니다.
하지만 일단 제대로 수행되면 다음과 같은 이점을 얻을 수 있습니다.
- 프로덕션 배포가 필요한가요? 프로덕션에 대한 코드 배포가 포함된 릴리스 파이프라인을 실행하면 됩니다.
- 팀 내부의 다른 개발 작업과 겹치지 않도록 또 다른 개발 환경이 필요한가요? 개발 파이프라인을 찾아 실행 버튼을 누르십시오. 테스트 데이터를 포함한 모든 개발 인프라가 자동으로 실행되고 생성됩니다.
- 더 이상 환경이 필요하지 않으면, 동일한 개발 파이프라인이 환경에 이전에 배포된 모든 서비스에 대한 삭제 명령을 실행할 수 있습니다.
성공적인 애자일 팀은 인프라를 코드로 구현하고 이를 언제든지 작업을 수행할 수 있는 CI/CD 파이프라인 내에 배치하는 것이 필수적입니다. DevOps 엔지니어는 이러한 환경을 제공하는 역할을 합니다.
컨테이너화
출처: aws.amazon.com
대규모 프로젝트에서는 빠른 복제 가능성이 매우 중요합니다. 동일한 환경의 수백 개의 복사본을 동시에 생성하는 것은 컨테이너화된 환경 없이는 불가능합니다. 컨테이너화는 높은 학습 곡선을 요구하는 기술이며, 이것이 소수의 프로젝트에서만 실제로 컨테이너화를 적극적으로 활용하는 이유이기도 합니다.
컨테이너 서버는 필요할 때마다 자주 적용할 수 있는 템플릿이며, 결과는 항상 동일합니다. 동일한 인프라와 동일한 데이터. 이는 DevOps 엔지니어가 팀을 위해 구축할 수 있는 귀중한 자산입니다. 다양한 도구를 사용하여 컨테이너를 생성하는 방법을 숙지해야 합니다.
컨테이너는 쉽게 생성되고 파괴되도록 설계되었습니다. DevOps 엔지니어는 컨테이너 배포, 확장 및 복구를 자동으로 관리할 수 있는 Kubernetes 또는 Docker Swarm과 같은 컨테이너 오케스트레이션 도구를 구현해야 합니다.
컨테이너는 동일한 호스트 운영 체제를 공유하므로, 하나의 컨테이너가 손상되면 동일한 호스트의 다른 컨테이너도 잠재적으로 손상될 수 있습니다. 또한 컨테이너가 타사 이미지로 구축된 경우 코드 내부에 취약점이 포함될 수 있습니다. DevOps 엔지니어는 이러한 위험을 완화하기 위해 컨테이너 격리, 액세스 제어, 취약성 검색과 같은 보안 기능을 구현해야 합니다.
확장성은 컨테이너의 또 다른 중요한 속성입니다. 증가된 워크로드를 처리하기 위해 쉽게 수평으로 확장할 수 있지만, 이로 인해 리소스 경합 및 성능 문제가 발생할 수도 있습니다. DevOps 엔지니어는 각 컨테이너가 소비할 수 있는 리소스 양을 제한할 수 있는 cgroup 또는 Kubernetes 리소스 할당량과 같은 리소스 관리 도구를 구현해야 합니다.
DevOps 엔지니어는 보안, 확장성, 복원력을 염두에 두고 컨테이너화에 접근해야 합니다. 다른 모든 기술 중에서도 컨테이너화를 마스터하는 것은 특히 높은 학습 곡선을 요구하며, 이 복잡성 때문에 소수의 프로젝트에서만 실제로 이를 적극적으로 사용합니다.
결론
DevOps 전문가는 애자일 팀에서 고유한 역할을 수행합니다. 전체 프로젝트에서 한두 명만 있을 수 있지만, 이들은 프로젝트 성공에 매우 중요한 역할을 합니다.
DevOps 엔지니어는 동시에 다양한 역할을 수행해야 하므로 높은 수준의 기대치를 충족해야 합니다.
- 뛰어난 기술 개발자여야 하며,
- 공감과 이해, 협력 의지를 갖춘 팀 플레이어여야 하며,
- 개발팀과 비기술적인 외부 이해관계자 사이의 효과적인 중개자 역할을 해야 하며,
- 자동화 및 코드 테스트 검증을 통해 전체 팀을 연결해야 하며,
- 프로젝트의 정기적인 릴리스를 가능하게 해야 하며,
- 끊임없이 변화하는 전문가 네트워크를 지속적으로 구축해야 합니다.
모든 기술적 복잡성에도 불구하고 DevOps 이니셔티브의 성공에 중요한 것은 사람의 능력입니다. DevOps 엔지니어가 되기 직전이라면, 기술 지식에만 국한하지 않고 보다 넓은 관점에서 교육을 접근하는 것에 대해 자부심을 가질 자격이 있습니다.
다음으로 자주 묻는 DevOps 인터뷰 질문과 답변을 확인해 보세요.