Harbor(Private Container Registry)와 ECR 연동 및 LifeCycle 정책 관리하기

Paul
Spoon Radio
Published in
8 min readMar 27, 2024
Photo by Bernd 📷 Dittrich on Unsplash

안녕하세요 스푼라디오에서 SRE 팀에서 DevOps업무를 담당하고 있는 Paul(백영진)이라고 합니다. AWS EKS에 배포를 위한 Docker 이미지를 저장하기 위한 컨테이너 저장소를 구성합니다. 일반적으로 Docker Hub, AWS ECR(Elastic Container Registry), Google Container Registry, 또는 Private Container Registry(Harbor) 등의 옵션을 사용하여 구성할 수 있습니다.

스푼라디오에서는 Public Docker 이미지인 경우는 Docker Hub 에 저장을 하고, 내부 서비스의 경우는 Private Container Registry (Harbor)와 ECR(Elastic Container Registry) 에 도커 이미지를 저장하고 있습니다.

1. Docker Container Registry 환경 구성

Harbor는 CNCF(클라우드 네이티브 컴퓨팅 재단)의 프로젝트 중 하나로, 자체 호스팅형 Docker 이미지 레지스트리 및 공유 서비스입니다. 이는 Docker Registry를 기반으로 하며 보안, 정책, 복제, 이미지 취약점 스캔 등을 포함한 다양한 기능을 제공합니다. AWS ECR은 Amazon Web Services(AWS)에서 제공하는 관리형 Docker 컨테이너 레지스트리입니다. 이들은 모두 컨테이너 이미지를 저장하기 위한 서비스로 볼 수 있습니다.

1.1 AWS ECR 통한 Container Registry 구성

AWS ECR 통한 Container Registry 구성

AWS ECR을 사용하여 컨테이너 저장소를 설정하면 Bitbucket Pipeline을 통해 Docker 빌드로 생성된 이미지를 AWS OpenID Connect(OIDC) 자격 증명을 사용하여 AWS ECR에 푸시할 수 있습니다. 이후, AWS ECR Replication 기능을 통해 도커 이미지를 다른 리전으로 복제할 수 있습니다. 그리고 사용자는 AWS IAM 역할을 통해 권한을 부여하거나, IAM 역할을 Okta 또는 기타 인증 시스템을 통해 접근할 수 있습니다. 하지만 매번 AWS ECR 로그인을 해야 하는 불편한 부분이 있습니다.

1.2 Harbor와 AWS ECR 통한 Container Registry 구성

Harbor & AWS ECR 통한 Container Registry 구성

Private Container Registry 환경을 구성을 위하여 Harbor를 구성하였습니다. Harbor는 사용자를 인증하고 사용자 계정을 관리하기 위한 다양한 모드를 지원합니다. (데이터베이스 인증, LDAP/Active Direcotry, OIDC Provider) 사용자 계정별 인증 토큰을 통해서 Bitbucket Pipeline 또는 오피스에서 도커 이미지를 Harbor에 Push/Pull 할 수 있습니다.

또한 도커 이미지를 Harbor가 아닌 다양한 도커 레지스트리(Docker Hub, Azure ACR, AWS ECR, etc)로 이미지를 복제할 수 있는 기능을 제공합니다.

2. Container Image LifeCycle 구성

스푼라디오 서비스는 Multi-Account, Multi-Region 의 환경으로 구성이 되었습니다. 따라서 도커 이미지를 AWS ECR에 저장하기 위해서는 Multi-Account, Multi-Region 환경을 고려하여 구성을 했습니다.

Multi-Account & Multi-Region 환경에서의 ECR 구성

도커 이미지는 여러 지역(한국, 일본, 캘리포니아 등)에 위치한 AWS ECR 저장소에 복제됩니다. 이로 인해 각 서비스 계정의 EKS에서 도커 이미지를 AWS ECR로부터 다운로드할 때, 동일한 지역 내에 있기 때문에 다운로드 속도가 향상됩니다. 또한, 특정 지역에서 장애가 발생해도, 다른 지역의 도커 이미지를 이용할 수 있어 높은 가용성을 보장합니다. 하지만, 이 과정에서 중복된 도커 이미지 저장소를 관리하며, 각 저장소에 대한 라이프 사이클 정책과 권한 설정이 필요합니다.

Steampipe 통한 AWS ECR 저장소 대시보드

Harbor에서 다수의 프로젝트(도커 레파지토리)는 도커 이미지 관리를 하기 위한 정책을 설정할 수 있고 Harbor Replication 된 도커 레지스트리에 대해서도 이미지 삭제를 함께 할 수 있는 기능을 제공합니다.하지만 AWS ECR의 Replication 기능에서는 ECR 정책 & 권한 설정이 함께 Replication이 되지 않습니다. 따라서 Replication이 설정된 모든 AWS ECR 저장소에 정책 및 권한설정을 수동으로 설정을 해야하는 불편한 점이 있습니다.

따라서 신규 ECR 저장소가 생성될 경우 각 Region 별 신규 ECR저장소에 대한 라이프 사이클 정책과 권한 설정을 해야 했으며, 처음에는 ECR 저장소가 몇개 없을 때는 문제가 없었으나, ECR 저장소가 늘어날 수록 반복적인 작업을 계속 해야 했습니다.

3. Harbor WebHook 통한 AWS ECR Policy 설정

신규 ECR 저장소가 생성될 경우 각 Region 별 신규 ECR저장소에 대한 라이프 사이클 정책과 권한 설정을 자동화 하기 위해서 Harbor의 프로젝트에서 웹훅 엔드포인트로의 연결을 구성할 수 있습니다. 웹후크를 구성하면 Harbor는 프로젝트에서 발생하는 특정 이벤트를 웹후크 엔드포인트에 알립니다. 웹후크를 사용하면 Harbor를 다른 도구와 통합하여 지속적인 통합 및 개발 프로세스를 간소화할 수 있습니다.

Configure Webhook Notifications

웹훅 알림은 JSON 형식으로 전달됩니다. 다음 예에서는 푸시 이미지 이벤트에 대한 JSON 알림을 보여줍니다. JSON 알림 정보를 통해서 AWS ECR에 라이프 사이클 정책 및 권한 설정하도록 구성을 할 수 있습니다.

{
"event_type": "pushImage",
"events": [
{
"project": "prj",
"repo_name": "repo1",
"tag": "latest",
"full_name": "prj/repo1",
"trigger_time": 158322233213,
"image_id": "9e2c9d5f44efbb6ee83aecd17a120c....",
"project_type": "Private"
}
]
}

마무리하며

Multi-Account 및 Multi-Region 환경에서 AWS Elastic Container Registry(ECR)의 구성 방법과 라이프 사이클 정책 및 권한 설정의 자동화에 대해 알아봤습니다. AWS ECR 리소스 관리에 대해 일반적으로 큰 관심을 가지지 않는 경우가 많습니다. 실제로 Steampipe 시스템을 도입하기 전까지 저희 팀도 AWS ECR을 비효율적으로 사용하고 있다는 사실을 인지하지 못했습니다. 다행스럽게도, 이번 조사를 통해 불필요한 AWS ECR 리소스를 정리하고, ECR 저장소에 대한 라이프 사이클 정책을 적용함으로써 리소스 관리를 보다 효율적으로 할 수 있게 되었습니다.

참고사이트

--

--