AWS

ECS와 ECR로 배포, 생각보다 비싼 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

     

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