ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ECS와 ECR로 배포, 생각보다 비싼 AWS와 서비스까지 못간 이유
    AWS 2024. 12. 28. 15:28

    ▤ 목차

       

      클라우드 환경에서 도커(Docker)는 애플리케이션의 배포 및 관리를 간편하게 만들어주는 강력한 도구이다.

      이번 글에서는 도커 이미지를 AWS의 ECR(Amazon Elastic Container Registry)과 ECS(Amazon Elastic Container Service)를 활용해 배포하는 과정을 정리하려고 한다.

       

       


       

      들어가기 전에 먼저 적어보는 서비스까지 못간 이유

       

      아 AWS 비용이 생각보다 많이 나왔어요!

      그래서 이게 잘 진행되지 않는다면 서버비가 장난 아니겠다-! 하는 중

      이번에 진행했던 방법이 비싸게 사용한거라는,,

      그래도 이런 방법도 있고 이런 방법으로 배포를 했다는 것을 남기려고 해요!

       

      ✔ 배포하고 에러만 잡았을 뿐인데..

      ⌨ 약 2주 정도의 기간동안

      약 2주간 사용한거라고 생각하면 정말 많이 나오지 않았나요?

      서버비용 무서워서 개발하겠나..

      근데 이 방법이 조금 규모가 큰 프로젝트에서 사용하는 방법이라고 합니다!

      그래서 남겨야겠단 생각에 프로젝트를 진행해요!

       

      🙉 사용자도 확보되지않은 상태에서 이 서비스는 너무 도박

      사용자가 확보되지 않은 상태에서 해당 서비스를 시작한다면 아마 초반 유지비용이 정말 많이 들것이다.

      당장 생각해 낸 방법이 애드센스였는데 사실 광고 클릭수로는 서버비용의 일부라고 하기도 민망한 수준일 것.

       

      그래서 이번 프로젝트를 서비스하는 것을 중단하기로 했다.

       

       

       

      이를 통해 배운점은 굉장히 많은데

       

      > 광고를 집행하려면 로그인 과정이 없어야한다. 카카오는 테스트 계정을 주면 되는데 구글은 아니기에 로그인을 빼고 광고를 받아와야한다.

      > 적어도 서버 비용을 충당할 정도의 기획이 있어야한다.

       다시말해 광고를 달거나(아마 이걸로 수익을 얻으려면 클릭을 유도해야할듯..) 광고 제거버전을 유료로 풀거나 해야한다.

       

      솔직히 프로젝트는 돈을 벌려고 시작했다기 보단 포트폴리오 채우기 + 기술 배우기가 목적이였지만

      배포를 준비하다보니 조금이라도 서비스하고 싶어지는 욕심..?이 생긴다.

      만들면서 속으로 '이걸로 돈 조금 버는 것도 좋고 서비스를 해봐도 좋고'라는 생각을 했기에 입에서 10원이라도 벌어보자!했지만 그렇게 하기엔 서비스 기획면으로 부족했다는 생각!

      >> 서비스를 할거라면 기획이 정말 중요한 것같다. (인건비는 아니더라도 서버비라도 충당될 수 있는 서비스 기획)

      >> 엎어지려니 다른 부분도 생겼는데 혹시 몰라 개인정보! 개인정보는 필요없으면 받지말자. 쇠고랑 차기 싫기에

       

       

      일단 이번 배포 과정 정리

      다음에 내가 배포할 일이 있다면 참고하자.


       

       

       

      ✔ 도커(Docker) 이미지를 ECR에 푸시하는 방법

      🤓과정 정리

      1) 도커 이미지 생성

      먼저 로컬 환경에서 도커 이미지를 생성합니다.

      bash
      코드 복사
      docker build -t [이미지_이름]:[태그] .

      2) AWS CLI 설정

      AWS CLI를 설치하고 AWS 계정을 사용해 인증합니다.

      bash
      코드 복사
      aws configure

      3) ECR 리포지토리 생성

      ECR에 이미지를 저장할 리포지토리를 생성합니다.

      bash
      코드 복사
      aws ecr create-repository --repository-name [리포지토리_이름]

      4) ECR 로그인

      AWS ECR에 도커 로그인을 수행합니다.

      bash
      코드 복사
      aws ecr get-login-password --region [리전] | docker login --username AWS --password-stdin [ECR_URL]

      5) 도커 이미지 푸시

      이미지를 태그하고 ECR로 푸시합니다.

      bash
      코드 복사
      docker tag [이미지_이름]:[태그] [ECR_URL]/[리포지토리_이름]:[태그] docker push [ECR_URL]/[리포지토리_이름]:[태그]

       

       


       

       

       

      ✔ ECR 이미지를 ECS에 배포하는 방법

      ECS를 활용하면 관리형 서비스를 통해 배포와 확장을 간편하게 할 수 있다고 한다.

      그중 비용 증가로 이어지는 것이 있는데

       

      • Fargate 모드: 서버리스로 실행되는 만큼 비용이 더 높다.
      • EC2 인스턴스 사용: 클러스터에 EC2를 연결하면 유지비가 지속적으로 발생
      • 데이터 전송 및 스토리지: ECR에서 이미지를 푸시/풀할 때 데이터 전송 비용이 발생

       

      라고 한다.

       

      🤓 과정 정리

      1) ECS 클러스터 생성

      ECS 클러스터를 생성합니다.

      bash
      코드 복사
      aws ecs create-cluster --cluster-name [클러스터_이름]

      2) ECS 작업 정의(Task Definition) 생성

      ECR에 업로드된 이미지를 기반으로 작업 정의를 만듭니다.
      작업 정의의 JSON 템플릿 예시는 다음과 같습니다:

      json
      코드 복사
      { "containerDefinitions": [ { "name": "[컨테이너_이름]", "image": "[ECR_URL]/[리포지토리_이름]:[태그]", "memory": 512, "cpu": 256, "essential": true } ], "family": "[작업_정의_이름]" }

      AWS CLI를 사용해 작업 정의를 등록합니다.

      bash
      코드 복사
      aws ecs register-task-definition --cli-input-json file://task-definition.json

      3) 서비스(Service) 생성

      작업 정의를 기반으로 ECS 서비스 생성:

      bash
      코드 복사
      aws ecs create-service \ --cluster [클러스터_이름] \ --service-name [서비스_이름] \ --task-definition [작업_정의_이름]
       
       
       

       


       

       

      ✔ CI/CD 파이프라인 설계

      깃의 메인에 푸시를 하면 자동으로 배포될 수도 있다.

      ✍️ CI/CD 파이프라인 설계

       

      1. 깃 푸시 감지: 메인 브랜치에 푸시 이벤트 발생.
      2. 도커 이미지 빌드 및 푸시: 변경된 코드로 도커 이미지를 생성하고 ECR에 업로드.
      3. ECS 업데이트: 새로운 이미지로 ECS 서비스를 자동 업데이트.

       

       

      💡GitHub Actions으로 CI/CD 설정

      1) GitHub Actions 워크플로우 파일 생성

      깃 저장소에 .github/workflows/deploy.yml 파일을 생성

       

       

      2) 워크플로우 작성

      name: Deploy to ECS
      
      on:
        push:
          branches:
            - main
      
      jobs:
        deploy:
          runs-on: ubuntu-latest
      
          steps:
          # 1. 저장소 클론
          - name: Checkout code
            uses: actions/checkout@v3
      
          # 2. AWS CLI 설정
          - name: Configure AWS credentials
            uses: aws-actions/configure-aws-credentials@v2
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              aws-region: us-east-1
      
          # 3. 도커 이미지 빌드 및 ECR 푸시
          - name: Login to Amazon ECR
            run: |
              aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin [ECR_URL]
          - name: Build and push Docker image
            run: |
              docker build -t [이미지_이름]:latest .
              docker tag [이미지_이름]:latest [ECR_URL]/[리포지토리_이름]:latest
              docker push [ECR_URL]/[리포지토리_이름]:latest
      
          # 4. ECS 서비스 업데이트
          - name: Deploy to ECS
            run: |
              aws ecs update-service \
                --cluster [클러스터_이름] \
                --service [서비스_이름] \
                --force-new-deployment

       

       

      이런식으로 사용하면 된다.

       

      💡 AWS CodePipeline 사용 (2번째 방법)

       

      AWS의 CodePipeline을 사용하면 GitHub과 연동해 자동 배포 파이프라인을 설정할 수도 있다.

      1. Source 단계: GitHub 저장소와 연결.
      2. Build 단계: CodeBuild를 사용해 도커 이미지 생성 후 ECR에 푸시.
      3. Deploy 단계: ECS를 자동 업데이트

       

      ❗ 자동 배포의 핵심 ❗
      자동 배포는 CI/CD 파이프라인 도구와 AWS 서비스의 결합으로 이루어진다.

      GitHub Actions: 깃 푸시 이벤트 감지 및 배포 자동화.
      AWS CLI: ECS와 ECR 관리함.
      모니터링: 배포 과정에서 발생할 수 있는 문제를 빠르게 대응하기 위해 CloudWatch 설정을 추가하는 것이 좋다.

       

      👏 두개의 차이점

      AWS CodePipeline: AWS에서 제공하는 CI/CD 도구로, AWS 생태계와 잘 통합됩니다.
      장점: AWS CodeBuild, ECS, ECR 등과 쉽게 연동.
      단점: GitHub Actions에 비해 설정이 복잡할 수 있고, 비용이 발생.

      GitHub Actions: GitHub에 내장된 CI/CD 도구로, 유연한 워크플로우를 구성할 수 있습니다.
      장점: GitHub와 직접 연동되어 간단하게 설정 가능.
      단점: AWS와의 통합 작업이 약간의 추가 설정을 요구.

       

      ECS는 강력하지만, 초기 개발자나 취준생에게는 비용 면에서 부담이 될 수 있다.

       

      그리고 나름 삽질을 많이한 부분인데, 고정 ip를 사지 않으면 ECS 배포할때마다 컨테이너가 새로운 프라이빗 ip를 할당받게 된다.

      즉, 연결을 모두 다 한 상태에서 깃 메인에 푸시를 하고 조금 뒤에 504가 뜰 것.

      (healthy가 계속 유지중인데 504뜰 수도 있음)

       

      이런 경우, 확인해보세요.

       

      ECS의 프라이빗 ip랑 대상그룹이 ip가 같은지 확인

       

      다르다면 프라이빗ip 복사해서 기존 대상 그룹 지우고 복사한 ip 생성하세요!!!

       

       

      이 과정이 너무 번거로워서 GPT한테도 엄청 물어봤다..

       

      고정 IP를 사용하지 않으려면,  프라이빗 IP를 대상 그룹에 추가하는 작업을 자동화하기 위해 추가적인 스크립트(예: AWS CLI 또는 SDK)를 작성하면 된다고 하는데 나는 실패했다.

       

      다음 배포하는 과정에서는 이것도 참고해서 성공하기!를 다짐해본다.

       

      😊 공부

      ECS, ECR뿐만 아니라 EC2, Lambda, RDS 등 다양한 AWS 서비스를 어느정도 이해하면 더 많은 기술을 사용할 수 있다.

      강의에서도 많이 나오지만 모두를 완벽하게 아는건 불가능.

      사용하는 것들을 위주로 공부하자.!!!

       

       

      비용 최적회의 방법? 팁이 있는데

      1. 필요할 때만 클러스터 활성화
      2. 스팟 인스턴스 활용
      3. 클라우드 사용량 모니터링
        • AWS Cost Explorer나 Billing Dashboard를 사용

       

      더보기

      백에서 로그보는 곳

      CloudWatch

       

       

      이미지와 같이 저장소 S3

       

      과정 치고는 엄청 압축해서 적어봤다!

    Designed by Tistory.