Amazon Web Services 한국 블로그

Amazon CodeGuru의 새로운 기능 – Python 지원, 보안 감지기, 메모리 프로파일링

Amazon CodeGuru는 코드 품질을 개선하는 데 도움이 되는 개발자 도구이며 크게 다음 두 가지 구성 요소로 구성됩니다.

  • CodeGuru Reviewer는 프로그램 분석과 기계 학습을 이용해서 코드 내에서 발견하기 어려운 잠재적 오류를 찾아내고 추천하는 개선 방법을 제공합니다.
  • CodeGuru Profiler는 라이브 애플리케이션에서 런타임 성능 데이터를 수집하고, 시각화 및 권고 사항을 통해 애플리케이션 성능을 세밀하게 조정하도록 돕습니다.

오늘은 새로운 기능 세 가지를 안내하겠습니다.

  • Python Support for CodeGuru Reviewer and Profiler(미리 보기) – CodeGuru를 이용해서 Python 애플리케이션을 개선할 수 있습니다. 이 릴리스 이전에는 CodeGuru Reviewer로 Java 코드를 분석했고, CodeGuru Profiler가 Java 가상 머신(JVM)에서 실행되는 애플리케이션을 지원했습니다.
  • Security Detectors for CodeGuru Reviewer – 보안 취약성을 발견하고 Java 코드에서 보안 모범 사례를 검사하기 위한 새로운 CodeGuru Reviewer용 감지기입니다.
  • Memory Profiling for CodeGuru Profiler – 시간에 따라 객체 유형별로 메모리 보존 여부에 대한 시각화를 제공합니다. 메모리 누수를 쉽게 찾아내고, 애플리케이션에서 메모리를 사용하는 방식을 최적화할 수 있습니다.

그러면 위의 기능에 대해 자세히 살펴보겠습니다.

Python Support for CodeGuru Reviewer and Profiler(미리 보기)
Python Support for CodeGuru Reviewer는 현재 미리 보기 상태이며 동시성, 데이터 구조, 제어 흐름, 과학/수학 연산, 오류 처리, 표준 라이브러리 사용, AWS 모범 사례 등의 여러 카테고리에서 애플리케이션의 Python 코드를 개선하는 방법에 대한 권고 사항을 제공합니다.

이제 CodeGuru Profiler를 사용하여 Python 애플리케이션에서 런타임 성능 데이터를 수집하고 CPU에서의 코드 실행 방식, 시간이 소모되는 영역을 찾아낼 수 있습니다. 이렇게 하면 애플리케이션에서 가장 리소스를 많이 사용하는 코드 행을 찾아낼 수 있습니다. 이 부분에 튜닝 활동을 집중하면 인프라 코드를 줄이고 애플리케이션 성능을 개선하는 데 도움이 됩니다.

Python 코드에서 CodeGuru Reviewer를 어떻게 사용하는지 알아보겠습니다. 제가 8년 전에 AWS에 입사했을 때 처음으로 만든 프로젝트는 Amazon Simple Storage Service(S3)Filesystem in Userspace (FUSE) 인터페이스로, 프로젝트명은 yas3fs(새로운 S3 지원 파일 시스템)이었습니다. 인기가 많았던 s3fs-fuse 프로젝트에서 영감을 얻었는데 Amazon Simple Notification Service(SNS) 알림으로 동기화된 분산 캐시를 구현하도록 처음부터 새롭게 작성했습니다(지금은 많은 분이 도움을 주신 덕분에 S3 이벤트 알림을 사용하고 있습니다). 이 프로젝트는 Python 프로그래밍과 S3에 대해 배울 좋은 기회이기도 했습니다. 당시에는 오픈 소스로 제공한 개인 프로젝트였습니다. 지금은 공유 파일 시스템이 필요할 경우 Amazon Elastic File System(EFS)을 사용할 수 있습니다.

CodeGuru 콘솔에서 yas3fs 리포지토리를 연결하겠습니다. GitHub에서 GitHub Enterprise Cloud 및 GitHub Enterprise Server, Bitbucket, AWS CodeCommit 등의 리포지토리를 연결할 수 있습니다.

그런 다음에 CodeGuru에서 코드 검토를 가져오는 방법은 두 가지가 있습니다.

  • 풀 요청을 생성할 때 자동으로 코드 검토를 가져옵니다. 여러분과 팀원들이 코드 베이스에서 작업할 때 사용하면 좋습니다.
  • 리포지토리 분석을 수동으로 생성해서 하나의 분기에 있는 모든 코드에 대해 코드 검토를 가져옵니다. 기존 코드 베이스로 GodeGuru를 사용할 때 유용합니다.

조금 전에 전체 리포지토리를 연결했기 때문에 전체적으로 분석하고 검토할 분기 이름을 쓰겠습니다(죄송하지만, 당시에는 아직 master를 쓰고 있었고 지금은 새 프로젝트에 main을 사용합니다).

몇 분 후 코드 검토가 완료되고 권고 사항이 14개 나옵니다. 지금도 나쁘지는 않지만 확실히 코드를 개선해야 할 필요는 있습니다. 권고 사항의 예시는 다음과 같습니다. 당시 저는 예외와 전역 변수를 지나치게 많이 사용했습니다.

Security Detectors for CodeGuru Reviewer
새로운 CodeGuru Reviewer Security Detector는 자동 추론을 사용하여 모든 코드 경로를 분석하고 Java 코드 내에 깊이 숨겨진 잠재적 보안 문제를 찾아냅니다. 여러 메서드와 파일에 걸쳐 있는 문제는 물론이고, 여러 작업 시퀀스가 포함된 문제까지 알아낼 수 있습니다. 이 감지기를 구축하기 위해 Amazon이 20년 이상 축적한 경험을 바탕으로 얻은 교훈과 모범 사례를 활용했습니다.

또한, 보안 감지기는 상위 10개 개방형 웹 애플리케이션 보안 프로젝트(OWASP) 카테고리에 속한 보안 취약성(예: 취약한 해시 암호화)도 찾아냅니다.

보안 감지기가 문제를 발견하면 설명과 함께 추천하는 방안을 제공합니다. 따라서 더욱 쉽게 AWS API의 보안 모범 사례(예: AWS Key Management Service(KMS)Amazon Elastic Compute Cloud(EC2))와 공통적 Java 암호 작성 및 TLS/SSL 라이브러리 보안 모범 사례를 따를 수 있습니다.

보안 엔지니어는 보안 감지기의 도움을 받아 아키텍처 및 애플리케이션별 보안 모범 사례에 집중하고 코드 검토자는 다른 개선 사항에 집중할 수 있습니다.

Memory Profiling for CodeGuru Profiler
JVM에서 실행되는 애플리케이션의 경우 CodeGuru Profiler에서 힙 요약을 표시합니다. 힙 요약은 일정 기간의 메모리 보존을 통합적으로 표시하고 객체 유형(예: String, int, char[] 및 사용자 지정 유형)별로 객체의 전체 용량과 개수를 추적합니다. 이러한 지표는 타임라인 그래프로 표시되므로 객체 유형별 메모리 활용 흐름과 피크를 쉽게 찾아낼 수 있습니다.

이 기능이 도움이 될 만한 시나리오의 예시는 다음과 같습니다.

메모리 누수 – 하나 이상의 객체 유형에서 메모리 사용 곡선이 지속적으로 증가하는 것은 누수일 수 있습니다(여기에서는 애플리케이션이 메모리 객체를 불필요하게 보존하는 것을 의미). 이는 메모리 부족 오류와 애플리케이션 충돌로 이어질 수 있습니다.

메모리 최적화 – 객체 유형별로 메모리 사용량을 분석하면 총 힙 사용량과 같은 JVM 수준의 지표를 사용하는 기존 메모리 사용량 모니터링보다 훨씬 우수한 기능을 제공합니다. 갑작스럽게 대량의 메모리가 특정 객체 유형에 연결되었는지 확인할 수 있으므로 해당 유형의 객체를 할당하고 참조하는 작업을 담당하는 애플리케이션 부분에 분석 및 최적화 노력을 집중할 수 있습니다.

예를 들어, 다음은 시간 간격에 따른 Java 애플리케이션의 메모리 사용 방식을 나타내는 그래프입니다. 사용 가능한 총 용량과 사용된 용량 외에도 특정 객체 유형(byte[], java.lang.UUID) java.util.LinkedHashMap 항목에서 메모리를 어떻게 사용하는지 확인할 수 있습니다. 이런 객체 유형이 보존한 메모리가 시간이 지날수록 증가하는 부분이 의심스럽습니다. 메모리 누수가 있는지 조사할 필요성이 있습니다.

아래의 표에는 힙 내에서 할당된 메모리에 대한 자세한 객체 유형이 보여집니다. 처음 세 개를 선택하였고, 해당 항목이 위의 그래프에 표시되었습니다. 여기에서 다른 객체 유형을 조사하고 시간에 따른 메모리 사용량을 확인할 수 있습니다. 제가 선택한 세 가지 객체 유형이 메모리 누수에 영향을 받았을 위험이 큰 객체인 것 같습니다.

정식 출시
오늘 발표한 새로운 기능은 Amazon CodeGuru가 제공되는 모든 리전에서 사용할 수 있습니다. 자세한 내용은 AWS 리전 서비스 표를 참고하세요.

Python 지원, 보안 감지기, 메모리 프로파일링에 따른 요금 변동은 없습니다. 선결제나 약정 없이 사용한 만큼만 요금을 지불합니다.

Amazon CodeGuru에 대해 자세히 알아보고 오늘부터 이 기능을 사용해서 애플리케이션 코드의 품질을 개선하세요.  

Danilo