ECS
ECS.. 처음에 혼자 구축하다보면 절망하는 순간을 많이 만나게됩니다.
저도 실제로 2번 새로 구축해봤는데, 매번 할 때마다 순서, 방법 등 다 까먹게 되더라구요.
그래서 프로젝트에 했던 배포 계정 말고, 완전 새로운 계정으로 다시 해봤습니다.
저도 나중에 ECS 를 구축할 상황이 올 수도 있고 ECS를 처음 배포하시는 분들도 있을텐데 제 글들이 도움이 됐으면 좋겠습니다~~!!
혹시나 궁금한 점 있으시면 댓글이나 toychip7@gmail.com으로 메일 주세요!
ECS 기본 개념
Amazon ECS(Elastic Container Service)는 컨테이너 관리 서비스를 제공하여 애플리케이션을 쉽게 배포하고 확장할 수 있도록 합니다.
ECS의 주요 구성 요소인 Cluster, Service, Task의 차이를 이해하는 것이 중요해요.
- Cluster: 여러 개의 서비스가 실행되는 컨테이너 인스턴스 집합입니다.
- Service: 동일한 Task를 실행하는 컨테이너 집합입니다. Service는 대상 그룹과 로드 밸런서를 정의하여 트래픽을 분산시킵니다.
- Task: 실행 가능한 컨테이너 정의의 집합입니다. 편의상 논리적인 컴퓨터 1개라고 생각하시면 편해요.
Fargate VS EC2
EC2는 다소 복잡하고, 시간 단위로 청구되기에 Fargate로 서버리스 방식으로 사용한 만큼만 지불하는 방식을 선택하겠습니다.
각각의 특징은 아래와 같아요.
특징 | ECS on Fargate | ECS on EC2 |
관리형 인프라 | 예 | 아니오 |
비용 모델 | 사용한 리소스 기반 청구 | 인스턴스 시간 단위 청구 |
확장성 | 자동 | 수동 |
커스터마이제이션 | 제한적 | 광범위한 커스터마이제이션 가능 |
보안 | AWS 관리형 보안 설정 | 사용자 정의 보안 설정 가능 |
시작 용이성 | 간단 | 복잡 |
ECS 클러스터 생성
ECR
ECR이란?
Elastic Container Registry의 약자로, AWS에서 컨테이너로 된 이미지를 저장하는 공간을 말해요.
저희는 최종적으로 Docker로 build한 이미지를 실행시키는 ECS를 사용할 것이기 때문에, ECR에 배포합니다.
ECR (Elastic Container Registry) 생성
ECS를 구축하기 위해선 많은 단계를 거쳐야 합니다.
먼저 컨테이너 이미지를 저장할 ECR을 설정해야 해요.
ECR + CLI + IAM Role 생성
GitHub Actions를 사용하여 특정 시점에 JAR 파일을 Docker 이미지로 빌드하고, ECR에 푸시합니다.
이를 위해 ECR에 이미지를 푸시할 수 있는 자격 증명을 만들어 GitHub Actions에 적용해요.
ECR 생성
ECR 생성은 매우 간단합니다.
우리는 비공개 이미지를 생성할 것이므로 'private'을 선택하고 리포지토리 이름을 설정한 후 기본 값으로 생성해요.
그 후 생성한 리포지토리에서 푸시 명령 보기를 클릭합니다.
프라이빗 리포지토리이기때문에 본 리포지토리에 전송할 자격증명 CLI를 생성해야 해요.
IAM
자격증명 Policies(정책) 생성
Private Image를 푸시하기 위한 자격증명 생성 명세서입니다.
https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/image-push-iam.html
위 링크에 들어가 모든 리포지토리가 아닌 특정 리포지토리에만 푸시할 수 있는 자격 증명을 생성해야 해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:CompleteLayerUpload",
"ecr:UploadLayerPart",
"ecr:InitiateLayerUpload",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage"
],
"Resource": "arn:aws:ecr:region:111122223333:repository/repository-name"
},
{
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
}
]
}
이제 위를 복사하여 IAM을 설정해야 합니다.
IAM 유저 설정
우리만의 특정 repository에 전송하기 위한 정책을 직접 정의하는 것이기 때문에 IAM 사용자, 역할이 아닌 우선 정책을 직접 정의해줘야 해요.
IAM > 정책 > 정책 생성
region은 현재 서울의 region인 ap-northeast-2, 숫자 부분에는 ECR에 있는 주소와 리포지토리 이름을 그대로 갖고 와야 합니다.
저의 계정은 8517~ 로 시작해요.
정책 생성 후 유저를 생성하여 연결해주어야 합니다.
아래와 같이 방금 만든 정책을 연결하여 ECR에 push 할 수 있는 유저를 생성해요.
그리고 해당 유저임을 증명시켜 주는 키를 생성하여야 합니다.
먼저, 키를 운영체제에 맞게 인증할 수 있도록 AWS CLI를 설치해서 키를 등록해요.
CLI 설치
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html
위 가이드 그대로 따라 하면 쉽게 AWS CLI를 설치할 수 있습니다.
이제 CLI에 키로 로그인하기 위해 액세스 키를 생성해야 해요.
IAM 유저의 액세스 키 생성
ECR 자격증명을 가진 유저의 액세스 키 생성
CLI 선택
아래와 같이 액세스 키를 생성합니다.
생성한 후에는 다시는 보이지 않기 때문에 잘 저장해둬야 해요.
이제 생성한 키로 CLI에 등록합니다.
CLI에 해당 유저 로그인
aws configure를 입력하여 키를 등록해요.
ECR 푸시
이제 ECR에 이미지를 푸시할 준비가 되었습니다.
ECR 푸시 명령어 모음을 따라 순서대로 이미지를 빌드하고 태그를 달아 ECR에 푸시해요.
아주 간단한 api 2개를 만들어 배포해보겠습니다.
Task Definition을 생성
ECR에 이미지를 푸시한 후, 이제 Task Definition을 생성하여 이를 ECS에서 사용할 수 있도록 설정해 보겠습니다.
Task Definition은 ECS에서 컨테이너를 실행하는 데 필요한 구성 요소들을 정의하는 역할을 해요.
방금 만든 Java로 Build 한 DockerFile로 Task에 지속적 배포를 하기 위해 Task Definition을 생성해 봅시다.
Task Definition을 생성 단계
그 후 ECS > Task > Task Definition
가장 중요한 태스크 크기가 실제 지불할 서버 비용과 가장 관련 있으므로 사용할 만큼만 사용해야겠죠?
태스크 실행 역할은 AWS에서 이미 ECS에 태스크를 실행할 Role을 만들어놨기 때문에 그대로 사용하면 됩니다.
아래 컨테이너에 대한 정보를 적으면 되요.
컨테이너 이름, ECR URL + 버전, 그리고 아래에 포트 매핑에 오픈할 매핑 포트를 열어줍니다.
여기서 주의할 점은, 태스크 정의 패밀리 이름에 공백을 사용하면 안 되는데, 한 번 공백을 써버리면 하위에 로그 경로를 설정할 때 그대로 공백으로 들어가 생성 자체가 안되기 때문에, 공백은 생각도 하지 말아야 해요.
또한 ECS는 로그가 자동으로 켜지는 걸 그대로 두어야 하고 이를 제거할 시 오류가 발생합니다.
포트 매핑입니다. 이미지로 띄운 컨테이너의 포트 번호를 8080으로 설정했어요.
컨테이너 세부 정보와 이미지 URI, 포트매핑을 진행합니다.
이번 글에서는 이 모든 과정을 수동으로 했지만, GitHub Action을 사용하면 이 모든 플로우를 트리거를 통해 무중단으로 배포하도록 할 수 있겠죠?
다음 글에선 https를 설정하기 위한 인증서와, 도메인 구입을 진행해보겠습니다.
'Infra > AWS' 카테고리의 다른 글
AWS ECS 무중단 CI/CD Pipeline 5. GitHub Action CI/CD Pipeline 구축 (0) | 2024.02.05 |
---|---|
AWS ECS 무중단 CI/CD Pipeline 4. ECS Service 배포, HTTP Redirect (0) | 2024.02.05 |
AWS ECS 무중단 CI/CD Pipeline 3. 로드밸런서와 리스너, 대상그룹 (0) | 2024.02.05 |
AWS ECS 무중단 CI/CD Pipeline 2. Route 53 & ACM 🔥😡🔥 (0) | 2024.02.04 |
AWS ECS 무중단 CI/CD Pipeline 0. ECS 배포하게 된 배경 (0) | 2024.02.03 |