Developing

패스트캠퍼스 캐시백 챌린지 39일차 본문

Devops/Fastcampus 캐시백 챌린지

패스트캠퍼스 캐시백 챌린지 39일차

DEV_BLOG 2022. 5. 26. 23:36

 

 

수강 인증샷

 

ECS CLI를 통해 Docker-Compose로 다중 컨테이너를 배포하는 내용들의 클립을 수강하는 식으로 챌린지를 진행하였다. 마지막에 얘기하기로는 depends on 설정이 aws ecs cli에서 쓸때는 문법이 다른 것 때문일것이라고 암시하면서 마치시길래 여러가지 시도를 해보면서 작업을 해주었음에도 끝내 이미지 두개가 동시에 예쁘게 돌아가는 것을 확인하지는 못했다.(강사님도 공식문서 오가면서 하다가  매우 힘들어하셨다.;;) 결론만 놓고보면 작업실행이 pending 상태에서 stop이 된다..ㅜㅜ;; Stackoverflow에까지 질문해보았는데 크게 실마리를 찾지 못했다. 강좌상에서도 이번 내용이 엄청 해주어야하는 것이 많아서 꽤 순탄하게 진행되지는 않았다. 내선에서 자체적으로 문제가 해결이 안되었지만 나중에 다시 보다보면 원인을 알게 될 수 있을거라 생각한다. 다음 포스팅은 AWS KMS에 관한 포스팅을 할 예정이다.

 

 

사전 Docker Compose 설정작업

curl -fsSL <https://get.docker.com/> | sudo sh
sudo usermod -aG docker $USER
mkdir docker-server
cd docker-server
git clone <https://github.com/SongGeunil1/fastcampus_test>

 

마찬가지로 EC2 하나파서 설정들을 해준다. 이때 이전에 docker compose할때 자기가 실수하셨다고 하시면서 수정할 부분이 있으시다고 한다..ㅎㅎ

cd fastcampus_test
mv fastcampus_test fastcampus_test

vi asgi.py 에서 fastcampus를 fastcapus_test로 변경

vi settings.py 에서 ROOT_URLCONF 에서 fastcampus.urls를 fastcampus_test.urls로 변경, WSGI_APPLICATION에서 fastcampust를 fastcampus_test로 변경

vi wsgi.py에서 fastcampus.settings를 fastcampus_test.settings 로 변경

vi requirements.txt에서 uwsgi를 추가
vi Dockerfile

# /docker-server/fastcampus_test/Dockerfile
FROM python:3.6.7

ENV PYTHONUNBUFFERED 1

RUN apt-get -y update
RUN apt-get -y install vim

RUN mkdir /srv/docker-server
ADD . /srv/docker-server

WORKDIR /srv/docker-server

RUN pip install --upgrade pip
RUN pip install -r requirements.txt
vi uwsgi.ini

[uwsgi]
socket = /srv/docker-server/apps.sock
master = true
processes = 1
threads = 2
chdir = /srv/docker-server
module = fastcampus_test.wsgi
logto = /var/log/wsgi/uwsgi.log
log-reopen = true
vacuum = true

 

사전작업은 이정도로 해주면된다. docker file 빌드 되는지 테스트 해주자.(나중에 docker-compose 할때 하면 되니까 선택사항이다.)

docker build -t fastcampus_test/django .
cd ..
sudo curl -L <https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname> -s`-`uname -m` -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose
mkdir nginx
cd nginx
vi nginx.conf

# ~/docker-server/nginx/nginx.conf
user root;
worker_processes auto;
pid /run/nginx.pid;

events {
	worker_connections 1024;
}

http {
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	
  include /etc/nginx/mime.types;
	default_type application/octet-stream;

	ssl_protocols TLSv1 TLSv1.1 TLsv1.2; # Dropping SSLv3, ref: POODLE
  ssl_prefer_server_ciphers on;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  gzip on;
  gzip_disable "msie6";
  include /etc/nginx/sites-enable/*;
}

vi nginx-app.conf

# ~/docker-server/nginx/nginx-app.conf
upstream uwsgi {
	server unix:/srv/docker-server/apps.sock;
}

server {
	listen 80;
	server_name localhost;
	charset utf-8;
	client_max_body_size 128M;
	location / {
		uwsgi_pass uwsgi;
		include  uwsgi_params;
	}
	location /media {
		alias /srv/docker-server/.media/;
	}
	location /static/ {
		alias /srv/docker-server/.static/;
	}
}
vi Dockerfile

# ~/docker_server/nginx/Dockerfile
FROM nginx:latest

COPY nginx.conf /etc/nginx/nginx.conf
COPY nginx-app.conf /etc/nginx/sites-available/

RUN mkdir -p /etc/nginx/sites-enabled/\\
    && ln -s /etc/nginx/sites-available/nginx-app.conf /etc/nginx/sites-enabled/

# EXPOSE 80
CMD ["nginx" , "-g" , "daemon off;"]
cd ..
vi docker-compose.yml

#docker-compose.yml
version: '3'
services:
  nginx:
    container_name: nginx
    build: ./nginx
    image: docker-server/nginx
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./fastcampus_test:/srv/docker-server
      - ./log:/var/log/nginx
    depends_on:
       - django
  django:
    container_name: django
    build: ./fastcampus_test
    image: docker-server/django
    restart: always
    command: uwsgi --ini uwsgi.ini
    volumes
      - ./fastcampus_test:/srv/docker-server
      - ./log:/var/log/uwsgi
docker-compose up -d --build

여기까지 하면 기존의 EC2에서 docker compose를 사용했던 방식이다.

 

 

ECS CLI 사용해서 docker-compose 실행하기

 

한편 docker compose 문법을 AWS Fargate에서 사용하려고 하면 문법상에 약간 차이가 있게된다.

aws fargate을 활용해서 docker composer를 쓰기위해서는 AWS ECS CLI를 다운받아야한다.

sudo curl -Lo /usr/local/bin/ecs-cli <https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-linux-amd64-latest>
sudo apt-get install gnupg

cd ..
mkdir keys
cd keys
vi amazon-ecs-public-key.gpg

 

권한 설정을 빡세게 하려면 private key도 넣을 수 있는데, 일단 public key로 진행한다.

https://github.com/aws/amazon-ecs-cli/blob/mainline/amazon-ecs-public-key.gpg

해당 내용의 값을 amazon-ecs-public-key.gpg 에 넣어준다.

그 후에 키 인증을 진행해주어야한다.

curl -o ecs-cli.asc <https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-linux-amd64-latest.asc>
gpg --verify ecs-cli.asc /usr/local/bin/ecs-cli
sudo chmod +x /usr/local/bin/ecs-cli
ecs-cli --version
sudo apt install awscli
aws configure

AWS Access Key ID : {IAM 사용자 Access Key ID}
AWS Secret Access Key : {IAM 사용자 비밀 Access Key}
Default region Name : ap-northeast-2

aws ecr get-login --no-include-email --region ap-northeast-2   입력후 출력내용 복사해 실행

 

docker tag 달아주기전에 cli-compose-django , cli-compose-nginx 명으로 ECR 레포지토리를 생성해준다.

docker tag docker-server/django [cli-commpose-django ECR 레포지토리 URI]
docker push [cli-commpose-django ECR 레포지토리 URI]

docker tag docker-server/nginx [cli-compose-nginx ECR 레포지토리 URI]
docker push [cli-compose-nginx ECR 레포지토리 URI]

 

IAM policy 정책 role 적용을 해준다.

aws iam attach-role-policy --role-name ecsTaskExecutionRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

 

docker compose를 돌려줄 ECS cluster를 하나 생성해준다.

ecs-cli up --empty --cluster cli-cluster

 

Amazon ECS CLI 설정값들을 적용한다.

#저장
ecs-cli configure profile --profile-name user --access-key {IAM AWS_ACCESS_KEY_ID} --secret-key {IAM AWS_SECRET_ACCESS_KEY}
ecs-cli configure --cluster cli-cluster --default-launch-type FARGATE --region ap-northeast-2 --config-name cli-config

#적용
ecs-cli configure default --config-name cli-config
ecs-cli configure profile default --profile-name user

Amazon ECS Cli에 대한 자세한 설명은 aws 공식문서에서 확인가능하다.

https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/ECS_CLI_Configuration.html

 

 

여기서의 profile은 해당 profile_name을 사용하는 사람은 특정 IAM 사용자라는 것을 알려주는 것이기에 profile_name을 여럿 설정하면서 바꿔낄수도있고,

어떤 cluster에 대해서 사용하고있는지도 config_name 을 남겨두어 바꿔가며 사용한다고 생각하면된다.

최종적으로 해당 profile_name과 config_name들을 ECS CLI default 설정으로 불러와서 세팅해주어 ECS CLI를 사용할 수 있는 것이다.

그래서 앞서보인 위의 command 예시의 경우에서는 user와 cli-config라고 명명해놓고 쓰는 것이다.

 

 

docker-compose.yml 파일이 EC2에서 올리는것과 ECS에서 활용해서 올리는것이 문법이 다르기에 수정해주어야한다. EC2의 경우 가상컴퓨팅에서 가상환경 폴더의 위치를 명시해주어야하지만, ECS에서는 그럴 필요가 없는 것이다.

vi docker-compose.yml

#docker-compose.yml
version: '3'
services:
  nginx:
    build: ./nginx
    image: { ECR Nginx Image URI }
    restart: always
    ports:
      - "80:80"
    volumes:
      - /srv/docker-server
      - /var/log/nginx
    depends_on:
      - container_name : django
       
  django:
    build: ./fastcampus_test
    image: { ECR Django Image URI  }
    restart: always
    command: uwsgi --ini uwsgi.ini
    volumes:
      - /srv/docker-server
      - /var/log/uwsgi
vi ecs-params.yml

version: 1
task_definition:
  task_execution_role: ecsTaskExecutionRole
  ecs_network_mode: awsvpc
  task_size:
    mem_limit: 0.5GB
    cpu_limit: 256
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets:
        - "[MY_SUBNET_ID1]"
        - "[MY_SuBNET_ID2]"
      security-groups:
        - "[MY_SECURITY_GROUP_ID]"
      assign_public_ip: ENABLED

(여기서 depends on 설정을 여러가지를 시도해주다가 잘 안된 것 같다. ecs cli parameter 문서보면서 다양하게 시도해봤는데 실패했었다..ㅠㅠ depends on: django 해도 안되고 저렇게 해도 잘 안됬다.)

 

 

subnet , security group , public ip설정 등..

docker image간의 dependency 조정을 명시해준다. (AWS docker compose에서는 따로 설정해주어야한다.)

ecs-cli compose로 compose file을 올려야한다.

ecs-cli compose --file docker-compose.yml --ecs-params ecs-params.yml service create --launch-type FARGATE

 

 

 

여기서 service는 compose의 하위 명령어이고, create은 service의 하위명령어이다.

이제 작업을 실행해준다.

ecs-cli compose --file docker-compose.yml service start

 

 

 

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

* 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.