-
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 configure3) 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.json3) 서비스(Service) 생성
작업 정의를 기반으로 ECS 서비스 생성:
bash코드 복사aws ecs create-service \ --cluster [클러스터_이름] \ --service-name [서비스_이름] \ --task-definition [작업_정의_이름]
✔ 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
과정 치고는 엄청 압축해서 적어봤다!
'AWS' 카테고리의 다른 글
(route 53) 도메인 구매 및 ssl 인증서 받고 연결하기+한글 도메인 (1) 2024.12.13 https://example.com/ 이 실제로 있네?! (0) 2024.12.04 포트란? (쉽게 설명, 쉽게 비유) (1) 2024.11.30