[CI/CD Pipeline] 6. AWS + CICD
- 배포를 위한 AWS Cloud 환경 구성하기
- 이미지를 이용하여 AWS EC2 생성하기
- AWS EC2에 Jenkins 서버 설치하기
- AWS EC2에 Docker 서버 설치하기
- AWS EC2에 Tomcat 서버 설치하기
- AWS EC2에 Ansible 서버 설치하기
- AWS EC2에 SonarQube 설치하기
- Jenkins 를 이용하여 Tomcat 서버에 배포하기
- Jenkins 를 이용하여 Docker 서버에 배포하기
- Jenkins 를 이용하여 Ansible 서버에 배포하기
배포를 위한 AWS Cloud 환경 구성하기
AWS Cloud 실습 환경 구성도
- 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를 이미지화
- 이미지를 public 상태로 만들게되면 공유할 수 있다.
- 생성된 이미지를 통해 기본 시스템(java11, …)이 설치된 인스턴스를 쉽게 만들 수 있다.
이미지를 통해 인스턴스 생성
- 이미지에 해당하는 인스턴스의 키 페어를 선택
- 이미지에 해당하는 인스턴스의 보안 그룹을 선택
- Tomcat 서버, Docker 서버, SonarQube 서버, Ansible 서버를 위해 4개의 인스턴스 생성
- 이렇게 만든 5개의 인스턴스는 같은 네트워크에 묶여있기 때문에 동일한 VPC ID를 갖는다.
- VPC(Virtual Private Cloud)는 기존의 가상 사설 네트워크망을 구성할 때 VPN 이라는 용어를 사용하는데 AWS 에서는 사설 네트워크망을 클라우드 형태로 사용하고 있기 때문에 VPC 라고한다.
- VPC 는 가상 네트워크이기 때문에, 가상 네트워크에 묶여있는 PC 들간의 통신을 할 때 아무런 제약이 없다.
- 따라서 이제는 각 PC 통신 간에 private IP 를 통해서 통신이 가능하다.
인스턴스 간 통신을 위한 인바운드 규칙 편집
- 앞에서 설정한 보안그룹을 선택해준다.
- 정상적으로 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
커맨드를 통해 변경사항 적용
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
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
- 기존 접속 경로를
127.x.x.x
으로 제한된 부분을 주석처리함으로써 모든 접속을 허용
./webapps/host-manager/META-INF/context.xml
./conf/tomcat-users.xml
AWS EC2에 Ansible 서버 설치하기
sudo amazon-linux-extras install epel -y
sudo yum install –y ansible
hosts 파일 수정
sudo vi /etc/ansible/hosts
ssh 접속을 위한 키 복사
ssh-keygen -t rsa
생성된 public 키(id_rsa.pub
)를 docker, tomcat 서버에 복사
Ansible 서버의 public 키 복사
cd ~
cat .ssh/id_rsa.pub
Ansible 서버의 public 키 Tomcat 서버의 .ssh/authorized_keys
복사
Ansible 서버의 public 키 Docker 서버의 .ssh/authorized_keys
복사
ping 테스트
ansible docker -m ping
ansible tomcat -m ping
localhost 에도 마찬가지로 public 키를 복사해야한다.
AWS EC2에 SonarQube 설치하기
SonarQube 는 앞 예제에서 사용한 ec2 t2.micro 타입인 경우에 리소스 부족으로 정상적인 서비스가 어려울 수 있기 때문에 최소 t2.small 타입으로 진행해야한다.
EC2 인스턴스 타입 변경
t2.micro -> t2.small
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
- default port 번호가 9000
SonarQube 실행
cd sonarqube-7.6/
./bin/[사용하는 OS]/sonar.sh start # ./bin/linux-x86-64/sonar.sh start
SonarQube 테스트
- 9000번 포트 open
http://[public ip address]:9000/
- 초기 ID: admin
- 초기 PW: admin
Token 발급
Jenkins 를 이용하여 Tomcat 서버에 배포하기
Maven, Deploy to Container 플러그인 설치
Maven 설정
/opt/maven
: Jenkins 서버에 설치한 Maven 의 Home 디렉토리
Project 생성 및 설정
- Credential 생성
결과
Jenkins 빌드된 결과물
Tomcat에 배포된 결과물
Jenkins 를 이용하여 Docker 서버에 배포하기
Jenkins 서버에서 Docker 서버로 ssh 접속을 위한 키 배포
- Jenkins 서버에서
ssh-keygen
명령어로 생성된 public 키 복사
- Docker 서버에 Jenkins 서버 public 키 붙여넣기
publish over ssh 플러그인 설치
Docker 서버에 Dockerfile 생성
FROM tomcat:9.0
COPY ./hello-world.war /usr/local/tomcat/webapps
publish over ssh 설정
- Jenkins 서버에서
ssh-keygen
명령어를 통해 생성한 public 키를 Docker 서버에 복사하였고, Jenkins 서버에서 Docker 서버로 접속할 때는 private 키(id_rsa
)를 가지고 접속을 시도하여 매칭을 통해 접속 여부를 결정한다. - Jenkins 의 ssh 설정 정보에 private 키를 등록해야지 Docker 서버로 접속이 가능하다.
Project 생성 및 설정
결과
Jenkins 를 이용하여 Ansible 서버에 배포하기
Jenkins 에서 ssh 접속을 위한 Ansible 서버 등록
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 생성 및 설정
결과