왁자지껄 디프만과 함께하는 첫 NCP 후기

yb__char·2024년 1월 28일
0

디프만 14기

목록 보기
3/5
post-thumbnail

NCP(Naver Cloud Platform)란?

NCP(Naver Cloud Platform)은 국내에서 운영되는 네이버의 클라우드 기반으로 한 인프라 제공 서비스이다. 타 클라우드 인프라 제공 서비스(AWS, GCP)에 비해 한국에서 하는 플랫폼이기에 언어는 한국어이고, 타사들과 비교했을 때 접근성이 가장 좋았다는 느낌을 받았다.

시작해볼까?

이번 디프만 14기에서 10MM 이라는 프로젝트로 하루 10분을 활용한 습관 형성 챌린지 서비스를 개발하는 중인데, 디프만에서 야무지게 NCP 20만 크레딧을 제공해주어 서버 비용을 아낄 수 있었고, NCP를 사용한 경험이 없었기에 첫 도전이다.

Github 링크

앱 링크


일단 10MM에서 사용되는 1차 MVP 아키텍처는 아래와 같다.

Git Action을 사용하면서 모든 컨테이너 관리 및 서버 관리를 NCP Container Registry를 통해서 이루어져 있고, Content 관리는 Object Storage, DB는 MySQL인 관계형 DB, In-Memory 방식을 사용하는 Redis, 캐싱을 위한 CDN, Load Balancer 등 다양한 서비스를 활용했다.
지금까지는 대형 클라우드 사인 AWS와 비교했을때 큰 거리낌이 없었고, 역시 국내 사이기에 쉽게 이해가 빠르게 되었다.

콘솔에 접속하고, 서비스 대시보드를 확인하면 이와 같이 서비스들이 나열되어 있었다.
나는 AWS를 주로 사용했었기에 익숙한 네이밍들과 사용법들이 비슷한 서비스들이 많아 빠르게 빌드할 수 있는 장점이 있었다.


대표적인 서비스 소개

1. Server

서비스를 시작하면 우선 Server가 당연시 존재해야 하고, 아마 서버 구성하려면 우선적으로 생성할 것이다. 타사 클라우드 플랫폼과 비교했을 때 NCP 서버에서도 사양을 직접 커스텀하고, 스토리지, 다양하게 접목시킬 수 있는 사항들이 많았다. 또한 수집되는 데이터를 기반으로 CPU, 메모리 그래프를 확인할 수 있고, 외부에서 클라우드 서버로 접속하기 위한 포드 포워딩 설정 또한 가능하다.

2. Object Storage

Object Storage는 A사의 S3라는 스토리지를 대신할 수 있는 서비스이다.
우리 서비스에서 Object Storage 활용 용도는 이미지나 동영상을 저장하는 Content 스토리지와 위 아키텍처에 도식화되어 있는 Container Registry를 활용해 도커 컨테이너 이미지를 관리하는 용도로 사용하였다.
그리고 추가로 Amazon S3와 호환되는 API를 제공하여 S3를 지원하는 다양한 사용자 도구를 이용해 Object Storage의 데이터 관리에 용이하게 접할 수 있다.

우리 서비스에서도 MultiPart로 직접 접근하지 않기 위해 PresignedUrl를 활용하였다. 추가로 Storage 접근을 위한 CORS도 제어할 수 있다. Object Storage CORS 제어 히스토리를 작성한 내용도 있으니 참고 바랍니다.

3. Container Registry

Container Registry는 별도의 DockerHub 없이 사용하는 도커 컨테이너 이미지 저장소로 컨테이너 이미지를 손쉽게 저장, 관리 및 배포가 가능하다.

      # NCP Container Registry 로그인
      - name: Login to NCP Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ secrets.NCP_CONTAINER_REGISTRY }}
          username: ${{ secrets.NCP_ACCESS_KEY }}
          password: ${{ secrets.NCP_SECRET_KEY }}

      # Docker 이미지 빌드 및 푸시
      - name: Docker Build and Push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ secrets.NCP_CONTAINER_REGISTRY }}/server-spring:${{ steps.image-tag.outputs.value }}

      # 서버로 docker-compose 파일 전송
      - name: copy source via ssh key
        uses: burnett01/rsync-deployments@4.1
        with:
          switches: -avzr --delete
          remote_host: ${{ secrets.NCP_HOST }}
          remote_user: ${{ secrets.NCP_USERNAME }}
          remote_port: ${{ secrets.NCP_PORT }}
          remote_key: ${{ secrets.NCP_PRIVATE_KEY }}
          path: docker-compose.yaml
          remote_path: ${{ secrets.REMOTE_PATH }}
          
      - name: Deploy to NCP Server
        uses: appleboy/ssh-action@master
        env:
          NCP_CONTAINER_REGISTRY: ${{ secrets.NCP_CONTAINER_REGISTRY }}
          NCP_IMAGE_TAG: ${{ needs.build.outputs.image-tag }}
        with:
          host: ${{ secrets.NCP_HOST }}
          username: ${{ secrets.NCP_USERNAME }}
          key: ${{ secrets.NCP_PRIVATE_KEY }}
          port: ${{ secrets.NCP_PORT }}
          envs: NCP_CONTAINER_REGISTRY,NCP_IMAGE_TAG  # docker-compose.yml 에서 사용할 환경 변수
          script: |
            echo "${{ secrets.NCP_SECRET_KEY }}" | docker login -u "${{ secrets.NCP_ACCESS_KEY }}" --password-stdin "${{ secrets.NCP_CONTAINER_REGISTRY }}"
            docker pull ${{ secrets.NCP_CONTAINER_REGISTRY }}/server-spring:${{ env.NCP_IMAGE_TAG }}
            SWAGGER_VERSION=${{ env.NCP_IMAGE_TAG }}
            sed -i "s/SWAGGER_VERSION=.*/SWAGGER_VERSION=$SWAGGER_VERSION/" .env
            docker compose -f ${{ secrets.COMPOSE_YAML_PATH }} up -d
            docker image prune -a -f

위 스크립트는 CI/CD를 위한 스크립트를 일부 발췌해왔다. 일단 이 스크립트를 작성하기 위해 노력하신 샤라웃 도모, 유우비트 고생많았어용 👏👏
CI 과정에서 빌드해서 이미지를 Container Registry에 push 한 후에 Deploy 할 때, docker pull 명령어로 경로에서 땡겨 사용했다.
appleboy/ssh-action@master로 NCP ssh에 접속해서 Container에 존재하는 이미지를 Pull하여 빌드해서 올리는 작업을 진행하였다.


디프만에서는 NCP 크레딧을 받는다고?

그러하다. 초기 구성하기 전부터 크레딧을 신청하여 지원받아 바로 Server 구성에 매진하였고 여러 가지 서비스를 설계하면서 시행착오도 있었지만, 든든한 디프만이 비용을 지원해줘 다양한 시도를 할 수 있었던 계기가 되었다.
현재 상용 배포까지 이루고 Global Edge, Load Balancer 등 다양한 서비스를 접목하여 아무래도 비용이 많이 나오긴했다만, 추가 요청해서 70만 크레딧을 지원받아 아직 시도해보지 못한 기술적요소를 해결하고자 한다. (현재 서버도 초기 세팅이기에 HDD, RAM 메모리가 부족한 것도 부정못함...)


Ncloud 사용 중 특히 만족했던 점과, 아쉬웠던 점은 무엇인가요?

만족했던 점은 확실히 접근성을 위한 러닝커브가 짧았다. AWS의 점유율이 높았고, 나 또한 AWS를 주로 사용하는 사용자였기에 NCP를 사용하면서 엄청난 허들이 있었지는 않았다. 그리고 Global Edge나 서버 구성하는 데에 편한 느낌을 받았다.

아쉬웠던 점은 간혹 NCP 내에서 인증서를 발급받고 리스트에 종종 안보이는 현상이나 서버 및 서비스에 대한 Object 생성 시간이 조금 느린 이슈가 있어서 아쉬웠다. 또한 AWS와 비교했을때, VPC 기반이 아님에도 비용이 생각보다 높게 책정되어서 이번 70만 크레딧을 꼭 요청하여 든든하게 운영을 계획하고 있다.


향후 계획

앞으로 서비스 운영의 방향성에 따라 다르겠지만, 그래도 아직 전체적으로 만족한 느낌을 받아 70만 크레딧을 지원받고 보다 최적화된 고도화를 진행하면서 앞으로도 NCP을 사용할 지 내부적으로 의논을 해야할 거 같다. UI/UX에서 조금 버벅이거나 만족하지 못한 사항도 있었지만 AWS와 비교했을땐 필요한 서비스는 다 존재하였고 공식 문서도 잘 적혀져 있다는 느낌받아 향후 몇개월은 NCP로 지속해도 괜찮다생각한다.

profile
안녕하세요 백엔드 개발자 차윤범입니다 :)

0개의 댓글