[cubeTalk] 배포환경 구축하기 ecs on ec2 - 1. ECR 이미지 push

binda·2024년 9월 16일

프로젝트 정리

목록 보기
7/9

지난 포스팅에서는 ecs on fargate 를 쓰고자 하려했으나, fargate의 가장 큰 강점이라고 생각했던 Auto Scaling이 실제로는 잘 이루어지지 않을 수도 있으며, 무엇보다 ec2서버보다 비용이 2~3배 정도 높다보니, 다시 한 번 고민하게 되었다.

👉 fargate 에서 리소스의 배치 방식
Fargate는 EC2 인스턴스와 달리 서버나 호스트 기반의 리소스 관리가 없다.
즉, Fargate는 AWS가 제공하는 리소스 풀에서 태스크 단위로 CPU와 메모리 리소스를 할당하여 실행하는 구조이다.

각 태스크는 독립적인 컨테이너로 배포되며, 필요할 때마다 CPU와 메모리가 할당된다.
각 태스크는 지정된 리소스만큼의 CPU와 메모리를 독립적으로 소비한다.

즉, 태스크에서 실제로 필요한 리소스보다 더 많은 양의 리소스를 할당받아도 나머지 리소스는 사용되지 않고 낭비될 수 있는데, 이때 스케일 인 작업이 평균 15분정도 걸린다는 문제가 발생할 수도 있다는 것이다.

때문에 태스크의 리소스 사용량을 직접 제어하는 EC2 기반 ECS를 사용하여 비용과 리소스를 최적화하고자 한다!


Amazon ECS는 작업 정의에 Docker 이미지를 사용하여 컨테이너를 시작

해당 docker 이미지를 Amazon ECS 작업 정의에 사용하기 위해 컨테이너 레지스트리인 Amazon ECR에 푸시를 해야한다.

현재 docker compose 파일이 이미 생성이 되었기 때문에, ECR에 푸시를 하면된다.

0️⃣ spring boot docker compose를 활용한 컨테이너화


AWS 공식문서를 참고했다.
ECR 설정
1️⃣ 1. 해당 도커 이미지를 ECR에 푸시
이미지를 보관할 리포지토리를 먼저 생성해야한다.
먼저, AWS CLI를 설치를 진행했다.

brew install awscli

버전확인

aws --version

2️⃣ CLI에 로그인

aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.region.amazonaws.com

region은 서울로 설정했기 때문에 나는 ap-northeast-2 로 설정을 했다.
aws_account_id는 계정ID 숫자를 적용하면 된다.

권한이 없다는 에러가 뜨면 aws의 IAM정책 -> 사용자 -> 사용자 생성 -> 엑세스 키 생성

과정을 거쳐 엑세스 키와 시크릿 키를 발급 후

aws configuration

명령어를 통해 발급받은 엑세스 키와 시크릿키를 설정하여 재로그인 하면 된다.

만약! 그래도 AccessDeniedException 문제가 발생한다면
사용자 -> 권한 -> 권한정책 -> 정책직접연결
아래의 권한을 검색해서 추가해주면 된다.
AmazonEC2ContainerRegistryFullAccess 전체 ECR 접근 권한을 부여
AmazonEC2ContainerRegistryPowerUser 제한된 ECR 권한(이미지 푸시, 가져오기 가능)을 부여

후에 다시 재로그인을 하면

Login Succeeded

을 볼 수 있다.

3️⃣ 리포지토리 생성

aws ecr create-repository \
    --repository-name <hello-repository> \
    --region <region>

4️⃣ Amazon ECR에 이미지에 태그를 지정하고 푸시
푸시할 이미지 나열

docker images

저장소에 푸시할 이미지에 태그를 지정

docker tag <hello-world:latest> <aws_account_id>.dkr.ecr.region.amazonaws.com/<hello-repository:latest>

이미지 push

docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<hello-repository:latest>

성공하면 아래처럼 뜨는 것을 확인할 수 있다.

The push refers to a repository [<aws_account_id>.dkr.ecr.<region>.amazonaws.com/<hello-repository>] (len: 1)
e9ae3c220b23: Pushed
a6785352b25c: Pushed
0998bf8fb9e9: Pushed
0a85502c06c9: Pushed
latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636EXAMPLE size: 6774

그외

5️⃣ ECR에서 이미지 가져오기

docker pull <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<hello-repository:latest>

6️⃣ 이미지 삭제

aws ecr batch-delete-image \
      --repository-name <hello-repository> \
      --image-ids imageTag=<latest> \
      --region <region>

7️⃣ 리포지토리 삭제

aws ecr delete-repository \
      --repository-name <hello-repository> \
      --force \
      --region <region>

✍️ 다음포스팅
: ECS 클러스터 생성 (EC2 기반)


ecs 비용 최적화

Amazon ECR 설정

profile
🍤

0개의 댓글