Amazon Web Services 한국 블로그

Amazon CodeGuru 정식 출시 – 비용 절감을 위한 코드 리뷰 서비스

새 애플리케이션을 프로덕션에 배치할 때 애플리케이션 코드베이스의 증가 및 변화에 따라 이러한 코드베이스를 유지하면서 운영 문제에 대응하기가 쉽지 않습니다. 이러한 이유로 팀을 구성하는 방법, 적용할 방법론 및 소프트웨어 전송 파이프라인을 안전하게 자동화하는 방법에 관한 다양한 아이디어를 찾게 됩니다.

지난 해 re:Invent에서 AWS는 미리 보기 버전의 Amazon CodeGuru를 소개했습니다. 기계 학습으로 구동되는 이 개발자 도구는 런타임 데이터에 기반을 둔 자동화된 코드 검토 및 성능 권장 사항을 제공하여 애플리케이션을 개선하고 문제 해결을 지원합니다. 지난 몇 달 동안 보다 경제적인 요금 모델, Bitbucket 리포지토리 지원명령줄 스위치를 사용하여 프로파일링 에이전트를 시작할 수 있는 기능을 포함한 다수의 개선된 기능이 출시됨에 따라 이제 애플리케이션 코드를 수정하거나 종속성을 추가할 필요 없이 에이전트를 실행할 수 있게 되었습니다.

CodeGuru는 두 가지 방법으로 사용될 수 있습니다.

  • CodeGuru Reviewer는 프로그램 분석 및 기계 학습을 사용하여 개발자가 찾기 어려운 잠재적 결함을 감지하고 Java 코드의 수정을 권장합니다. 코드는 GitHub(이제 GitHub Enterprise도 포함), AWS CodeCommit 또는 Bitbucket 리포지토리에 저장될 수 있습니다. CodeGuru Reviewer에 연결된 리포지토리에 대한 풀 요청을 제출하면 코드 개선을 위한 권장 사항이 제공됩니다. 각 풀 요청은 단일의 코드 검토로 연결되며 각 코드 검토에는 풀 요청의 주석으로 표시되는 다수의 권장 사항이 포함될 수 있습니다.
  • CodeGuru Profiler는 라이브 애플리케이션의 런타임 데이터를 사용하여 애플리케이션 성능을 세부 조정하고 운영 문제를 해결하는 데 도움이 되는 대화형 시각화 및 권장 사항을 제공합니다. 현재 Java, Scala, Kotlin, Groovy, Jython, JRuby 및 Clojure 등의 JVM(Java Virtual Machine) 언어로 작성된 애플리케이션을 지원합니다. CodeGuru Profiler는 CPU 사용량 또는 지연 시간 도입의 관점에서 가장 비싼 코드 줄을 찾은 후 효율성을 개선하고 병목 현상을 제거할 방법을 제안하는 데 도움이 될 수 있습니다. 프로덕션에서 CodeGuru Profiler를 사용할 수 있으며 프로덕션 전 환경과 같이 유의미한 워크로드로 애플리케이션을 테스트할 때도 사용할 수 있습니다.

오늘, Amazon CodeGuru가 다수의 새로운 기능을 더해 정식 출시되었습니다.

CodeGuru Reviewer에는 다음이 도입되었습니다.

  • Github Enterprise 지원 – 이제 풀 요청을 스캔하고 Github Enterprise 온프레미스 리포지토리의 소스 코드에 대한 권장 사항을 받을 수 있습니다. 문제의 원인과 해결 방법에 대한 설명도 포함됩니다.
  • 결함을 해결하고 코드를 개선하는 새로운 유형의 권장 사항 – 예를 들어 입력 유효성을 확인하여 보안 및 성능을 저해하는 문제를 방지하고, 동일한 작업을 수행하는 코드의 여러 복사본을 검토할 수 있습니다.

CodeGuru Profiler에는 다음과 같은 새로운 기능이 추가되었습니다.

  • 이상 감지 – 애플리케이션 프로파일에서 CPU 시간 또는 지연 시간의 가장 높은 비율을 나타내는 메서드에 대한 이상을 자동으로 감지합니다.
  • Lambda 함수 지원 – 이제 Amazon Elastic Compute Cloud(EC2)에서 호스팅되는 애플리케이션과 Amazon ECSAmazon Elastic Kubernetes Service에서 실행되는 컨테이너식 애플리케이션(AWS Fargate를 사용하는 애플리케이션 포함)과 마찬가지로 AWS Lambda 함수를 프로파일링할 수 있습니다.
  • 권장 사항 보고서로 문제의 비용 보고 – 권장 사항에는 문제, CPU 영향 및 해결 방법을 설명하는 실행 가능한 해결 단계가 포함됩니다. 활동의 우선 순위를 손쉽게 지정할 수 있도록 이제 권장 사항을 적용하여 도입되는 예상 절감액이 여기에 포함됩니다.
  • 코드 색 지정 – 시각화에서 자체 코드를 손쉽게 찾을 수 있도록 사용하는 프레임워크 및 기타 라이브러리와 다른 색상이 메서드에 지정됩니다.
  • CloudWatch 지표 및 알림 – 검색된 효율성 문제를 지속적으로 추적하고 모니터링할 수 있습니다.

이 새로운 기능의 작동 방식을 직접 살펴봅시다.

Lambda 함수에 CodeGuru Reviewer 사용
GitHub 계정에 새 리포지토리를 생성하고 비워 두었습니다. Java 11 런타임을 사용하여 Lambda 함수를 개발하는 위치에서 로컬로 Git 리포지토리를 초기화하고 README.md 파일만 master 브랜치에 추가합니다. 이 방법으로 나중에 모든 코드를 풀 요청으로 추가하고 CodeGuru의 코드 검토를 받을 수 있습니다.

git init
git add README.md
git commit -m "First commit"

이제 GitHub 리포지토리를 오리진으로 추가하고 변경 사항을 새 리포지토리로 푸시합니다.

git remote add origin https://github.com/<my-user-id>/amazon-codeguru-sample-lambda-function.git
git push -u origin master

CodeGuru 콘솔에서 리포지토리를 연결합니다.

리포지토리가 연결되면 새 dev 브랜치를 생성하고 모든 로컬 파일을 여기에 추가한 다음 원격으로 푸시합니다.

git checkout -b dev
git add .
git commit -m "Code added to the dev branch"
git push --set-upstream origin dev

GitHub 콘솔에서 masterdev의 두 브랜치에 대한 변경 사항을 비교하여 새 풀 요청을 엽니다. 풀 요청을 병합할 수 있음을 확인한 후 생성합니다.

리포지토리가 CodeGuru에 연결되어 있으므로 CodeGuru 콘솔의 [코드 검토] 섹션에 코드 검토가 [대기 중]으로 나열됩니다.

몇 분 후 코드 검토 상태가 [완료]로 전환되고 풀 요청을 생성한 동일한 GitHub 페이지에 CodeGuru Reviewer의 권장 사항이 표시됩니다.

이런! 함수 호출 메서드 안에 Amazon DynamoDB 서비스 객체를 생성하고 있군요. 이렇게 하면 호출 전체에서 서비스 객체를 재사용할 수 없습니다. 이 방법은 효율적이지 않습니다.

Lambda 함수의 성능을 개선하기 위해 CodeGuru 권장 사항에 따라 DynamoDB 서비스 객체의 선언을 Java 애플리케이션 객체의 정적 최종 속성으로 이동합니다. 이렇게 하면 함수 초기화 중에 한 번만 인스턴스화됩니다. 그런 다음 권장 사항의 링크로 이동하여 Lambda 함수 작업에 대한 모범 사례를 확인합니다.

Lambda 함수에 CodeGuru Profiler 사용
CodeGuru 콘솔에서 MyServerlessApp-Development 프로파일링 그룹을 생성하고 Lambda 컴퓨팅 플랫폼을 선택합니다.

다음으로, Lambda 함수 권한으로 이 프로파일링 그룹에 데이터를 제출할 때 사용할 AWS Identity and Access Management(IAM) 역할을 지정합니다.

이제, Lambda 함수를 프로파일링하는 데 필요한 모든 정보가 콘솔에 표시됩니다. 프로파일링 에이전트를 구성하기 위해 몇 가지 환경 변수를 사용합니다.

  • AWS_CODEGURU_PROFILER_GROUP_ARN을 사용하여 사용할 프로파일링 그룹의 ARN을 지정합니다.
  • AWS_CODEGURU_PROFILER_ENABLED를 사용하여 프로파일링을 활성화(TRUE)하거나 비활성화(FALSE)합니다.

지침에 따라(MavenGradle) 종속성을 추가하고 프로파일링 에이전트를 빌드에 포함합니다. 그런 다음, Lambda 함수의 코드를 업데이트하여 에이전트가 제공한 LambdaProfiler의 안에 핸들러 함수를 래핑합니다.

일부 로드를 생성하기 위해 Amazon API Gateway를 트리거로 사용하여 함수를 호출하는 스크립트 몇 개를 시작합니다. 몇 분 후 프로파일링 그룹에서 Lambda 함수의 런타임 동작을 설명하는 시각화가 표시됩니다.

예를 들어 함수의 다양한 메서드에 사용되는 CPU 시간을 확인할 수 있습니다. 맨 아래에는 진입점 메서드가 있습니다. 위로 스크롤하면 스택 추적의 깊은 곳에서 호출되는 메서드가 보입니다. 마우스를 오른쪽으로 클릭하고 LambdaRuntimeClient 메서드를 숨깁니다. 이렇게 하면 코드에 집중할 수 있습니다. AWS SDK for Java와 같은 사용 중인 패키지와 다른 색상이 메서드에 지정된 것을 알 수 있습니다.

Lambda 플랫폼이 호출한 핸들러 메서드의 상태가 가장 궁금하므로 핸들러 메서드를 선택합니다. 그러면 이 핸들러 메서드가 시각화의 새로운 “기준”이 됩니다.

각 메서드 위로 포인터를 옮기면 추가 정보가 표시됩니다. 예를 들어 선택한 기간에 프로파일링 에이전트에 가해지는 로드를 기준으로, 코드의 이 특정 부분을 프로덕션에서 실행할 때의 연 예상 비용을 확인할 수 있습니다. 이 예에서 핸들러 함수 비용은 약 6 USD입니다. 위의 두 가지 기본 함수를 선택하는 경우 각각의 예상 비용은 3 USD입니다. Lambda 함수, EC2 인스턴스 및 컨테이너식 애플리케이션에서 실행되는 코드의 예상 비용도 확인할 수 있습니다.

마찬가지로, 지연 시간을 시각화하여 코드의 메서드 안에서 사용되는 시간을 파악할 수 있습니다. Lambda 함수 핸들러 메서드를 선택한 상태에서 제어할 수 있는 항목으로 드릴다운하면 가장 많은 시간이 소모되는 영역을 식별할 수 있습니다.

CodeGuru Profiler는 수집된 데이터에 기반을 둔 권장 사항도 제공합니다. 암호화 관리에 너무 많은 시간(4% 이상)이 소모되고 있군요. 이 블로그 게시물에 설명된 오픈 소스 Amazon Corretto Crypto Provider와 같이 보다 효율적인 암호화 공급자를 사용하는 것이 좋겠습니다. 이렇게 하면 예상 사용 시간이 줄어듭니다(프로파일의 약 1%).

마지막으로, 프로파일링 그룹을 편집하여 알림을 활성화합니다. 이렇게 하면 CodeGuru가 애플리케이션 프로파일에서 이상을 감지할 때 하나 이상의 Amazon Simple Notification Service(SNS) 주제로 알림이 전송됩니다.

지금 이용 가능
Amazon CodeGuru를 오늘부터 10개 리전에서 사용할 수 있으며 몇 개월 안에 추가 리전에서도 사용할 수 있게 됩니다. 사용 가능한 리전은 AWS 리전 표를 참조하십시오.

CodeGuru는 자동화된 코드 검토기 및 애플리케이션 프로파일러를 통해 지능적인 권장 사항을 제공하여 애플리케이션 코드를 개선하고 컴퓨팅 및 인프라 비용을 절감할 수 있도록 합니다. 런타임 데이터에 기반을 둔 시각화를 사용하여 애플리케이션에서 가장 많은 비용을 야기하는 코드 줄을 빠르게 찾을 수 있습니다. CodeGuru를 사용할 때는 사용한 만큼만 요금을 지불합니다. 요금은 CodeGuru Reviewer로 분석한 코드 줄과 CodeGuru Profiler의 샘플링 시간을 기준으로 부과됩니다.

자세히 알아보려면 설명서를 참조하십시오.

Danilo