23/11/02 프로젝트 작업 일지

song yuheon·2023년 11월 2일
1

Project

목록 보기
18/31

시작 전에 점검

토픽 점검

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 역시 설치 완료 하였습니다.

트러블 슈팅 : 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

그럼 이제 각각의 서버에 환경 변수를 다르게 해서 한번에 배포하겠습니다.

  • 배포 결과

위처럼 정상적으로 배포 된 것을 확인 할 수 있습니다.

현재 메인 서버2를 로드밸런서에 추가하지 않아서 현재는 ip로 조회하였습니다.

그럼 이제 로드 밸런서에 추가하는 작업을 진행 하겠습니다.

로드 밸런서 대상그룹에 등록 하였고 정상적으로 들어 갔음을 확인할 수 있습니다.

profile
backend_Devloper

0개의 댓글