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 ECS 및 Amazon Elastic Kubernetes Service에서 실행되는 컨테이너식 애플리케이션(AWS Fargate를 사용하는 애플리케이션 포함)과 마찬가지로 AWS Lambda 함수를 프로파일링할 수 있습니다.
- 권장 사항 보고서로 문제의 비용 보고 – 권장 사항에는 문제, CPU 영향 및 해결 방법을 설명하는 실행 가능한 해결 단계가 포함됩니다. 활동의 우선 순위를 손쉽게 지정할 수 있도록 이제 권장 사항을 적용하여 도입되는 예상 절감액이 여기에 포함됩니다.
- 코드 색 지정 – 시각화에서 자체 코드를 손쉽게 찾을 수 있도록 사용하는 프레임워크 및 기타 라이브러리와 다른 색상이 메서드에 지정됩니다.
- CloudWatch 지표 및 알림 – 검색된 효율성 문제를 지속적으로 추적하고 모니터링할 수 있습니다.
이 새로운 기능의 작동 방식을 직접 살펴봅시다.
Lambda 함수에 CodeGuru Reviewer 사용
GitHub 계정에 새 리포지토리를 생성하고 비워 두었습니다. Java 11 런타임을 사용하여 Lambda 함수를 개발하는 위치에서 로컬로 Git 리포지토리를 초기화하고 README.md
파일만 master
브랜치에 추가합니다. 이 방법으로 나중에 모든 코드를 풀 요청으로 추가하고 CodeGuru의 코드 검토를 받을 수 있습니다.
이제 GitHub 리포지토리를 오리진으로 추가하고 변경 사항을 새 리포지토리로 푸시합니다.
CodeGuru 콘솔에서 리포지토리를 연결합니다.
리포지토리가 연결되면 새 dev
브랜치를 생성하고 모든 로컬 파일을 여기에 추가한 다음 원격으로 푸시합니다.
GitHub 콘솔에서 master
와 dev
의 두 브랜치에 대한 변경 사항을 비교하여 새 풀 요청을 엽니다. 풀 요청을 병합할 수 있음을 확인한 후 생성합니다.
리포지토리가 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
)합니다.
지침에 따라(Maven 및 Gradle) 종속성을 추가하고 프로파일링 에이전트를 빌드에 포함합니다. 그런 다음, 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