일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- RedisJSON
- elastic cache
- ERR unknown command 'JSON.SET'
- vscode
- AWS S3 계정이동
- Window redis-cli
- 패캠챌린지
- 캐시백챌린지
- Ngrinder Docker
- aws s3
- 한 번에 끝내는 AWS 인프라 구축과 DevOps 운영 초격차 패키지 Online
- 환급챌린지
- Avast 구독취소
- 패스트캠퍼스
- Redis
- redis-cli
- AWS S3 버킷 삭제
- 패스트캠퍼스후기
- 직장인자기계발
- ERR unknown command 'JSON.GET'
- 캐시백
- putty Inactive
- Avast Security
- 잔디이전
- nodemailer
- 직장인인강
- AWS S3 migration
- redis cli
- gitlab 잔디옮기기
- aws
- Today
- Total
Developing
패스트캠퍼스 캐시백 챌린지 39일차 본문
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
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
* 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Devops > Fastcampus 캐시백 챌린지' 카테고리의 다른 글
패스트캠퍼스 캐시백 챌린지 41일차 (0) | 2022.05.28 |
---|---|
패스트캠퍼스 캐시백 챌린지 40일차 (0) | 2022.05.27 |
패스트캠퍼스 캐시백 챌린지 38일차 (0) | 2022.05.25 |
패스트캠퍼스 캐시백 챌린지 37일차 (0) | 2022.05.24 |
패스트캠퍼스 캐시백 챌린지 36일차 (0) | 2022.05.23 |