Gom3rye

AWS- ECS 본문

현대 오토에버 클라우드 스쿨

AWS- ECS

Gom3rye 2025. 7. 28. 18:03
728x90
반응형

ECS 서비스 배포

  • 클러스터 생성
  • Task Definition
  • 클러스터 안에 Task를 Service로 배포

배포 전략

Green/Blue Strategy

  • Blue: 현재 프로덕션 환경에서 실행 중인 애플리케이션
  • Green: 새 버전의 애플리케이션이 배포되는 환경
  • 테스트가 끝나면 Blue에서 Green으로 전환하고 실패 시 쉽게 롤백이 가능하다.

장점

  • 무중단 배포 가능
  • 빠른 롤백
  • 실시간 테스트가 가능: 트래픽 일부분을 Green으로 보내서 검증한다.

블루 그린 업데이트 적용 (태스크를 수정)

  • Task 메뉴에서 새 계정 생성을 누르고 수정(이미지 정보 등을 수정: nginx에서 nginx:1.16으로)

Auto Scaling

  • 조건을 설정해서 조건을 초과하거나 만족하지 못하는 경우 자동으로 scale in과 out을 수행해주는 옵션
  • CPU와 Memory, 요청의 개수를 가지고 설정한다.

Django Application을 이용한 ECS CI/CD

  • 이미지는 ECR에 배포하고 컨테이너는 ECS에서 실행
  • Django Application 생성
    • 가상환경 생성: python -m venv ./myvenv
    • 가상환경 활성화
    • django 라이브러리 설치: pip install django
    • django 프로젝트 생성: django-admin startproject ec2django
    • 디렉토리 이동: cd ec2django
    • 서버 실행: sudo python3 manage.py runserver 0.0.0.0:80
    • 애플리케이션을 모든 컴퓨터에서 실행할 수 있도록 설정을 수정: settings.py 파일의 ALLOWED_HOSTS 부분을 *로 수정
    • 의존성 라이브러리를 별도의 파일에 기록: pip freeze > requirements.txt
    • git hub에 푸시
  • 이미지 만들기 (Dockerfile)
FROM python:3.8-slim-buster as build
WORKDIR /usr/src/app

COPY requirements.txt ./

RUN pip install django
RUN pip install djangorestframework

COPY . .
EXPOSE 80
CMD ["python", "manage.py", "runserver", "0.0.0.0:80"]
  • docker-compose 적용 (docker-compose.yaml)
version: "3"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: "python manage.py runserver 0.0.0.0:80"
    ports:
      - "80:80"
  • 실행: docker-compose -f docker-compose.yaml up --build
  • github action을 위한 yaml 파일을 생성
name: django
on:
  push:
    branches: ["master"]
  pull_request:
    branches: ["master"]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Set up Python 3.10
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      - name: Install Dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
      - name: Build Docker Compose
        run: docker-compose
  • ECR(Elastic Container Registry)에 이미지 Push
    • ECR 서비스에 접속해서 Repository 생성(apiserver)
    • 외부에서 ECR 서비스를 사용하기 위한 정책을 생성
      • IAM 서비스에서 작업
      • 정책 생성을 클릭하고 json 선택한 후 작성(private_image_push)
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Allow",
			"Action": [
			    "ecr:CompleteLayerUpload",
			    "ecr:UploadLayerPart",
			    "ecr:InitiateLayerUpload",
			    "ecr:BatchCheckLayerAvailability",
			    "ecr:PutImage"],
			"Resource": ["arn:aws:ecr:ap-northeast-2:208060188195:repository/apiserver"]
		},
		{
		    "Effect":"Allow",
		    "Action":"ecr:GetAuthorizationToken",
		    "Resource": "*"
		}
	]
}
  • Git Hub에서 AWS에 로그인 할 수 있도록 OpenID Connect를 이용한 설정
  • git hub에서 로그인이 되는지 확인
    • git hub action 파일을 수정하고 push
    name: django
    on:
      push:
        branches: ["master"]
      pull_request:
        branches: ["master"]
    permissions:
      id-token: write
      contents: read
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout
            uses: actions/checkout@v3
          - name: Set up Python 3.10
            uses: actions/setup-python@v4
            with:
              python-version: '3.10'
          - name: Install Dependencies
            run: |
              python -m pip install --upgrade pip
              pip install -r requirements.txt
          - name: Build Docker Compose
            run: docker-compose
          - name: Configure AWS Credentials
            uses: aws-actions/configure-aws-credentials@v4
            with:
              role-to-assums: 자격증명공급자가만든 role의 ARN 값
              role-session-name: sampleSessionName
              aws-region: ap-northeast-2
    
  • ECR Login
    • git hub action 파일에 추가
    - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@62f4f872db3836360b72999f4b87f1ff13310f3a
    
    - ECR Push
    git hub action 파일에 환경 변수 추가
    		env:
      		AWS_REGION: ap-northeast-2
      		ECR_REPOSITORY: apiserver
    
    - push 하는 스텝을 생성
    - name: Build Tag and Push Image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
    			IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
    
  • ECS에 서비스 생성
    • 사전 확인
      • 클러스터 이름
      • 서비스 이름
    • git hub action 파일에 환경 변수 추가
    ECS_CLUSTER: deploytest
    ECS_SERVICE: itstudyservice
    ECS_TASK_DEFINIFION: ./task-definition.json
    CONTAINER_NAME: itstudy
    
    • 프로젝트에 task-definition.json 파일을 생성(ECS에서 생성한 task 의 JSON을 복사해서 생성)
      • 복사를 하되 image 부분은 제거
      • 앞에서 빌드한 이미지를 가지고 task를 생성
    • git hub action 파일에 코드 추가
    - name: Fill in the new image ID in the Amazon ECS task definition
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@c804dfbdd57f713b6c079302a4c01db7017a36fc
        with:
          task-definition: ${{ env.ECS_TASK_DEFINIFION }}
          container-name: ${{ env.CONTAINER_NAME }}
          image: ${{ steps.build-image.outputs.image }}
    - name: Deploy Amazon ECS task definition
      uses: aws-actions/amazon-ecs-deploy-task-definition@df9643053eda01f169e64a0e60233aacca83799a
      with:        
        task-definition: ${{ steps.task-def.outputs.task-definition }}
        service: ${{ env.ECS_SERVICE }}
        cluster: ${{ env.ECS_CLUSTER }}
        wait-for-service-stability: true
    
    • 현재 상태를 push 하면 권한 부족 에러 발생
      • 이전에 만든 role은 ECS에 대한 권한만 부여하는 것

도메인 설정

이유

  • task의 public IP를 이용해서 애플리케이션에 접근 가능
    • 웹 브라우저에서는 IP 보다는 도메인을 이용해서 접근하는 경우가 많다.
    • Cloud 서비스에서 IP는 언제든 변경될 수 있기 때문이다.
    • 복제본이 존재하는 경우 모든 task의 IP를 전부 기억해야 한다.
  • load balancer 활용
    • 복제본의 모든 IP를 기억할 필요 없다.
    • load balancer를 생성하면 도메인을 제공하는데 너무 길고 원하는 도메인이 아닐 수 있다.

도메인 연결

  • Route53 서비스로 이동
  • 도메인이 없으면 구매를 해야 하는데 외부에서 구입한 도메인도 사용 가능하다.
  • 호스팅 영역에서 레코드 생성을 클릭해서 A 레코드를 선택하고 별칭을 선택해서 LoadBalancer 선택한다.

HTTPS 적용

  • 이유
    • 기본적으로 Load Balancer 나 Route 53은 HTTP 서비스를 사용한다.
    • 모바일에서는 보안상의 문제로 HTTP 접속을 허용하지 않는 경우가 많다.
  • 인증서 발급
    • AWS Certificate Manager 에서 발급
    • 발급 신청을 하고 도메인을 연결하면 된다.
  • LoadBalancer에서 인증서 연결
    • 리스너 추가를 클릭
    • 프로토콜을 HTTPS로 변경
    • 대상 그룹을 이전에 선택한 대상 그룹으로 선택
    • 보안 리스너 설정에서 인증서 설정

Git Hub Action

→ EC2에 SSH로 접속해서 배포

→ ECS에 배포

EKS

Elastic Kubernetes Service는 Kubernetes를 제어하는 Control Plane을 제공하는 관리형 서비스

  • 특정 리전에서는 사용할 수 없을 수도 있다.

특징

  • VPC와 통합
    • Pod Network는 Data Network와는 다른 네트워크 체계를 배치하기 때문에 클러스터 외부에서 Pod에 명시적으로 End Point(Node Port와 Load Balancer)를 만들어주지 않으면 통신이 불가능하다.
    • EKS에서는 Amazon VPC 통합 네트워킹을 지원하고 있어서 Pod에서 VPC 내부 주소 대역을 사용할 수 있고 클러스터 외부와의 통신을 Seamless(서비스 접근을 단순화하는 것 또는 복잡한 기술이나 기능을 설명하지 않아도 서비스 기능을 직관적으로 구현하는 것)하게 구현할 수 있다.
  • IAM 인증을 통한 인증과 인가
  • ELB와 연계
    • Kubernetes 클러스터 외부에서 접속을 할 때는 서비스를 사용해 End Point를 생성할 필요가 있는데 가장 전형적인 End Point가 Load Balancer이다.
    • EKS에서는 kubernetes의 서비스 타입 중 하나인 Load Balancer를 설정하면 자동적으로 ELB가 생성되는데 이것으로 HTTPS나 경로 기반 라우팅 등의 L7 Load Balancer 기능을 AWS 서비스로 구현할 수 있다.
  • 데이터 플레인 선택
    • Kubernetes는 Control Plane과 Data Plane으로 구성되는데 Control Plane은 EKS에서 관리형 서비스로 제공한다.
    • EKS 서비스 제공 초기에는 AWS가 자동화된 구축 방식으로 Data Plane을 제공했고 EKS와 별도로 EC2를 관리해야 했지만 시간이 지나면서 AWS가 발전해 Data Plane 관리를 도와주는 기능이 제공된다.
    • Fargate 서비스를 제공한다.
728x90
반응형

'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글

작심 큰일 챌린지 - 달빛 여우 (파이썬)  (4) 2025.08.04
AWS- EKS  (3) 2025.07.29
AWS Container Service  (5) 2025.07.25
AWS의 Database  (3) 2025.07.23
Kubernetes Service, AWS EC2  (4) 2025.07.22