Gom3rye

AWS Container Service 본문

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

AWS Container Service

Gom3rye 2025. 7. 25. 17:51
728x90
반응형

AWS Container Service

Django Application을 Docker Image를 이용해서 EC2 인스턴스에 배포

  • Django Application 작성 (어떤 프레임워크나 언어를 사용해서 제작해도 상관 없음)
    • 가상 환경 생성
      • python -m venv myvenv
      • cd myvenv/Scripts
      • activate
      • cd ../../
    • 프로젝트 생성
      • pip install django djangorestframework
      • django-admin starproject apiserver
      • cd apiserver
      • python manage.py runserver
    • 프로젝트 작성
      • settings.py 파일을 수정 (프로젝트 설정 수정)
        • ALLOWED_HOSTS 부분을 ['*']로 수정: 장고 애플리케이션은 기본적으로 현재 컴퓨터에서만 실행되도록 되어 있는데 다른 컴퓨터에서도 실행되도록 하기 위해서 설정해야 한다.
        • 로컬에서 개발 중인데 이 애플리케이션을 서버로 이행시켜 실행시키고자 하는 경우 수정을 해주어야 한다.
        • INSTALLED_APPS 부분에 추가
          • "rest_framework",
          • "apiserver"
        • TIME_ZONE = 'Asia/Seoul' 로 수정 (수정 안 하면 시간 안 맞는다.)
      • view.py 생성하고 요청을 처리하는 함수를 작성
      from rest_framework.response import Response
      from rest_framework.decorators import api_view
      from rest_framework import status
      
      @api_view(['GET'])
      def index(request):
          data = {"result":"success", "data":[{"id":"itstudy", "name":"군계"}]}
          return Response(data, status=status.HTTP_200_OK)
      
      • urls.py 에서 요청과 URL을 연결
      from django.contrib import admin
      from django.urls import path
      from .views import index
      
      urlpatterns = [
      	path('admin/', admin.site.urls),
      	path("", index)
      ]
      
      • 다시 실행한 후 브라우저에서 확인
  • 의존성 라이브러리를 텍스트 파일로 기록(자바는 의존성 라이브러리를 포함해서 만들어지기 때문에 이 작업이 필요 없다. node 프로젝트들은 package.json에 자동으로 기록이 된다. npm install 작업을 수행)
    • pip freeze > requirements.txt
  • Docker 이미지를 생성해서 도커 허브에 업로드
    • Dockerfile 생성하고 작성
    FROM --platform=linux/amd64 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 run --name apiserver -p 80:80 -d apiserver
    • 도커 허브에 Repository를 생성
      • kyal333/djangoapiserver
    • 토큰 발급
    • GitHub Repository에 소스 코드를 push
      • git init > git add . > git commit -m “~” > git remote add origin 깃헙url > git push origin main
    • 프로젝트에 ./github/workflows/.yaml 파일을 만들고 이미지를 만들어서 도커 허브에 업로드 하는 action 코드를 작성 (djangoapiserver.yaml)
    name: django
    
    # trigger
    on:
      push:
        branches: ["main"]
      pull_request:
        branches: ["main"]
    
    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: Login to DockerHub
            uses: docker/login-action@v1
            with:
              username: ${{secrets.DOCKERHUB_USERNAME}}
              password: ${{secrets.DOCKERHUB_TOKEN}}
              
          - name: build and release to DockerHub
            env:
              NAME: ${{secrets.DOCKERHUB_USERNAME}}
              REPO: djangoapiserver
            run: |
              docker build -t $REPO .
              docker tag $REPO:latest $NAME/$REPO:latest
              docker push $NAME/$REPO:latest 
              
          - name: Decode SSH Key
    			  run: |
    			    echo "${{secrets.EC2_KEY}}" | base64 -d > ec2-key.pem
    			    chmod 600 ec2-key.pem
    			    
    			- name: Connect and Deploy to EC2
    			  run: |
    			    ssh -o StrictHostKeyChecking=no -i ec2-key.pem ${{secrets.EC2_USER}}@${{secrets.EC2_HOST}} << 'EOF'
    			      mkdir /home/ubuntu/myapp
    			    EOF
    
          
    
    • GitHup 레포지토리에 시크릿 추가
      • DOCKERHUB_USERNAME
      • DOCKERHUB_TOKEN
    • 소스 코드 푸시
  • EC2에 도커를 설치해서 이미지를 내려받아 컨테이너로 저장
    • 도커 설치
      • sudo apt-get update
      • sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
      • curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
      • sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
      • echo "deb [arch=$(dpkg --print-architecture) signedby=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
      • sudo apt-get update
      • sudo apt-get install docker-ce docker-ce-cli containerd.io
      • sudo docker version
      • sudo usermod -aG docker $USER
      • newgrp docker
      • sudo systemctl enable docker
      • sudo systemctl start docker
    • 도커 허브 이미지를 컨테이너로 실행
      • sudo docker run -p 80:80 -d --rm kyla333/djangoapiserver
  • Githun Action에서 EC2 인스턴스에 ssh로 접속해서 명령 수행
    • docker run --name djangoapiserver -p 80:80 -d --rm kyla333/djangoapiserver
    • 컨테이너가 이미 존재하는 경우는 컨테이너를 중지하고 이미지를 삭제해야 한다.
    if [ "$(docker ps -a -q -f name=^/컨테이너이름)" ]; then
    	echo "컨테이너 있음" 
    	docker stop 컨테이너이름
    	docker rmi 이미지이름
    else
    	echo "컨테이너 없음"
    fi
    
    ##-----------
    if [ "$(docker ps -a -q -f name=^/djangoapiserver)" ]; then 
    	docker stop djangoapiserver
    	docker rmi kyla333/djangoapiserver
    else
    	echo "컨테이너 없음"
    fi
    
    • 컨테이너 다시 생성하는 명령어
    docker run --name 컨테이너이름 -d -p 80:80 --rm 이미지이름
    
  • EC2 SSH 접속
    • 전제 조건
      • EC2에 public IP가 할당되어야 한다.
      • SSH port가 InBound 규칙에서 열려 있어야 한다.
      • pem 키를 가지고 있어야 한다.
      • 사용자 확인 필요 (AWS에서 ubuntu의 경우는 ubuntu나 ec2-user 이다.)
    • pem의 값을 base64로 인코딩해야 한다.
      • linux에서는 base64 -w 0 키파일경로
      • macOS에서는 base64 0 키파일경로
      • windows는 powershell에서 해야 한다. [Conver]::ToBase64String([IO.File]::ReadAllBytes("파일경로")) > 저장될파일경로
    • GitAction에서 EC2에서 접속하기 위해서는 public ip, 유저명, pem 키값이 필요하다.
    • GitHub 레포지토리에 키값을 등록 (settings > secrets and variables > new respository secret)
      • EC2_HOST에 public ip 주소를, (퍼블릭 ip가 노출되면 디도스 공격을 할 수 있으니까)
      • EC2_USER에 user를,
      • EC2_KEY에 pem파일을 인코딩한 값을 넣어야 한다.
    • 최종 djangoapiserver.yaml
    name: django
    
    on:
      push:
        branches: ["main"]
      pull_request:
        branches: ["main"]
    
    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: Login to DockerHub
            uses: docker/login-action@v1
            with:
              username: ${{secrets.DOCKERHUB_USERNAME}}
              password: ${{secrets.DOCKERHUB_TOKEN}}
              
          - name: Build and Push to DockerHub
            env:
              NAME: ${{secrets.DOCKERHUB_USERNAME}}
              REPO: djangoapiserver
            run: |
              docker build -t $REPO .
              docker tag $REPO:latest $NAME/$REPO:latest
              docker push $NAME/$REPO:latest 
              
          - name: Decode SSH Key
            run: |
              echo "${{secrets.EC2_KEY}}" | base64 -d > ec2-key.pem
              chmod 600 ec2-key.pem
              
          - name: Connect and Deploy to EC2
            run: |
              ssh -o StrictHostKeyChecking=no -i ec2-key.pem ${{secrets.EC2_USER}}@${{secrets.EC2_HOST}} << 'EOF'
                # 디렉토리 만들기
                mkdir -p /home/ubuntu/myapp
                cd /home/ubuntu/myapp
    
                # 기존 컨테이너 중지 및 삭제
                if [ "$(docker ps -a -q -f name=djangoapiserver)" ]; then 
                  docker stop djangoapiserver
                  docker rm djangoapiserver
                  docker rmi kyla333/djangoapiserver
                else
                  echo "컨테이너 없음"
                fi
    
                # 최신 이미지 가져오기 및 컨테이너 실행
                docker pull kyla333/djangoapiserver
                docker run -d --name djangoapiserver -p 80:80 kyla333/djangoapiserver
              EOF
    

ECR & ECS

ECR

  • Docker Hub와 비슷한 개념으로 Amazon Elastic Container Registry의 약자
  • 안전하고 확장 가능하며 신뢰할 수 있는 관리형 컨테이너 이미지 레지스트리 서비스
  • S3로 Docker Image를 관리하기 때문에 고가용성을 보장하고 AWS IAM 인증을 통해 이미지 Push/Pull 에 대한 권한 관리가 가능하다.
  • private과 public 다 있다.

ECS

  • Docker와 컨테이너 가상화 도구를 처음 사용하면 컨테이너 기술의 장점과 배포의 어려움을 동시에 느낀다.
  • 운영 중인 Docker 컨테이너나 인스턴스가 몇 개 정도면 오케스트레이션 도구가 필요 없지만 개수가 늘어나면 오케스트레이션 도구를 학습해야 한다.
  • AWS의 ECS는 AWS 컴퓨팅 서비스를 제공하는 오케스트레이션 서비스로 AWS 환경에 최적화되어 있다.
  • AWS Cloud 환경에서 사용하는 것을 전제로 하기 때문에 Docker의 모든 기능을 사용하기에는 일부 제약이 있으면 미세한 컨트롤이 어렵다.
  • Auto Scaling Task 기반 IAM 지원, Application Load Balancer 지원, Service Discovery, AWS Batch Release, Fargate(서버리스) 지원 등 AWS에 맞춤화된 기능 등을 추가했다.

구성 요소

  • 클러스터
    • ECS의 가장 기본적인 단위
    • Docker 컨테이너를 실행할 수 있는 가상의 공간
    • ECS 클러스터는 기본적으로 EC2와 같은 컴퓨팅 자원을 기본적으로 포함하지 않은 논리적인 단위이므로 컴퓨팅 자원이 없는 빈 클러스터를 만드는 것도 가능하다.
    • EC2에 EC2-Client라는 서비스를 실행해서 특정 클러스터에 연결할 수 있는데 이렇게 클러스터에 연결된 EC2 인스턴스를 컨테이너 인스턴스라고 부른다.
    • 컨테이너 인스턴스의 자원을 모니터링 및 관리하고 클러스터로 요청된 컨테이너들을 적절하게 실행하는 역할을 수행한다.
  • 작업(Job)
    • ESC에서 컨테이너를 실행하는 최소 단위
    • kubernetes의 pod와 유사한 개념
  • Task Definition
    • docker-compose와 유사한 개념
  • Service
    • deployment와 유사한 개념
    • 작업을 하나의 오케스트레이션 단위로 묶은 것
    • 로드밸런서와 오토 스케일링을 애플리케이션 단위로 조절한다.
  • 컨테이너 인스턴스
    • Worker Node와 유사한 개념
    • 파게이트를 선택하면 늘리고 줄이는 걸 직접 할 필요가 없다.

nginx 이미지를 ECS 서비스에

  • 이미지 확인
    • docker run -dit -p 80:80 nginx
  • ECS 서비스에 접속해서 클러스터를 생성
    • 클러스터 인스턴스 종류와 이름만 설정하면 된다.
    • Fargate를 선택하면 옵션 설정이 거의 필요 없다.
    • EC2 인스턴스를 선택하면 직접 옵션을 설정해야 한다.
  • 태스크 생성
    • 이름 설정
  • 시작 유형을 선택(배포할 클러스터와 동일한 형식으로 설정)
  • 운영체제와 하드웨어를 선택
  • 컨테이너 정보 작성
    • 클러스터와 태스크를 연결해서 서비스를 생성
      • 태스크만 잘 연결하고 나머지 옵션은 선택

✅ 언어/플랫폼 별 용도와 특징

항목                                                                                         설명

JavaScript 🔹 웹 브라우저에서 동작하는 유일한 프로그래밍 언어
🔹 HTML/CSS와 함께 웹 프론트엔드 개발의 핵심  
🔹 사용자가 보는 UI와 상호작용 처리  
Python / Java / C++ / C# 🔹 일반적으로 PC 애플리케이션, 서버 백엔드, 시스템 소프트웨어 등 개발
🔹 브라우저에서 직접 실행 불가능  
🔹 웹에서 사용하려면 서버로 동작하거나 WAS(WEB Application Server) 필요  
Node.js 🔹 JavaScript브라우저 밖(서버 측)에서도 사용할 수 있도록 해주는 런타임 환경
🔹 Chrome의 V8 JavaScript 엔진 기반  
🔹 백엔드 서버 개발, CLI 도구 제작 등 가능  
🔹 대표 프레임워크: Express.js  
728x90
반응형

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

AWS- EKS  (3) 2025.07.29
AWS- ECS  (1) 2025.07.28
AWS의 Database  (3) 2025.07.23
Kubernetes Service, AWS EC2  (4) 2025.07.22
AWS  (1) 2025.07.21