[AWS] ECR ECS 를 활용한 웹 서버 배포

박준호·2023년 3월 28일
2

기능경기대회

목록 보기
3/3
post-thumbnail

ECR과 ECS를 사용하여 VPC 내부에 웹 서버를 생성해보고 CloudFront로 웹 서버를 배포 해보자

💡 ECR 이란

ECR이란 Docker Container의 이미지를 저장하는 Repository 서비스 임

기능은 Docker hub의 Repository서비스와 동일함

장점은 Container 이미지를 S3 에 저장하기 때문에 고가용성이 유지되고, AWS IAM 인증을 통해 이미지 push/pull 에 대한 권한 관리가 가능하다는 것

💡 ECS 란

ECS는 완전관리형 컨테이너 오케스트레이션 서비스 이다

여기서 컨테이너 오케스트레이션 이란 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화 해주는 유형이다

💡 CloudFront 란

CloudFront은 AWS에서 제공하는 CDN 서비스 임

캐싱을 통해 사용자에게 좀 더 빠른 전송 속도를 제공함을 목적으로 함

CloudFront는 전 세계에 Edge Location을 두고 Client에 가장 가까운 Edge location을 찾아 > Latency를 최소화 시켜 빠른 데이터를 제공함

그럼 먼저 VPC를 생성해보자

VPC 생성과정에서 정말 좋은 기능인 VPC등 을 선택해서 대역과 이름을 지정해주고 나머지 세부 정보를 선택하고 만들면 알아서 연결까지 다해준다, 이 기능 너무너무 편하다...!

VPC 생성 끝이다 이게

EC2를 만들기전에 먼저 ECR 레포를 하나 만들어두자
이름만 정해주고 생성해주면 끝이다!!

다음은 VPC의 퍼블릭 서브넷에 Bastion EC2를 만들어서 도커 이미지를 생성해주고 빌드해서 ECR에 업로드 해보자
먼저 EC2를 VPC의 퍼블릭 서브넷에 퍼블릭 IP를 자동할당해서 생성해주자

보안그룹은 최소규칙만 할당하기 위해 아래처럼 내 IP로 설정해준다

생성한 Bastion에 ssh로 접속한 후 도커를 설치해주자 yum install docker -y, systemctl start docker
python Flask로 웹 애플리케이션을 하나 작성하고 Dockerfile도 생성해보자

app.py

from flask import Flask, request
import random

app = Flask(__name__)


@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"


@app.route("/healthz")
def health():
    return "OK"


if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)

Dockerfile

FROM python:3.9-buster

COPY . /app

RUN pip3 install flask 

WORKDIR /app

CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]

EC2에서 프라이빗 ECR레포로 이미지를 올리기 위해선 권한이 필요하다
awscli의 aws configure 명령어에 IAM user의 액세스키를 할당해줘야 한다
IAM user 생성을 해주고 이름을 적어주고 AmazonEC2ContainerRegistryPowerUser라는 정책을 할당하고 생성해준다

생성한 user 에서 보안 자격 증명 탭에서 액세스키를 awscli로 발급하고 저장해주자
Bastion에서 aws configure 를 입력하고 액세스키, 리전을 입력해주자

빨간색 박스로 표시된 푸시 명령 보기 를 눌러서 나오는 명령어들을 차례로 입력해주자
(도커는 root 권한이 있어야 실행이 가능하니 sudo를 붙이던가, docker own을 root로 바꾸던가, 유저를 root로 바꾸던가 해주자)

이렇게 Login Succeeded가 떠야 로그인, 인증에 성공한 것이다 그대로 빌드하고 태그까지 달아주고 푸시 해보자

ECR에 잘 들어온것을 확인할 수 있다

이제 ECS관련 작업이다
ECS 클러스터를 먼저 생성해주자
task가 실행되는 서브넷은 프라이빗 서브넷만 선택해주자

우린 인스턴스로 컨테이너를 띄울것이기 때문에 인프라 탭을 아래처럼 설정해주고 클러스터를 생성해주자

다음은 작업 정의서 이다
이미지 URI는 ECR 이미지 URI를 가져오자, 플라스크의 컨테이너 포트는 5000번이기 때문에 5000으로 설정후 다음

앱 환경은 EC2인스턴스를 선택해주고 생성

서비스를 생성하기 전에 서비스에 연결해줄 ALB를 만들어주자(ALB는 알잘딱 만들면 될것 같음 포트만 맞춰서!, 대상그룹 헬스체크 경로 /healthz)

서비스를 생성하고 위에서 만든 작업정의서 선택, ALB도 위에서 만든거 선택 해서 실행해주기만 하면 된다 쉽다

ALB DNS주소로 접속을 해보고 잘 된다면 이제 CloudFront로 배포하기만 하면된다

위처럼 원본 도메인만 만든 alb로 선택하고 딱히 건들거 없이 배포해주면 된다

이런식으로 나오는 도메인 이름에 접속해보면 잘 뜨는 것을 확인할 수 있을것이다!

마무리
오늘은 이렇게 ECR ECS CloudFront로 웹 서버를 컨테이너로 배포하는 방법에 대해 공부해보았다
간단한 아키텍처 이긴 하지만 컨테이너 단위로 배포하는 법에 대해 조금 더 익숙해졌고 컨테이너와 더 친해졌다고 느낀다
앞으로 여러 서비스들을 더 공부해보겠다
화이팅 하자!

profile
클라우드 컴퓨팅 공부중입니다.

0개의 댓글