Notice
Recent Posts
Recent Comments
Link
Gom3rye
AWS Container Service 본문
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) ]- 다시 실행한 후 브라우저에서 확인
- python manage.py runserver
- localhost:8000
- settings.py 파일을 수정 (프로젝트 설정 수정)
- 가상 환경 생성
- 의존성 라이브러리를 텍스트 파일로 기록(자바는 의존성 라이브러리를 포함해서 만들어지기 때문에 이 작업이 필요 없다. 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 |