-
1. AWS ECS(Elastic Container Service)
-
2. ECS 주요 구성 요소
-
2 - 1. ECS Cluster
-
2 - 2. ECR(Elastic Container Registry)
-
2 - 3. ECS Task
-
2 - 4. Service
-
3. 실습
-
4. Spring 프로젝트
-
4 - 1. Gitlab 프로젝트
-
5. AWS 보안 그룹
-
5 - 1. 보안 그룹 인바운드 규칙 편집
-
6. AWS ECR
-
7. AWS ECS
-
7 - 1. Cluster 생성
-
7 - 2. Task Definition
-
7 - 3. Service 생성
-
8. Port 짚고 넘어가기
-
8 - 1. Spring Project (8080)
-
8 - 2. Task Definition (8080)
-
8 - 3. Service (80)
-
8 - 4. 트래픽 흐름
-
9. AWS IAM
-
9 - 1. 권한 설정
-
9 - 2. 엑세스 키
-
10. Gitlab ci 파일 작성
-
-
10 - 1. ACCESS_KEY 세팅
-
10 - 2. .gitlab-ci.yml 파일 생성
-
10 - 2. Gitlab 파이프라인 확인
-
11. 확인하기
1. AWS ECS(Elastic Container Service)
ECS는 컨테이너화된 애플리케이션을 쉽게 배포, 관리 및 확장할 수 있도록 해주는 완전관리형 컨테이너 오케스트레이션 서비스이다. 컨테이너 오케스트레이션 서비스로 유명한 게 k8s(Kubernates)가 있는데, k8s보다 사용하기 쉽고, 비용도 저렴하다. serverless로 구성할 수도 있어서, 인스턴스를 구성하고 관리할 필요도 없다.
2. ECS 주요 구성 요소

2 - 1. ECS Cluster
- 컨테이너화된 애플리케이션을 실행하기 위한 논리적 그룹
- 해당 인스턴스에 Docker Container가 분산 실행된다.
2 - 2. ECR(Elastic Container Registry)
- Docker image 저장소
2 - 3. ECS Task
- 작업 정의를 바탕으로 실제로 실행되는 Docker Container의 인스턴스
2 - 4. Service
- Task가 두 개 이상 모인 것.
- 지정된 수의 작업을 클러스터에서 지속적으로 실행하고 관리한다.
- 로드 밸런싱, 자동 복구, 오토 스케일링 등의 기능을 제공한다.
3. 실습
Gitlab 파이프 라인에서 build를 수행하여 AWS ECR에 Docker Image를 등록하고 파이프라인의 deploy에서 ECS에 애플리케이션을 배포한다.

- 개발한 코드를 Gitllab 원격 저장소에 push한다.
- Gitlab CI는 Docker Image를 생성하고 AWS ECR에 등록한다.
- 생성된 Image로 Docker Container를 ECS에 실행하게 된다.
4. Spring 프로젝트
아주 간단한 Spring 프로젝트를 만든다.
SampleController
package com.spring.sample;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SampleController {
@GetMapping("/sample")
public String sample() {
return "Hello World";
}
}
application.properties
spring.application.name=sample
server.port=8080
Dockerfile
FROM openjdk:17-jdk-slim
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
4 - 1. Gitlab 프로젝트

로컬에서 작성한 Spring 프로젝트를 Gitlab 원격 저장소에 푸쉬한 모습이다.
프로젝트 식별자 "group-15720448/project-01" 은 AWD ECR에 저장소 이름과 일치시켜줄 것이다.
5. AWS 보안 그룹
5 - 1. 보안 그룹 인바운드 규칙 편집

8080, 80 포트를 열어준다.
6. AWS ECR
ECR 대시보드에 접속 후, 리포지토리 생성을 클릭한다.

리포지토리 이름은 Gitlab의 "group/project_명" 과 일치 시킨다.
6 - 1. ECR 푸쉬 명령어 확인하기

해당 명령어를 Gitlab CI/CD 에서 사용할 것이다.
7. AWS ECS
7 - 1. Cluster 생성

클러스터 이름은 project-cluster
Fargate(서버리스)로 구성한다.
7 - 2. Task Definition

7 - 2 - 1. Task Definition Container 설정

여기서 이미지 URI는 ECR에서 생성한 저장소의 URI이다.

7 - 3. Service 생성

패밀리에는 위에서 작성한 Task Definition을 셀렉트 박스에서 선택할 수 있다.
서비스 이름은 project-01-service
7 - 3 - 1. Service 네트워킹

서브넷은 자동을 설정이 되고, 보안 그룹은 5번 항목에서 작성한 걸 선택한다.
7 - 3 - 2. Service 로드 밸런싱

로드 밸런서 이름은 project-01-lb
포트는 80이다.
8. Port 짚고 넘어가기
Spring Project Port (8080): 애플리케이션 내부 포트
Task Definition Port (8080): 컨테이너 포트
Service Port (80): 외부에 노출되는 포트
8 - 1. Spring Project (8080)
- 스프링 애플리케이션은 컨테이너 내부에서 8080 포트로 실행된다.
- 애플리케이션 내부 설정으로, 컨테이너 내에서만 유효하다.
8 - 2. Task Definition (8080)
- 여기서 8080 포트를 지정하는 것은 컨테이너의 포트를 ECS에 알려주는 역할을 한다.
- 컨테이너 내부의 8080 포트(스프링 애플리케이션의 포트)를 ECS 서비스와 연결한다.
8 - 3. Service (80)
- Service에서 80 포트를 지정하는 것은 외부에서 접근 가능한 포트를 설정하는 것이다.
8 - 4. 트래픽 흐름
- 외부 요청이 서비스의 80 포트로 들어온다.
- ECS 서비스는 이 요청을 Task Definition에 정의된 8080 포트로 전달한다.
- 컨테이너 내부에서 실행중인 스프링 애플리케이션 8080 포트에서 요청을 받아 처리한다.
9. AWS IAM

엑세스 키를 만들기 위해 사용자를 생성한다.
9 - 1. 권한 설정

AdminitratorAccess 는 모든 권한을 부여하는 것이다.
9 - 2. 엑세스 키

엑세스 키가 만들어지면 .csv 파일 다운로드를 한다.
10. Gitlab ci 파일 작성
10 - 1. ACCESS_KEY 세팅
Settings > CI/CD > Variables 에서 2개 변수를 추가한다.

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
9번 항목에서 다운 파든 csv 파일에 값이 있다.
Flags에서 Protec Variable은 체크 해제한다.
10 - 2. .gitlab-ci.yml 파일 생성
services:
- docker:stable-dind
stages:
- build jar
- build and push docker image
- deploy
variables:
APPLICATION_NAME: "01"
TAG_NAME: "latest"
DOCKER_IMAGE: "group-18934028/project-01"
build:
image: openjdk:17-jdk-slim
stage: build jar
script:
- chmod +x gradlew
- ./gradlew clean build
artifacts:
paths:
- build/libs/*.jar
docker build:
image: docker:latest
stage: build and push docker image
rules:
- if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_REF_NAME == "main"
variables:
TAG_NAME: "latest"
- if: $CI_COMMIT_BRANCH == "develop" || $CI_COMMIT_REF_NAME == "develop"
variables:
TAG_NAME: "develop"
script:
- apk add --update --no-cache curl py3-pip py3-virtualenv
- python3 -m venv /tmp/venv
- source /tmp/venv/bin/activate
- pip install awscli
- aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
- aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
- aws configure set region ap-northeast-2
- docker build -t $DOCKER_IMAGE .
- docker tag $DOCKER_IMAGE:latest 730335597998.dkr.ecr.ap-northeast-2.amazonaws.com/$DOCKER_IMAGE:$TAG_NAME
- aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 730335597998.dkr.ecr.ap-northeast-2.amazonaws.com
- docker push 730335597998.dkr.ecr.ap-northeast-2.amazonaws.com/$DOCKER_IMAGE:$TAG_NAME
deploy:
image: python:3.9-slim
stage: deploy
script:
- python3 -m venv /tmp/venv
- source /tmp/venv/bin/activate
- pip install awscli
- aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
- aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
- aws configure set region ap-northeast-2
- aws ecs update-service --cluster project-cluster --service project-01-service --task-definition project-01-task:1 --force-new-deployment
ECR에서 푸쉬 명령 보기를 참고하여 프로젝트에 맞게 수정해준다.
예를 들어 variables.DOCKER_IMAGE는 실제 ECR에 있는 것과 일치시켜야 한다.
10 - 2. Gitlab 파이프라인 확인

로컬에서 커밋 및 푸쉬를 하면 통합을 시작한다.
만약 실패했다면 해당 지점의 에러 로그를 확인한다.
11. 확인하기

ECS 대시보드에서 클러스터를 클릭하고 서비스 상세 페이지까지 접속한다.
그 후, 로드 밸런서 보기 버튼을 클릭한다.

로드 밸런서 페이지에서 DNS 이름을 복사하여 웹에 입력하고 스프링 프로젝트의 엔드포인트를 호출하여 결과를 확인한다.

'인프라 > CI, CD' 카테고리의 다른 글
GitHub Actions로 CI/CD 파이프라인 구축하고 cloudtype에 배포하기 (0) | 2024.12.11 |
---|---|
GitHub Actions로 구현하는 자동화된 테스트 기반 CI 파이프라인 (0) | 2024.12.10 |
2024 12 9 TIL - GitHub Actions로 CI/CD 파이프라인 구축하기(Feat. AWS ECR, ECS) (2) | 2024.12.09 |
2024 12 5 TIL - CI/CD (1) | 2024.12.05 |
1. AWS ECS(Elastic Container Service)
ECS는 컨테이너화된 애플리케이션을 쉽게 배포, 관리 및 확장할 수 있도록 해주는 완전관리형 컨테이너 오케스트레이션 서비스이다. 컨테이너 오케스트레이션 서비스로 유명한 게 k8s(Kubernates)가 있는데, k8s보다 사용하기 쉽고, 비용도 저렴하다. serverless로 구성할 수도 있어서, 인스턴스를 구성하고 관리할 필요도 없다.
2. ECS 주요 구성 요소

2 - 1. ECS Cluster
- 컨테이너화된 애플리케이션을 실행하기 위한 논리적 그룹
- 해당 인스턴스에 Docker Container가 분산 실행된다.
2 - 2. ECR(Elastic Container Registry)
- Docker image 저장소
2 - 3. ECS Task
- 작업 정의를 바탕으로 실제로 실행되는 Docker Container의 인스턴스
2 - 4. Service
- Task가 두 개 이상 모인 것.
- 지정된 수의 작업을 클러스터에서 지속적으로 실행하고 관리한다.
- 로드 밸런싱, 자동 복구, 오토 스케일링 등의 기능을 제공한다.
3. 실습
Gitlab 파이프 라인에서 build를 수행하여 AWS ECR에 Docker Image를 등록하고 파이프라인의 deploy에서 ECS에 애플리케이션을 배포한다.

- 개발한 코드를 Gitllab 원격 저장소에 push한다.
- Gitlab CI는 Docker Image를 생성하고 AWS ECR에 등록한다.
- 생성된 Image로 Docker Container를 ECS에 실행하게 된다.
4. Spring 프로젝트
아주 간단한 Spring 프로젝트를 만든다.
SampleController
package com.spring.sample;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SampleController {
@GetMapping("/sample")
public String sample() {
return "Hello World";
}
}
application.properties
spring.application.name=sample
server.port=8080
Dockerfile
FROM openjdk:17-jdk-slim
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
4 - 1. Gitlab 프로젝트

로컬에서 작성한 Spring 프로젝트를 Gitlab 원격 저장소에 푸쉬한 모습이다.
프로젝트 식별자 "group-15720448/project-01" 은 AWD ECR에 저장소 이름과 일치시켜줄 것이다.
5. AWS 보안 그룹
5 - 1. 보안 그룹 인바운드 규칙 편집

8080, 80 포트를 열어준다.
6. AWS ECR
ECR 대시보드에 접속 후, 리포지토리 생성을 클릭한다.

리포지토리 이름은 Gitlab의 "group/project_명" 과 일치 시킨다.
6 - 1. ECR 푸쉬 명령어 확인하기

해당 명령어를 Gitlab CI/CD 에서 사용할 것이다.
7. AWS ECS
7 - 1. Cluster 생성

클러스터 이름은 project-cluster
Fargate(서버리스)로 구성한다.
7 - 2. Task Definition

7 - 2 - 1. Task Definition Container 설정

여기서 이미지 URI는 ECR에서 생성한 저장소의 URI이다.

7 - 3. Service 생성

패밀리에는 위에서 작성한 Task Definition을 셀렉트 박스에서 선택할 수 있다.
서비스 이름은 project-01-service
7 - 3 - 1. Service 네트워킹

서브넷은 자동을 설정이 되고, 보안 그룹은 5번 항목에서 작성한 걸 선택한다.
7 - 3 - 2. Service 로드 밸런싱

로드 밸런서 이름은 project-01-lb
포트는 80이다.
8. Port 짚고 넘어가기
Spring Project Port (8080): 애플리케이션 내부 포트
Task Definition Port (8080): 컨테이너 포트
Service Port (80): 외부에 노출되는 포트
8 - 1. Spring Project (8080)
- 스프링 애플리케이션은 컨테이너 내부에서 8080 포트로 실행된다.
- 애플리케이션 내부 설정으로, 컨테이너 내에서만 유효하다.
8 - 2. Task Definition (8080)
- 여기서 8080 포트를 지정하는 것은 컨테이너의 포트를 ECS에 알려주는 역할을 한다.
- 컨테이너 내부의 8080 포트(스프링 애플리케이션의 포트)를 ECS 서비스와 연결한다.
8 - 3. Service (80)
- Service에서 80 포트를 지정하는 것은 외부에서 접근 가능한 포트를 설정하는 것이다.
8 - 4. 트래픽 흐름
- 외부 요청이 서비스의 80 포트로 들어온다.
- ECS 서비스는 이 요청을 Task Definition에 정의된 8080 포트로 전달한다.
- 컨테이너 내부에서 실행중인 스프링 애플리케이션 8080 포트에서 요청을 받아 처리한다.
9. AWS IAM

엑세스 키를 만들기 위해 사용자를 생성한다.
9 - 1. 권한 설정

AdminitratorAccess 는 모든 권한을 부여하는 것이다.
9 - 2. 엑세스 키

엑세스 키가 만들어지면 .csv 파일 다운로드를 한다.
10. Gitlab ci 파일 작성
10 - 1. ACCESS_KEY 세팅
Settings > CI/CD > Variables 에서 2개 변수를 추가한다.

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
9번 항목에서 다운 파든 csv 파일에 값이 있다.
Flags에서 Protec Variable은 체크 해제한다.
10 - 2. .gitlab-ci.yml 파일 생성
services:
- docker:stable-dind
stages:
- build jar
- build and push docker image
- deploy
variables:
APPLICATION_NAME: "01"
TAG_NAME: "latest"
DOCKER_IMAGE: "group-18934028/project-01"
build:
image: openjdk:17-jdk-slim
stage: build jar
script:
- chmod +x gradlew
- ./gradlew clean build
artifacts:
paths:
- build/libs/*.jar
docker build:
image: docker:latest
stage: build and push docker image
rules:
- if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_REF_NAME == "main"
variables:
TAG_NAME: "latest"
- if: $CI_COMMIT_BRANCH == "develop" || $CI_COMMIT_REF_NAME == "develop"
variables:
TAG_NAME: "develop"
script:
- apk add --update --no-cache curl py3-pip py3-virtualenv
- python3 -m venv /tmp/venv
- source /tmp/venv/bin/activate
- pip install awscli
- aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
- aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
- aws configure set region ap-northeast-2
- docker build -t $DOCKER_IMAGE .
- docker tag $DOCKER_IMAGE:latest 730335597998.dkr.ecr.ap-northeast-2.amazonaws.com/$DOCKER_IMAGE:$TAG_NAME
- aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 730335597998.dkr.ecr.ap-northeast-2.amazonaws.com
- docker push 730335597998.dkr.ecr.ap-northeast-2.amazonaws.com/$DOCKER_IMAGE:$TAG_NAME
deploy:
image: python:3.9-slim
stage: deploy
script:
- python3 -m venv /tmp/venv
- source /tmp/venv/bin/activate
- pip install awscli
- aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID
- aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
- aws configure set region ap-northeast-2
- aws ecs update-service --cluster project-cluster --service project-01-service --task-definition project-01-task:1 --force-new-deployment
ECR에서 푸쉬 명령 보기를 참고하여 프로젝트에 맞게 수정해준다.
예를 들어 variables.DOCKER_IMAGE는 실제 ECR에 있는 것과 일치시켜야 한다.
10 - 2. Gitlab 파이프라인 확인

로컬에서 커밋 및 푸쉬를 하면 통합을 시작한다.
만약 실패했다면 해당 지점의 에러 로그를 확인한다.
11. 확인하기

ECS 대시보드에서 클러스터를 클릭하고 서비스 상세 페이지까지 접속한다.
그 후, 로드 밸런서 보기 버튼을 클릭한다.

로드 밸런서 페이지에서 DNS 이름을 복사하여 웹에 입력하고 스프링 프로젝트의 엔드포인트를 호출하여 결과를 확인한다.

'인프라 > CI, CD' 카테고리의 다른 글
GitHub Actions로 CI/CD 파이프라인 구축하고 cloudtype에 배포하기 (0) | 2024.12.11 |
---|---|
GitHub Actions로 구현하는 자동화된 테스트 기반 CI 파이프라인 (0) | 2024.12.10 |
2024 12 9 TIL - GitHub Actions로 CI/CD 파이프라인 구축하기(Feat. AWS ECR, ECS) (2) | 2024.12.09 |
2024 12 5 TIL - CI/CD (1) | 2024.12.05 |