ECS와 ECR로 배포, 생각보다 비싼 AWS와 서비스까지 못간 이유
▤ 목차
클라우드 환경에서 도커(Docker)는 애플리케이션의 배포 및 관리를 간편하게 만들어주는 강력한 도구이다.
이번 글에서는 도커 이미지를 AWS의 ECR(Amazon Elastic Container Registry)과 ECS(Amazon Elastic Container Service)를 활용해 배포하는 과정을 정리하려고 한다.
들어가기 전에 먼저 적어보는 서비스까지 못간 이유
아 AWS 비용이 생각보다 많이 나왔어요!
그래서 이게 잘 진행되지 않는다면 서버비가 장난 아니겠다-! 하는 중
이번에 진행했던 방법이 비싸게 사용한거라는,,
그래도 이런 방법도 있고 이런 방법으로 배포를 했다는 것을 남기려고 해요!
✔ 배포하고 에러만 잡았을 뿐인데..
⌨ 약 2주 정도의 기간동안
약 2주간 사용한거라고 생각하면 정말 많이 나오지 않았나요?
서버비용 무서워서 개발하겠나..
근데 이 방법이 조금 규모가 큰 프로젝트에서 사용하는 방법이라고 합니다!
그래서 남겨야겠단 생각에 프로젝트를 진행해요!
🙉 사용자도 확보되지않은 상태에서 이 서비스는 너무 도박
사용자가 확보되지 않은 상태에서 해당 서비스를 시작한다면 아마 초반 유지비용이 정말 많이 들것이다.
당장 생각해 낸 방법이 애드센스였는데 사실 광고 클릭수로는 서버비용의 일부라고 하기도 민망한 수준일 것.
그래서 이번 프로젝트를 서비스하는 것을 중단하기로 했다.
이를 통해 배운점은 굉장히 많은데
> 광고를 집행하려면 로그인 과정이 없어야한다. 카카오는 테스트 계정을 주면 되는데 구글은 아니기에 로그인을 빼고 광고를 받아와야한다.
> 적어도 서버 비용을 충당할 정도의 기획이 있어야한다.
다시말해 광고를 달거나(아마 이걸로 수익을 얻으려면 클릭을 유도해야할듯..) 광고 제거버전을 유료로 풀거나 해야한다.
솔직히 프로젝트는 돈을 벌려고 시작했다기 보단 포트폴리오 채우기 + 기술 배우기가 목적이였지만
배포를 준비하다보니 조금이라도 서비스하고 싶어지는 욕심..?이 생긴다.
만들면서 속으로 '이걸로 돈 조금 버는 것도 좋고 서비스를 해봐도 좋고'라는 생각을 했기에 입에서 10원이라도 벌어보자!했지만 그렇게 하기엔 서비스 기획면으로 부족했다는 생각!
>> 서비스를 할거라면 기획이 정말 중요한 것같다. (인건비는 아니더라도 서버비라도 충당될 수 있는 서비스 기획)
>> 엎어지려니 다른 부분도 생겼는데 혹시 몰라 개인정보! 개인정보는 필요없으면 받지말자. 쇠고랑 차기 싫기에
일단 이번 배포 과정 정리
다음에 내가 배포할 일이 있다면 참고하자.
✔ 도커(Docker) 이미지를 ECR에 푸시하는 방법
🤓과정 정리
1) 도커 이미지 생성
먼저 로컬 환경에서 도커 이미지를 생성합니다.
2) AWS CLI 설정
AWS CLI를 설치하고 AWS 계정을 사용해 인증합니다.
3) ECR 리포지토리 생성
ECR에 이미지를 저장할 리포지토리를 생성합니다.
4) ECR 로그인
AWS ECR에 도커 로그인을 수행합니다.
5) 도커 이미지 푸시
이미지를 태그하고 ECR로 푸시합니다.
✔ ECR 이미지를 ECS에 배포하는 방법
ECS를 활용하면 관리형 서비스를 통해 배포와 확장을 간편하게 할 수 있다고 한다.
그중 비용 증가로 이어지는 것이 있는데
- Fargate 모드: 서버리스로 실행되는 만큼 비용이 더 높다.
- EC2 인스턴스 사용: 클러스터에 EC2를 연결하면 유지비가 지속적으로 발생
- 데이터 전송 및 스토리지: ECR에서 이미지를 푸시/풀할 때 데이터 전송 비용이 발생
라고 한다.
🤓 과정 정리
1) ECS 클러스터 생성
ECS 클러스터를 생성합니다.
2) ECS 작업 정의(Task Definition) 생성
ECR에 업로드된 이미지를 기반으로 작업 정의를 만듭니다.
작업 정의의 JSON 템플릿 예시는 다음과 같습니다:
AWS CLI를 사용해 작업 정의를 등록합니다.
3) 서비스(Service) 생성
작업 정의를 기반으로 ECS 서비스 생성:
✔ CI/CD 파이프라인 설계
깃의 메인에 푸시를 하면 자동으로 배포될 수도 있다.
✍️ CI/CD 파이프라인 설계
- 깃 푸시 감지: 메인 브랜치에 푸시 이벤트 발생.
- 도커 이미지 빌드 및 푸시: 변경된 코드로 도커 이미지를 생성하고 ECR에 업로드.
- 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과 연동해 자동 배포 파이프라인을 설정할 수도 있다.
- Source 단계: GitHub 저장소와 연결.
- Build 단계: CodeBuild를 사용해 도커 이미지 생성 후 ECR에 푸시.
- 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 서비스를 어느정도 이해하면 더 많은 기술을 사용할 수 있다.
강의에서도 많이 나오지만 모두를 완벽하게 아는건 불가능.
사용하는 것들을 위주로 공부하자.!!!
비용 최적회의 방법? 팁이 있는데
- 필요할 때만 클러스터 활성화
- 스팟 인스턴스 활용
- 클라우드 사용량 모니터링
- AWS Cost Explorer나 Billing Dashboard를 사용
백에서 로그보는 곳
CloudWatch
이미지와 같이 저장소 S3
과정 치고는 엄청 압축해서 적어봤다!