[AWS]Docker & CodeDeploy & Jenkins 배포 자동화2 본문

AWS

[AWS]Docker & CodeDeploy & Jenkins 배포 자동화2

giron 2021. 8. 13. 17:29
728x90

Jenkins와 Docker를 사용하여 배포 자동화 연습을 해보려고 한다. 예전에 젠킨스 실습해본다고 했었는데 워낙 바쁘다보니(바쁜척) 이제 시작한ㄷ..ㅏ..ㅎ^^

 

우선 코드 간략히만 적고 시작하겠다.

scripts/deploy.sh (이전에 ec2에 app디렉토리 만들어야 할 것이다.)

#!/bin/bash
BUILD_JAR=$(ls /home/ec2-user/app/*.jar)     # jar가 위치하는 곳
JAR_NAME=$(basename $BUILD_JAR)
echo "> build 파일명: $JAR_NAME"

echo "> build 파일 복사"
DEPLOY_PATH=/home/ec2-user/
cp $BUILD_JAR $DEPLOY_PATH

echo "> 현재 실행중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f $JAR_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
  echo "> kill -15 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포"
nohup java -jar $DEPLOY_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/deploy_err.log &

appspec.yml

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ec2-user/app/  # EC2 내부 배포 할 위치
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
    - location: scripts/deploy.sh    # ApplicationStart 단계에서 해당 파일을 실행해라
      timeout: 60
      runas: ec2-user

Dockerfile

 #!/bin/bash -li
FROM openjdk:11-jre-slim-buster
ARG JAR_FILE=build/libs/naverapi-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

ec2 한 개 구입해주고 접속해준다.

sudo amazon-linux-extras list

33번이 open jdk였던 기억이었다. 

sudo amazon-linux-extras install 33

이후 java -version을 확인해주면 잘 설치되었다. 

mkdir -p local/jenkins
cd local/jenkins

우선 local에 젠킨스 폴더를 만들어주었고, jenkins.io에 가서 젠킨스 다운 링크를 복사해서 ec2에 설치해준다.

wget https://get.jenkins.io/war-stable/2.289.3/jenkins.war

그리고 깃을 설치해준다.

sudo install yum git -y

도커도 설치해준다,.

sudo install yum docker -y
sudo systemctl start docker
ps -ef | grep docker

도커가 뜬 거까지 확인해준다. 그리고 rsa알고리즘으로 ssh 키를 만들어준다.

ssh-keygen -t rsa

그러면 .ssh/id_rsa 여기에 private key가 만들어지고, id_rsa.pub은 퍼블릭 키가 만들어질 것이다.

확인했으면 다시 젠킨스 폴더로 가서, 

java -jar jenkins.war

젠킨스를 실행해본다. 이때 젠킨스 비밀번호가 나오는데 잘 갖고 있도록 하고, 다시 aws로 넘어가서 인바운드 규칙을 설정한다.

이렇게 8080 포트를 열어 놓는다. 이제 주소창에 ec2의 주소를 입력하고 :8080을 붙이면 젠킨스에 들어가질 것이다!!!

password에 아까 ec2에서 얻은 값을 넣어주면 된다.

왼쪽을 눌러 설치해주면 된다. 설치가 완료되면

 

계정을 만들어주고, save 해주면 url입력창이 나오는데 나중에 수정할 수 있으니 일단 넘어가고 본다.  젠킨스에 로그인까지 되었으면 ec2 인스턴스를 만들어 보겠다. 처음 ec2만들 때와 비슷하게 만들면 된다.

다른 점은 프리티어로 2개 만들어주면 된다.

이후 편의상 app1, app2라는 이름으로 지어두겠다. 그리고 이번엔 새로 만든 app1의 ec2에 접속해보겠다. 그리고 docker만 설치하고 실행해준다.

 sudo yum install docker -y
 sudo systemctl start docker

이번엔 app2 ec2에 접속해서 똑같이 해준다. 그리고 새로운 젠킨스 ec2에 접속해준다.

cat ~/.ssh/id_rsa.pub

public 키를 복사해서 app1, 2 모두 .ssh폴더에 들어가서 authorized_key파일에 넣어주면 된다.

cd .ssh
vi authorized_keys

그리고 젠킨스 ec2 에서 접속하는데, 지금은 ec2-user이름이 동일하므로 뒤에 ip주소를 통해서 들어가 주고 Ctrl+D를 통해서 나올 수 있다. 각자 app1, app2로 연결해본다.

ssh {IP주소}

그 후 app1의 private IP4 를 복사한다. 그리고 젠킨스로 들어와 Configure System에 들어간다.

우선 플러그인부터 설치하자

ssh검색을 해서 install을 해준다.(젠킨스에 앱을 연결하기 위해서) 그리고 CodeDeploy도 검색하고 설치해준다.

들어가서 맨 아래에 가면 Publish over SSH 입력하는 곳이 생겼을 것이다.

위와 같이 입력해준다. HostName에 app1의 private IP4 주소를 넣어준다. app2도 마찬가지로 해서 저장하면 된다.

 

이제 젠킨스 아이템을 만들어보자!!

왼쪽의 newItem에 들어가고, 이름은 프로젝트 이름으로 지어주면 될 것 같다.

깃 주소와 브랜치를 입력해준다.

그리고 push 할 때마다 github에서 젠킨스에 Hook을 날려 자동으로 빌드할 수 있도록 GitHub hook Trigger을 선택해 준다.

 

AWS의 CodeDeployApplication이름과 배포 그룹의 이름을 넣고 S3버킷 이름 또한 넣어주면 된다.

AWS의 IAM의 accessKey와 secretKey를 넣어준다.

자신의 gitHub Repository에 와서 Setting에 Webhooks를 들어가서 다음처럼 설정해준다.

위처럼 파란불이 들어오면 이제부터 자동으로 CI를 젠킨스가 해줄 것이다. push가 들어올 때마다!

(CI끝) 

CD만 남았는데 EC2에 들어가서 다음 명령어를 쳐준다.

sudo yum install -y aws-cli
cd /home/ec2-user/ 
sudo aws configure 
wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
chmod +x ./install
sudo yum install ruby
sudo ./install auto 
sudo service codedeploy-agent status

이때 aws configure을 칠떄 IAM의 accessKey와 secretKey를 입력해주면 된다.

코드 deploy

다 입력했으면 위와 같이 뜰 것이다.

aws s3에 들어가서 bucket을 확인해보면 짜잔..!

날짜는 그냥 가렸다..ㅎ 들어가면 Dockerfile이랑 jar파일들이 잘 있을 것이다. 또한 배포도 성공했다.

<aws 배포가 실패가 나왔을 때, 내가 처리했던 방법들>

**************************************************************************************************************************

에이전트 로그 확인(CodeDeploy 에러 발생했을 때)

less /var/log/aws/codedeploy-agent/codedeploy-agent.log

*****************************************************************************************************************************

nginx error 로그 확인하기

sudo tail -f /var/log/nginx/error.log

**********************************************

InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile

위와 같은 에러가 나왔을 때는

sudo service codedeploy-agent restart

위와 같은 명령어를 입력하면 된다. 이게 안된다면 

sudo vim /etc/init.d/codedeploy-startup.sh

를 입력하고 스크립트 내용을 아래로 채워준다.

#!/bin/bash

echo 'Starting codedeploy-agent'
sudo service codedeploy-agent restart
 sudo chmod +x /etc/init.d/codedeploy-startup.sh

이렇게 하니깐 되었다!

******************************************************************************************

[에러]

Parameter 0 of constructor in com.springshop.naverapi.aws.S3TestController required a bean of type 'com.springshop.naverapi.aws.S3Uploader' that could not be found.

 

해결: 전부 같은 profile에 넣음

********************************************************************************************************************

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cloud.aws.core.env.ResourceIdResolver.BEAN_NAME': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stackResourceRegistryFactoryBean' defined in class path resource [org/springframework/cloud/aws/autoconfigure/context/ContextStackAutoConfiguration$StackAutoDetectConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.aws.core.env.stack.config.StackResourceRegistryFactoryBean]: Factory method 'stackResourceRegistryFactoryBean' threw exception; nested exception is com.amazonaws.services.cloudformation.model.AmazonCloudFormationException: User: arn:aws:sts::437749522917:assumed-role/Auto-Scaling-giron-Role/i-0465e6f5b3b374c11 is not authorized to perform: cloudformation:DescribeStackResources (Service: AmazonCloudFormation; Status Code: 403; Error Code: AccessDenied; Request ID: 581784b7-822c-45d6-94c5-d0c1abb88cf4)

[해결]

application.properties 파일에 cloud.aws.stack.auto=false 추가

**********************************************************************************************************************

젠킨스 배포 시 yml파일 관리하려면, 

1. gitlab같은 private 리포지토리를 사용
2. 서버측 컴퓨터의 env에 등록하고 주입 받아 사용
3. jasypt로 암호화해서 사용

4. AWS 사용하시니 민감 정보는 Parameter store 에 저장해놓고 가져오기

환경 변수 설정 예시

# env var
DATABASE_USERNAME=giron
DATABASE_PASSWORD=pass

# config file 
...
spring.datasource.username=$DATABASE_USERNAME
spring.datasource.password=$DATABASE_PASSWORD
...

내가 사용한 방법

 ~/.aws/credentials

[stratospheric]
aws_access_key_id=ACCESSKEY_ID
aws_secret_access_key=SECRET_KEY_ID
region=ap-northeast-2

환경변수 적용

***********************************************************************************************************************

[mysql 접속 에러 (버전차이)]

https://www.fatalerrors.org/a/authentication-plugin-caching-_-sha2_-password.html

위 링크 따라하면 끝

 

Error 2059 (HY000) when connecting to mysql: authentication plugin 'caching'_ sha2_ password'

When testing mysql 8.0 today, I found such a problem when connecting to mysql remotely # mysql -h10.254.73.103 ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open

www.fatalerrors.org

***********************************************************************************************************************

[jenkins 설정파일 없을 때] (설치안될 때)

[Error]

--> Finished Dependency Resolution  
 Error: Package: jenkins-2.303.1-1.1.noarch (jenkins)  
       Requires: daemonize  
  You could try using --skip-broken to work around the problem  
  You could try running: rpm -Va --nofiles --nodigest

[해결]

sudo amazon-linux-extras install epel
sudo yum install daemonize -y
sudo yum install jenkins -y

***********************************************************************************************************************

 

 

***********************************************************************************************************************

 

Reference

 

깡통 EC2에 CodeDeploy로 배포하기 까지 필요한 작업

1. 업데이트가 필요하면 경고가 발생하니 필요시 진행 sudo yum update sudo 2. java는 안깔려 있거나 7버전 깔려잇으므로 설치 yum install -y java-1.8.0-openjdk-devel.x86_64 2-1. 7버전 깔려있는경우 8버전을..

dreaming-soohyun.tistory.com

 

728x90
Comments