DevOps/JENKINS

[Jenkins] SSH로 AWS EC2 원격접속하여 Tomcat Server 배포하기

IT록흐 2023. 11. 3. 11:42
반응형

 

 

Jenkins를 사용하여 AWS EC2에 원격접속하여 Tomcat Server를 배포하려고 한다. 

 

이번 포스팅은 로컬환경에 도커환경에 구성되어 있고 AWS EC2가 생성되어 로컬환경에서 SSH 원격접속이 가능하다는 가정 하에 진행해보겠다.

 

 

1. 로컬환경 Docker 컨테이너에 Jenkins 띄우기 

 

docker run -d -p 8080:8080 --name jenkins -u root jenkins/jenkins:lts

 

 

localhost:8080

 

 

Jenkins를 도커 컨테이너에 띄우고 localhost:8080으로 접속하면 초기패스워드 작성화면이 나온다. 

 

docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

 

 

 

docker exec 명령어로 컨테이너에 접속해서 initAdminPassword 파일을 열어보면 초기패스워드를 알 수 있다. 패스워드를 입력하면 플러그인 설치 화면으로 넘어간다. 

 

 

 

플러그인을 설치하고 Admin 계정을 생성하면 Jenkins를 사용할 수 있다. 

 

 

 

2. SSH Agent 플러그인 설치하기

 

 

SSH Agent는 SSH 원격접속 과정에서 필요한 Credential를 Jenkins 빌드 과정에 제공하는 플러그인이다. 자세한 사용법은 뒤에서 다루어보겠다. 우선 설치를 해보자. 

 

Jenkins 관리 > Plugins
Available plugins > SSH Agent 입력
메인페이지로 돌아가기

 

 

SSH Agent 설치가 완료되면 우리는 언제든 빌드과정에서 Credential를 제공할 수 있다. 그럼 이번에는 Credential를 등록해보자. 

 

 

3. SSH Pem 파일 Credential 등록하기

 

AWS EC2 인스턴스를 생성하면 SSH 원격접속에 필요한 PEM 파일을 제공 받는다. 우리는 로컬환경이 아닌 젠킨스에서 EC2에 접근할 것이므로 젠킨스에 PEM 파일을 등록해야 한다. 

 

 

 

Credential의 kind를 SSH username with private key로 변경한다.

 

ID는 Credential 이름을, Username에는 EC2 인스턴스에 SSH 원격접속할 User 계정을, Private Key는 Enter directly를 눌러 PEM 파일에 저장된 key데이터를 입력한다. 

 

ID : EC2_SSH

Username : ubuntu

PrivateKey : Pem 파일 데이터

 

SSH Agent가 Credential에 접근할 때 ID를 참고한다.

그럼  Jenkins Job을 생성해보자. 

 

 

4. Jenkins Job 생성하기 

 

이제 AWS EC2에 Tomcat을 배포하는 작업을 진행해보자. 

 

 

 

파이프라인 스크립트 입력란에 아래 스크립트를 입력한다. 

 

https://github.com/mgKang3646/Goorm-Pratice3/blob/main/jenkinsfile

pipeline {
    agent any
    
    environment {
        awsUrlA = '3.35.20.163' // EC2 PublicIP
        awsUrlB = '13.209.35.98' // EC2 PublicIP
    }

    stages {
        // EC2에 JDK 설치하기
        stage('JDK Install'){
            steps{
                installJDK(awsUrlA)
                installJDK(awsUrlB)
            }
        }
        // EC2에 Tomcat 압축파일 배포하기
        stage('Tomcat Deploy'){
            steps{
                tomcatDeploy(awsUrlA)
                tomcatDeploy(awsUrlB)
            }
        }
        // Tomcat 압축파일 해제 후 Tomcat 실행하기
        stage('Tomcat Start'){
            steps{
                tomcatStart(awsUrlA)
                tomcatStart(awsUrlB)
            }
        }
    }
}

def installJDK(awsUrl){
    sshagent(['EC2_SSH']) { // Credential ID로 SSH Agent가 원격접속 시도
        sh """
        ssh -o StrictHostKeyChecking=no ubuntu@${awsUrl} '
        sudo apt update
        sudo apt-get install -y openjdk-11-jdk
        '
        """
    }      
}

def tomcatDeploy(awsUrl){
    sshagent(['EC2_SSH']) { // Credential ID로 SSH Agent가 원격접속 시도
        sh "scp /root/apache-tomcat-9.0.82.tar.gz ubuntu@${awsUrl}:/home/ubuntu"
    }        
}

def tomcatStart(awsUrl){
    sshagent(['EC2_SSH']) { // Credential ID로 SSH Agent가 원격접속 시도
        sh """
            ssh -o StrictHostKeyChecking=no ubuntu@${awsUrl} '
            tar xvzf /home/ubuntu/apache-tomcat-9.0.82.tar.gz 
            sh /home/ubuntu/apache-tomcat-9.0.82/bin/startup.sh
            '
        """
    }
}

 

 

두 개의 EC2 인스턴스에 배포할 것이다.  빌드과정은 아래와 같다.

 

1) EC2에 JDK 환경 구성하기

2) EC2에 톰캣 압축파일 배포하기

3) 톰캣 압축파일 풀고 톰캣 실행하기 

 

EC2에 원격접속하여 명령어를 실행하려면 SSH 접속 계정과 비밀번호를 입력해야 한다. 이 과정을 SSH Agent가 자동화한다. SSH Agent가 미리 만들어 놓은 Credential에 접근하여 SSH 원격접속을 시도한다. 원격접속에 성공하면 블록 안의 명령어를 실행한다. 

 

 

5. 젠킨스 서버에 톰캣 압축파일 설치하기 

 

EC2에 톰캣 압축파일을 배포하려면 우선 젠킨스 서버에 배포할 톰캣 압축파일이 존재해야 한다. 젠킨스 도커 컨테이너 안으로 접속해보자.

 

- 젠킨스 도커 컨테이너에 접속하기

docker exec -it jenkins /bin/bash

 

- 톰캣 압축파일 wget으로 설치하기 

apt update
apt-get install wget
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.82/bin/apache-tomcat-9.0.82.tar.gz

 

 

 

 

6. 빌드하기 

 

그럼 이제 빌드를 진행해보자. 

 

 

 

'지금 빌드' 버튼을 누르면 빌드가 시작된다. 실패하면 빨간색이 성공하면 초록색으로 나타난다. 세 단계를 모두 성공하면 실제 EC2에 톰캣서버가 띄워졌는지 확인해보자. 

 

 

 

 

 

톰캣서버는 8080 포트를 오픈한다. EC2 인스턴스도 8080 포트를 인바운드 규칙으로 오픈하면 EC2의 Public IP로 톰캣서버에 접속이 가능하다. 

 

 


 

 

 

참고자료

 

SSH Agent

This plugin allows you to provide SSH credentials to builds via a ssh-agent in Jenkins.

plugins.jenkins.io

 

Jenkins를 이용한 CI/CD Pipeline 구축 - 인프런 | 강의

본 강의는 클라우드 네이티브 애플리케이션을 구성하는 4가지 핵심 요소(MSA, CI/CD, DevOps, Container) 중 하나인 CI(Continuous Integration, 지속적인 통합)과 CD(Continuous Deployment, 지속적인 배포) 파이프라...

www.inflearn.com

 

반응형