Notice
Recent Posts
Recent Comments
Link
Gom3rye
AWS- ECS 본문
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를 이용한 설정
- IAM에서 자격 증명 공급자(ID 제공업체)를 클릭해서 추가를 선택
- 공급자 추가를 클릭
- 공급자 URL 과 대상은 링크에서 확인: https://docs.github.com/en/actions/how-tos/secure-your-work/security-harden-deployments/oidc-in-aws
- 공급자 URL: https://token.actions.githubusercontent.com
- 대상: sts.amazonaws.com
- 생성된 자격 증명 공급자를 선택하고 역할 할당을 클릭한 후 웹 자격 증명을 선택
- 연동할 GitHub 정보를 설정(유저, 레포지토리, 브랜치 등)
- 연동할 권한을 선택
- 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 |