소프트웨어 개발 생명주기 초반에 지속가능성을 반영해 정적 코드 분석과 IaC 스캐닝으로 더 친환경적인 소프트웨어를 만드는 방법을 설명합니다.
오늘날 지속가능성은 대부분의 소프트웨어 애플리케이션에서 사후적으로 고려되는 요소입니다.
애플리케이션이 프로덕션에 배포된 지 한참 뒤에야, 전문 팀이 해당 애플리케이션의 탄소 배출량을 측정하고 이를 줄이기 위한 조치를 식별해 달라는 요청을 받을 수 있습니다.
이는 몇 년 전 개발자가 애플리케이션 보안을 책임지지 않던 시절의 보안 처리 방식을 떠올리게 합니다. 애플리케이션을 평가하고 보안상의 발견 사항을 보고하는 일은 보안 팀의 역할이었습니다. 전체 과정은 일반적으로 개발자가 보고된 보안 이슈를 해결할 때까지 지연을 초래했고, 그동안 애플리케이션은 보안 위협에 노출되어 있었습니다.
애플리케이션을 프로덕션에 배포하기 전에 보안 문제를 해결하기 위해, 우리 업계는 소프트웨어 개발 생명주기 초기에 보안 관행을 도입했고, 빌드 단계에서 코드의 취약점을 점검하는 방식을 채택했습니다. 이는 시큐리티 시프트 레프트 또는 DevSecOps로 알려진 관행입니다.
지속가능성을 사후적으로 다루는 대신, 어떻게 소프트웨어 개발 초기에 지속가능성 관행을 내재화할 수 있을까요?
이 분야는 여전히 발전 중이지만, 개발자는 다음과 같은 관행을 채택하여 더 친환경적인 소프트웨어 애플리케이션을 구축할 수 있으며, 소프트웨어 개발 생명주기(SDLC)에서 지속가능성을 왼쪽으로 이동시킬 수 있습니다.
개발자가 새로운 소스 코드를 커밋하면, Continuous Integration 파이프라인이 SonarQube 같은 도구를 사용해 해당 코드에 대한 정적 코드 분석을 자동으로 트리거하는 것은 흔한 일입니다.
정적 코드 분석 도구는 소스 코드가 더 적은 전력을 소비하고 더 적은 탄소를 배출하도록 최적화할 기회를 식별할 수 있습니다.
이러한 도구는 동일한 컴퓨팅 작업을 더 적은 CPU 사이클로 완료하도록 코드를 변경할 것을 권장할 수 있으며, 그 결과 에너지 소비가 줄어듭니다.
예를 들어, “SELECT * FROM dbTable” 같은 SQL 쿼리는 피해야 합니다. 이런 쿼리는 데이터베이스의 모든 열에서 불필요하게 데이터를 읽기 때문입니다. 따라서 다음과 같은 문제가 발생합니다.
SonarQube 같은 정적 코드 분석 도구를 사용하고 있다면, 이미 더 친환경적인 코드를 만들고 있는 것입니다. 이 도구는 불필요한 열을 가져오는 SQL 쿼리와 같은 여러 에너지 비효율적 코딩 패턴을 인식하기 때문입니다.
그럼에도 불구하고, 친환경 정적 코드 분석에 특화된 도구를 사용하면 지속가능한 소프트웨어 개발을 한 단계 더 발전시킬 수 있습니다.
Creedengo는 Java, JavaScript, C#, PHP, Python과 같은 다양한 언어에서 에너지 비효율적인 코딩 패턴을 식별하는 무료 오픈소스 도구입니다. 이 도구는 SonarQube 플러그인으로 구성되어 있으며, SonarQube의 기본 코딩 규칙에 그린 코드에 초점을 둔 규칙을 추가합니다.
마찬가지로, CAST Highlight는 공개된 코딩 규칙 집합을 기반으로 소스 코드에서 그린 소프트웨어 결함을 찾아내는 엔터프라이즈 도구입니다. 이 규칙 집합은 COBOL, PL/1, SAP ABAP 같은 더 광범위한 프로그래밍 언어를 다룹니다.
이러한 정적 코드 분석 도구를 사용하면 개발자는 더 친환경적인 코드를 작성할 수 있고, 프로덕션에 배포하기 전에 소프트웨어 개발 생명주기 초기에 소프트웨어의 환경 영향을 줄일 수 있습니다.
오늘날 개발자는 Terraform, Ansible, AWS CloudFormation과 같은 도구를 사용해 인프라 배포를 자동화하는 코드를 작성합니다. 이는 널리 _Infrastructure as Code (IaC)_로 알려져 있습니다.
IaC의 도입 덕분에, 우리는 정적 코드 분석 도구를 사용해 인프라를 평가하고 이를 더 친환경적으로 만들어 에너지 소비를 줄이기 위한 권장사항을 제공할 수 있습니다.
예를 들어, Infracost를 CI/CD 파이프라인과 통합해 Terraform 템플릿을 개선하기 위한 권장사항을 받을 수 있습니다. Infracost는 운영 비용 절감에 초점을 맞추고 있지만, 그 권장사항 중 다수는 에너지 소비와 탄소 배출량도 함께 줄여 줍니다.
Terraform 템플릿이 AWS RDS(PostgreSQL, MySQL 같은 데이터베이스를 지원하는 관리형 데이터베이스 서비스)를 배포할 때, Infracost는 유사한 성능의 x86 기반 인스턴스보다 최대 60% 적은 에너지를 소비하고 비용도 20% 더 낮은 AWS Graviton 기반 컴퓨팅 인스턴스를 사용할 것을 자동으로 권장합니다.
마찬가지로, Terraform 템플릿이 AWS CloudWatch나 Azure Monitor 같은 관측성과 모니터링 서비스를 배포할 때, Infracost는 이들 서비스가 저장한 로그를 자동으로 삭제하도록 데이터 보존 정책을 설정할 것을 제안합니다. AWS CloudWatch의 기본 설정은 로그를 무기한 보관하는 것입니다. 이 설정을 변경하지 않으면 로그는 점점 더 많은 스토리지를 차지하게 됩니다. 따라서 이 정책은 데이터 스토리지와 관련된 에너지 소비와 탄소 배출량을 줄일 수 있습니다.
Infracost는 Terraform 템플릿에서 선호하는 클라우드 리전 사용을 강제하기 위한 사용자 정의 정책 설정을 허용합니다. 가장 친환경적인 전력으로 구동되고 운영 비용이 가장 낮은 리전에서만 클라우드 리소스를 배포하도록 허용하는 정책을 만들 수 있으며, 이를 통해 GreenOps와 FinOps를 결합할 수 있습니다.
AWS Sustainability Scanner는 유사한 도구로, AWS CloudFormation 템플릿과 AWS CDK 스택을 분석해 지속가능성 점수와 이를 개선하기 위한 권장사항을 제공합니다. 이러한 권장사항은 AWS Well-Architected Pillar for Sustainability에서 나오므로, 개발자는 AWS Sustainability Scanner를 사용해 자신의 인프라가 AWS Well-Architected Pillar for Sustainability를 얼마나 준수하는지 자동으로 점검할 수 있습니다.
예를 들어, Amazon API Gateway를 배포할 때 이 도구는 REST API에 대해 payload compression이 활성화되어 있는지 확인합니다. 이는 네트워크를 통해 전송되는 데이터를 줄이는 관행이며, 결과적으로 데이터 네트워크의 에너지 소비를 낮춥니다.
제안된 관행 중 하나 이상을 IT 인프라에 적용하면 어떤 절감 효과를 기대해야 할까요? 프로덕션에 변경 사항을 배포하기 전에 탄소 배출량 감소를 어떻게든 정량화할 수 있을까요?
Carbonifer는 Terraform 템플릿을 읽고 해당 템플릿으로 배포될 인프라의 탄소 배출량을 추정하는 명령줄 도구입니다. 현재 적극적으로 유지관리되고 있지는 않지만(마지막 커밋은 2023년), AWS와 Google Cloud의 컴퓨트 인스턴스에 대한 탄소 배출량을 계산함으로써 지속가능성을 왼쪽으로 이동시키는 훌륭한 사례를 보여 줍니다.
Infracost는 이를 한 단계 더 발전시켰습니다. 개발자가 Terraform 템플릿에 대한 변경을 커밋하면, Pull Request에 댓글을 추가해 이 변경으로 인해 탄소 배출량이 얼마나 감소했는지(또는 증가했는지)를 개발자에게 알려 줍니다.
아래 Pull Request에서 Infracost는 개발자에게 다음과 같은 힌트를 제공합니다.
이러한 도구는 IT 인프라가 배포되기 전에 개발자가 에너지 효율적이고 비용 효율적인 옵션을 식별할 수 있게 함으로써 지속가능성을 왼쪽으로 이동시킵니다.
그린 소프트웨어는 이론이 아니라, 여기서 제안한 도구들로 실천할 수 있는 것입니다. 이미 프로덕션에 배포된 소프트웨어 애플리케이션을 나중에 개조하는 대신, 개발자가 아직 조치를 취할 수 있는 시점에, 바로 CI(Continuous Integration)와 PR(Pull Request) 안에서 피드백을 제공할 수 있습니다.
개발자에게 추가적인 부담을 주는 새로운 프로세스를 도입할 필요는 없습니다.
프로젝트에 다음을 도입함으로써 소프트웨어 개발 초기에 지속가능성을 더 앞당길 수 있습니다.
면책 조항: 이 블로그에 표현된 모든 의견은 전적으로 제 개인적인 견해입니다. 특정 제품이나 도구에 대한 언급은 정보 제공 목적일 뿐이며, 언급된 공급업체와 저는 어떠한 제휴 관계도 없습니다.