본문 바로가기
자동배포 (Auto deploy)

2. EC2에서 Pull & Run (1/3)

by 실짱 2024. 10. 31.

앞장까지 ECR 에 필요한 Docker image 를 넣어놨다.

이제 이를 EC2 에서 가져와서 실행시켜야 한다.

 

그림으로 보면 더 이해가 빠르겠지?

 

ECR 로 push 하는것까지는 각각의 개별 프로젝트의 젠킨스가 담당했다.

하지만 EC2 에서의 일은 각각의 프로젝트에서 담당하지 않고 총괄 프로젝트가 담당하도록 했다.

(물론 내가 선택한 방법일 뿐이다. 원리만 알면 어떤 아이디어로 어떻게 실행시킬지는 각자의 영역)

 

이를 위해서는 ansible 이라는 새로운 툴이 도입되어야 한다.

ansible 에 대한 설명은 인터넷 세상에 널려있으니 알아서 깨우치면 된다. 

(하나 추천하자면 https://brunch.co.kr/@growthminder/66 요기 정도)

이해하기 나름이겠지만 필자는

"playbook 이라는 스크립트 파일로 서버 관리" 

하는 것으로 이해하면 충분하다는 생각이다.

서버가 아무리 많이 늘어나고, 서비스가 아무리 많이 늘어나도 playbook 파일만 있으면 이를 모든 서버에서 실행만 시키면 모두 동일한 서버 일을 할 수 있는 툴(?)이다.

이걸 deploy 에 이용하기로 했다.

즉 , 

0. playbook 을 이용해서 

1. ECR 에서 필요한 docker image 를 EC2 로 가져오고 (pull)

2. 가져온 docker image 를 실행시키자 (run)

는 아이디어다.

 

 

1. 사전 준비

ansible playbook 을 이용해서 원격으로 서버를 관리하기 위해서는 원격 서버에 대한 정보 (주소) 를 제어하는 컴퓨터(여기서는 젠킨스 형님이 설치된 서버가 되겠지?) 의 host 파일로 관리해야 한다.

필자의 젠킨스 서버는 리눅스 OS 사용중이어서 /etc/ansible/hosts 파일에 관련 정보를 기록했다.

(ansible hosts 파일에 대해서 알아야 한다면 역시 인터넷 세상이나 강의를 듣는것을 추천한다)

 

[hosts file]

 

이제 젠킨스 파이프라인 스크립트를 살펴볼 차례다.

 

2. 환경변수 셋업

먼저 필요한 환경 변수를 셋업한다.

 

앞에서도 얘기했지만 필자는 문제 발생시 히스토리 추적을 위해 젠킨스 build number 를 중요하게 생각했고 이를 매개체로 계속 정보를 남겨야 하기에 여기에서도 빌드 번호를 남겨야 한다. (유일한 수작업 부분)

** 필자는 반복적인 git commit 메세지를 매번 타이핑하기 귀찮아서 주석으로 달고 복붙해서 필요한 부분만 고쳐서 사용한다.

 

빌드번호는 각 프로젝트의 젠킨스 대쉬보드 페이지등에서 확인할 수 있다.

 

3. AWS 인증 단계 셋업

이건 앞에서 한 인증과 동일하다.

1. ECR에 Docker image push (3/3)

=> 위 페이지의  [1>  AWS Login from jenkins] 부분과 동일하게 설정하면 된다.

 

4. 배포전 Pre 단계 셋업

무작정 배포할수도 있겠지만 Docker 의 경우 이전 이미지와 컨테이너들이 문제가 될 소지가 있다.

따라서 필자는 배포전 pre 단계를 둬서 기존에 돌고 있던 docker container 를 중지하고 이미지 및 컨테이너를 모두 정리했다.

EC2 를 깨끗한 환경으로 만든 후에 새로운 릴리즈를 하기 위함이다.

stage('Pre-Deploy step') {
    steps {
        script {
            sh "ansible-playbook -i /etc/ansible/hosts ./pre-deploy-playbook.yml -e ecr_url=${ECR_URL}"
        }
    }
}

* ansible-playbook 이라는 명령어로 playbook file 을 실행시킨다.

* -i : aws 서버 접속을 위해 hosts file 의 경로 설정

* ./pre-deploy-playbook.yml : 실행된 playbook file 설정

* -e : extra variable로 ECR의 URL 설정 (설정된 playbook.yml 파일에서 -e 로 선언된 변수를 사용할 수 있다.)

 

pre-deploy-playbook.yml 에서 하는 일은?

- hosts: aws
  become: yes
  tasks:
    # 1. get authentification
    - name: Login to AWS ECR
      shell: |
        aws ecr get-login-password --region ap-southeast-1 | docker login --username AWS --password-stdin {{ ecr_url }}
      environment:
        AWS_ACCESS_KEY_ID: "xxxxxx"
        AWS_SECRET_ACCESS_KEY: "xxxxxxx"

    # 2. copy sh file to ECR
    - name: Copy script file to ECR
      copy:
        src: ./pre_deploy.sh
        dest: /home/ec2-user/xxx/deployment/pre_deploy.sh
        mode: '0755' # 실행 권한 부여

    # 3. Run sh file
    - name: Run script
      command: /home/ec2-user/xxx/deployment/pre_deploy.sh

* AWS ECR 에 로그인한다

* pre_deploy.sh 파일을 aws ec2 서버에 복사하고 권한 부여

* 위 파일 실행

 

다시 pre_deploy.sh 를 봐야겠지?

#!/bin/sh

# stop all docker containers
docker stop $(docker ps -q)

# remove all docker containers
docker rm $(docker ps -a -q)

# remove all docker images
docker rmi $(docker images -q)

# clear cache
docker system prune -a -f

* 별거없다. docker 정리를 하는게 전부다.

 


Prev << 1. ECR에 Docker image push (3/3).                                                                Next >> 2. EC2에서 Pull & Run (2/3)

'자동배포 (Auto deploy)' 카테고리의 다른 글

1. ECR에 Docker image push (2/3)  (0) 2024.10.31
1. ECR에 Docker image push (3/3)  (1) 2024.10.31
2. EC2에서 Pull & Run (2/3)  (0) 2024.10.31
2. EC2에서 Pull & Run (3/3)  (2) 2024.10.31
3. 릴리즈 담당자가 할일  (0) 2024.10.31