[CI/CD Pipeline] 6. AWS + CICD

배포를 위한 AWS Cloud 환경 구성하기

AWS Cloud 실습 환경 구성도

img.png

  • Jenkins 에서 빌드 후 Tomcat 서버나, Docker 서버에 배포를 진행
  • Jenkins 에서 빌드한 결과물을 Ansible 에 전달하여 Tomcat 서버, Docker 서버, sonarQube 서버에 배포를 진행한다.
    • Jenkins server: 8080 port
    • Docker server: 22 port
    • Tomcat server: 8080 port
    • Ansible server: 22 port
    • SonarQube server: 9000 port

이미지를 이용하여 AWS EC2 생성하기

java 가 설치된 EC2를 이미지화

img_1.png

img_2.png

  • 이미지를 public 상태로 만들게되면 공유할 수 있다.
  • 생성된 이미지를 통해 기본 시스템(java11, …)이 설치된 인스턴스를 쉽게 만들 수 있다.

이미지를 통해 인스턴스 생성

img_3.png

img_4.png

  • 이미지에 해당하는 인스턴스의 키 페어를 선택
  • 이미지에 해당하는 인스턴스의 보안 그룹을 선택
  • Tomcat 서버, Docker 서버, SonarQube 서버, Ansible 서버를 위해 4개의 인스턴스 생성

img_5.png

img_6.png

  • 이렇게 만든 5개의 인스턴스는 같은 네트워크에 묶여있기 때문에 동일한 VPC ID를 갖는다.
  • VPC(Virtual Private Cloud)는 기존의 가상 사설 네트워크망을 구성할 때 VPN 이라는 용어를 사용하는데 AWS 에서는 사설 네트워크망을 클라우드 형태로 사용하고 있기 때문에 VPC 라고한다.
  • VPC 는 가상 네트워크이기 때문에, 가상 네트워크에 묶여있는 PC 들간의 통신을 할 때 아무런 제약이 없다.
  • 따라서 이제는 각 PC 통신 간에 private IP 를 통해서 통신이 가능하다.

인스턴스 간 통신을 위한 인바운드 규칙 편집

img_7.png

  • 앞에서 설정한 보안그룹을 선택해준다.

img_8.png

  • 정상적으로 ping 테스트를 성공

AWS EC2에 Jenkins 서버 설치하기

Amazon Linux 에 확장 패키지 설치

확장 패키지를 설치하는 목적은 사용 중인 Linux 에 추가적인 Dependency 패키지를 한꺼번에 설치할 수 있다.

sudo amazon-linux-extra install epel -y

Maven 설치

sudo amazon-linux-extra install epel -y
cd /opt
ls -ltr
sudo wget https://mirror.navercorp.com/apache/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
sudo tar -xvf apache-maven-3.8.6-bin.tar.gz
sudo mv apache-maven-3.8.6 maven
cd maven/

환경설정

vi ~/.bash_profile
source ~/.bash_profile
  • source 커맨드를 통해 변경사항 적용

img_9.png

Git 설치

sudo yum install -y git

Jenkins 설치

  • https://pkg.jenkins.io/redhat-stable/
sudo amazon-linux-extra install epel -y
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install jenkins

Java Jenkins 호환 문제를 해결하기 위해 Java 재설치 및 버전 변경

sudo amazon-linux-extras install java-openjdk11 
sudo /usr/sbin/alternatives --config java

img_10.png

Jenkins 실행

sudo systemctl status jenkins
sudo systemctl start jenkins

Jenkins 초기 암호 확인

cat /var/lib/jenkins/secrets/initialAdminPassword

AWS EC2에 Docker 서버 설치하기

Docker 설치

sudo amazon-linux-extras install epel -y
sudo yum install –y docker

Docker 실행

sudo usermod -aG docker ec2-user (인스턴스 재 접속)
sudo service docker start
docker run hello-world

AWS EC2에 Tomcat 서버 설치하기

sudo amazon-linux-extras install epel -y
cd /opt
sudo wget https://mirror.navercorp.com/apache/tomcat/tomcat-9/v9.0.70/bin/apache-tomcat-9.0.70.tar.gz
chmod +x /opt/apache-tomcat-9.0.70.tar.gz
chmod +x bin/startup.sh
chmod +x bin/shutdown.sh

Tomcat 실행

sudo /opt/apache-tomcat-9.0.70/bin/startup.sh

Tomcat 제한 제거, 계정 권한 추가

sudo vi ./webapps/manager/META-INF/context.xml # 제한 제거
sudo vi ./webapps/host-manager/META-INF/context.xml # 제한 제거
sudo vi ./conf/tomcat-users.xml # 계정 권한 추가
sudo ./bin/shutdown.sh
sudo ./bin/startup.sh

./webapps/manager/META-INF/context.xml

img_11.png

  • 기존 접속 경로를 127.x.x.x 으로 제한된 부분을 주석처리함으로써 모든 접속을 허용

./webapps/host-manager/META-INF/context.xml

img_12.png

./conf/tomcat-users.xml

img_13.png

img_14.png

AWS EC2에 Ansible 서버 설치하기

sudo amazon-linux-extras install epel -y
sudo yum install –y ansible

hosts 파일 수정

sudo vi /etc/ansible/hosts

img_15.png

ssh 접속을 위한 키 복사

ssh-keygen -t rsa

img_16.png

생성된 public 키(id_rsa.pub)를 docker, tomcat 서버에 복사

Ansible 서버의 public 키 복사

cd ~
cat .ssh/id_rsa.pub

img_17.png

Ansible 서버의 public 키 Tomcat 서버의 .ssh/authorized_keys 복사

img_18.png

Ansible 서버의 public 키 Docker 서버의 .ssh/authorized_keys 복사

img_19.png

img_20.png

ping 테스트

ansible docker -m ping
ansible tomcat -m ping

img_21.png

localhost 에도 마찬가지로 public 키를 복사해야한다.

AWS EC2에 SonarQube 설치하기

SonarQube 는 앞 예제에서 사용한 ec2 t2.micro 타입인 경우에 리소스 부족으로 정상적인 서비스가 어려울 수 있기 때문에 최소 t2.small 타입으로 진행해야한다.

EC2 인스턴스 타입 변경

t2.micro -> t2.small

img_22.png

SonarQube 설치

sudo amazon-linux-extras install epel -y
sudo mkdir /opt/sonarqube
cd /opt/sonarqube
sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.6.zip
sudo unzip sonarqube-7.6.zip
sudo chown -R ec2-user:ec2-user /opt/sonarqube/

SonarQube 설정 파일

/opt/sonarqube/sonarqube-7.6/conf/sonar.properties

img_23.png

  • default port 번호가 9000

SonarQube 실행

cd sonarqube-7.6/
./bin/[사용하는 OS]/sonar.sh start # ./bin/linux-x86-64/sonar.sh start

SonarQube 테스트

img_24.png

  • 9000번 포트 open

http://[public ip address]:9000/

img_25.png

  • 초기 ID: admin
  • 초기 PW: admin

Token 발급

img_26.png

Jenkins 를 이용하여 Tomcat 서버에 배포하기

Maven, Deploy to Container 플러그인 설치

Maven 설정

img_27.png

  • /opt/maven: Jenkins 서버에 설치한 Maven 의 Home 디렉토리

Project 생성 및 설정

img_28.png

img_29.png

img_30.png

img_31.png

img_32.png

  • Credential 생성

img_33.png

결과

Jenkins 빌드된 결과물

img_34.png

Tomcat에 배포된 결과물

img_35.png

Jenkins 를 이용하여 Docker 서버에 배포하기

Jenkins 서버에서 Docker 서버로 ssh 접속을 위한 키 배포

img_36.png

  • Jenkins 서버에서 ssh-keygen 명령어로 생성된 public 키 복사

img_37.png

  • Docker 서버에 Jenkins 서버 public 키 붙여넣기

publish over ssh 플러그인 설치

Docker 서버에 Dockerfile 생성

FROM tomcat:9.0

COPY ./hello-world.war /usr/local/tomcat/webapps

publish over ssh 설정

img_38.png

img_39.png

  • Jenkins 서버에서 ssh-keygen 명령어를 통해 생성한 public 키를 Docker 서버에 복사하였고, Jenkins 서버에서 Docker 서버로 접속할 때는 private 키(id_rsa)를 가지고 접속을 시도하여 매칭을 통해 접속 여부를 결정한다.
  • Jenkins 의 ssh 설정 정보에 private 키를 등록해야지 Docker 서버로 접속이 가능하다.

Project 생성 및 설정

img_40.png

img_41.png

img_42.png

img_43.png

결과

img_44.png

img_45.png

Jenkins 를 이용하여 Ansible 서버에 배포하기

Jenkins 에서 ssh 접속을 위한 Ansible 서버 등록

img_46.png

Inventory 파일 & Playbook 파일 생성

hosts

[docker]
172.31.15.61

create-cicd-devops-container.yml

- hosts: all
  #   become: true

  tasks:
    - name: stop current running container
      command: docker stop my_cicd_project
      ignore_errors: yes

    - name: remove stopped cotainer
      command: docker rm my_cicd_project
      ignore_errors: yes

    - name: create a container using cicd-project-ansible image
      command: docker run --privileged -d --name my_cicd_project -p 8080:8080 yoon11/cicd-project-final

Project 생성 및 설정

img_47.png

img_48.png

결과

img_49.png

img_50.png


© 2023 Lee. All rights reserved.