ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS EC2 서버 인스턴스 변경(AWS 프리티어 갱신, 마이그레이션)
    웹/Project 2024. 4. 1. 14:24

    문제 상황

    - KAU 공지사항 알림이 서비스의 API 서버를 AWS EC2 서비스로 프로비저닝하고 있다.

    - AWS 프리티어 기간이 만료되어 기존 EC2 인스턴스를 온디맨드로 유지하게 되면 매달 10불 이상이 청구된다.

    - CloudFront, Route53은 기존 계정이 계속 관리하고 인스턴스의 소유 계정만 변경하여 비용 청구를 최소화 하고자 한다.

    - AWS EC2가 제공하는 AMI 복제 및 공유 기능을 활용하여 마이그레이션을 단 30분 내에 마칠 수 있다. (아키텍처에 따라 복잡성이 올라갈 것으로 예상된다)

     

    AMI는 Amazon Machine Image로, 인스턴스의 스냅샷을 생성하여 다른 인스턴스에 해당 스냅샷을 참조해 빠르게 인스턴스를 설정할 수 있게 해주는 서비스이다.

     

    AMI를 사용하지 않는다면 , 서버 앱이 동작하는 인스턴스에 이것저것 많이 설치되어 있고, 애플리케이션 파일 등이 존재할 때 이것들을 일일이 옮겨줘야 하지만 AMI를 사용해 빠르고 간편하게 동일한 인스턴스를 생성할 수 있다.

     

    기존 아키텍처

     

     

    서버 아키텍처는 위와 같다.

     

    과정

     

    - EC2 AMI 생성 및 공유

    - 공유받은 AMI를 활용해 EC2 인스턴스 생성

    - CloudFront 배포 변경

    - CI/CD: Github action 변경

     

    EC2 AMI 생성 및 공유

     

    - AWS 콘솔로 EC2 서비스 콘솔로 접근한 뒤, AMI 생성을 원하는 인스턴스를 선택하고 작업-이미지 및 탬플릿-이미지 생성을 선택

    - 이미지를 생성하고 완료될 때 까지 기다리자.

     

     

    - 이미지를 다 생성하였으면 해당 이미지를 선택한 뒤 작업-AMI 권한 편집 을 선택하여 위와 같은 창이 뜨도록 한다.

    - 공유 계정에 계정 ID를 추가한다. 나는 새로 만든 AWS 계정을 이곳에 추가하였다.

    - 이렇게 설정해두면 타 AWS 계정이 해당 이미지를 활용해 인스턴스를 생성할 수 있게 된다.

     

    공유받은 AMI를 통해 EC2 인스턴스 생성

     

     

    - 타 계정에서 인스턴스를 생성할 때 "더 많은 AMI 보기"를 클릭하여 타인이 공유해준 AMI를 찾는다.

    - 이 AMI를 활용해 인스턴스를 생성한다.

     

     

    - 인스턴스가 생성되어 성공적으로 접속한 모습

    - 처음 접속하였을 때 루트 계정으로 접속하였는데, 기존 애플리케이션 파일이 보이지 않아 당황스러웠다.
    기존에 인스턴스를 접근할 때 `ubuntu`로 접근한 것을 확인했고 `ubuntu`로 다시 연결해보니 내 애플리케이션 파일이 잘 보였다.

     

    API도 정상적으로 잘 동작하는 모습

    CI/CD 코드를 그대로 manual하게 입력하였는데 여기까지 정말 20분 정도 밖에 소요되지 않았다. (AMI 짱)

     

    Route 53 변경

     

     

    CloudFront의 원본을 도메인 네임으로 설정했기 때문에 CloudFront 배포는 변경할 것이 없었다.

    Route 53에 입력된 도메인 네임에 따른 A 레코드만 변경해주면 됐기 때문에 위 사진처럼 IP 주소를 변경하였다!

     

    Git Action 코드 변경

     

    인스턴스의 키 페어가 변경되어 Git Action을 통한 배포를 진행할 때 배포가 되지 않을 것이 예상되어 Git Action의 환경 변수를 바꾸어주었다.

     

    # SSH를 통한 접근 부분에서 오류가 날게 분명하다!
    # 환경 변수를 변경하여 예방했다.
      deploy:
        needs: build
        runs-on: ubuntu-22.04
        steps:
          - name: Download artifact
            uses: actions/download-artifact@v2
            with:
              name: cicd
          - name: Setup SSH
            uses: webfactory/ssh-agent@v0.8.0
            with:
              ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
          - name: SCP transfer
            run: scp -o StrictHostKeyChecking=no *.jar ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_DOMAIN_NAME }}:~/cicd
          - name: Execute built .jar file
            uses: appleboy/ssh-action@v1.0.3
            with:
              host: ${{ secrets.SERVER_DOMAIN_NAME }}
              username: ${{ secrets.SERVER_USERNAME }}
              key: ${{ secrets.SSH_PRIVATE_KEY }}
              script: |
                sudo fuser -k 80/tcp
                sudo systemctl restart redis-server
                sudo /usr/local/jdk-21/bin/java -jar ~/cicd/*-SNAPSHOT.jar > log.txt 2>&1 &

    댓글

Designed by Tistory.