Blog

[Spring][258] CI/CD AWS Ec2 서버 다중 배포

Category
Author
Tags
PinOnMain
1 more property

시작 전에 점검

토픽 점검

main Server 카프카 정상 할당 점검

traffic Server 카프카 정상 할당 점검

웹 서비스 정상 동작 확인

카프카 서버 정상 동작 확인

메인 및 트래픽 서버 각각 2대로 증가시켜서 동작

1. 각 토픽에 대한 파티션을 2개씩 설정 및 확인

2. 각 서버 파티션 할당 확인

Main Server
Traffic Server

3. AWS의 메인서버, 트래픽서버 & 로컬 서버의 메인서버, 트래픽 서버를 통해 2To2 방식 정상 작동 테스트

정상 동작 확인했습니다.

CI/CD 한번에 배포

현재는 group Id를 설정하기에 각각의 웹 어플리케이션이 약간 다른 상황입니다. 이를 어떻게 하면 CI/CD를 통해 간편하게 적용시킬 수 있을까?
환경변수를 사용하면 되지 않을까?
인텔리제이에서 환경변수를 사용하며 빌드하는 것이 성공하는 걸 확인 한 이후 github action에 적용해 보겠습니다.

인텔리제이

위의 결과처럼 정상적으로 환경변수가 반영되어 나오는 것을 확인 할 수 있습니다.
그럼 이를 Github Action에 적용하기 전에 CI/CD를 위한 AWS 작업을 먼저 하겠습니다.

AWS

인스턴스를 하나 더 만든 후 배포를 위해 codedeploy 역시 설치 완료 하였습니다.
배포 워크 파일
name: Java CI with Gradle on: push: branches: [ "deployTest"] # 본인이 설정한 값을 여기서 채워넣습니다. # 리전, 버킷 이름, CodeDeploy 앱 이름, CodeDeploy 배포 그룹 이름 env: AWS_REGION: ap-northeast-2 S3_BUCKET_NAME: team258-bucket permissions: contents: read jobs: deploy1: name: Deploy to Server 1 runs-on: ubuntu-latest environment: production env: CODE_DEPLOY_APPLICATION_NAME: team258-codedeploy-app CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: team258-codedeploy-deployment-group GROUP_ID: 1 steps: # (0) 환경 변수 Group id를 위해 파일 생성 # - name: Create env file # run: echo "GROUP_ID=${{ env.GROUP_ID }}" > env.sh # (1) 기본 체크아웃 - name: Checkout uses: actions/checkout@v3 - name: Check current working directory run: pwd - name: List directory contents run: ls -al # (2) JDK 17 세팅 - name: Set up JDK 17 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' # (3.5) properties 파일 수정 - name: Update properties file run: | sed -i "s/spring.datasource.password=.*/spring.datasource.password=${{ secrets.DB_PASSWORD }}/" src/main/resources/application.properties # (3) Gradle build (Test 제외) - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle uses: gradle/gradle-build-action@v2.6.0 with: arguments: build # (4) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용) - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ env.AWS_REGION }} # # (5) 빌드 결과물을 S3 버킷에 업로드 - name: Upload to AWS S3 run: | aws deploy push \\ --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\ --ignore-hidden-files \\ --s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \\ --source . # (6) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행 - name: Deploy to AWS EC2 from S3 run: | aws deploy create-deployment \\ --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\ --deployment-config-name CodeDeployDefault.AllAtOnce \\ --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \\ --s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip deploy2: name: Deploy to Server 2 runs-on: ubuntu-latest environment: production env: CODE_DEPLOY_APPLICATION_NAME: team258-codedeploy-app2 CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: team258-codedeploy-deployment-group2 GROUP_ID: 2 steps: # (0) 환경 변수 Group id를 위해 파일 생성 - name: Checkout uses: actions/checkout@v3 - name: Check current working directory run: pwd - name: List directory contents run: ls -al # (2) JDK 17 세팅 - name: Set up JDK 17 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' # (3.5) properties 파일 수정 - name: Update properties file run: | sed -i "s/spring.datasource.password=.*/spring.datasource.password=${{ secrets.DB_PASSWORD }}/" src/main/resources/application.properties # (3) Gradle build (Test 제외) - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle uses: gradle/gradle-build-action@v2.6.0 with: arguments: build # (4) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용) - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ env.AWS_REGION }} # # (5) 빌드 결과물을 S3 버킷에 업로드 - name: Upload to AWS S3 run: | aws deploy push \\ --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\ --ignore-hidden-files \\ --s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \\ --source . # (6) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행 - name: Deploy to AWS EC2 from S3 run: | aws deploy create-deployment \\ --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \\ --deployment-config-name CodeDeployDefault.AllAtOnce \\ --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \\ --s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip
Plain Text
복사
그럼 이제 각각의 서버에 환경 변수를 다르게 해서 한번에 배포하겠다.
배포 결과
위처럼 정상적으로 배포 된 것을 확인 할 수 있습니다.
현재 메인 서버2를 로드밸런서에 추가하지 않아서 현재는 ip로 조회하였다.
그럼 이제 로드 밸런서에 추가하는 작업을 진행 하겠습니다.
로드 밸런서 대상그룹에 등록 하였고 정상적으로 들어 갔음을 확인할 수 있습니다.