1. 작업목적

Amazon Linux 2 의 지원 종료일 (EOL): 2026년 6월 30일로 명시

해당 OS 사용중인 EC2 가 있다면, EOL 이전에 OS 마이그레이션 필요

2. 작업순서

  1. AmazonLinux2023-GoldenAMI 생성

  2. 기존 EC2 와 동일한 설정(Subnet/Volume(kms)/SG) 과 AL2023 AMI 로 EC2 생성

  3. AL2023 EC2 접근 및 서버 기본 세팅 (os_set.sh)

    1. os user 생성
    2. 볼륨 디렉토리 생성
    3. hostname 변경
    4. LVM 패키지 설치
    5. Root ssh_config 허용
    6. hostname 보존 설정
    **# os_set.sh**
    
    #!/bin/sh
    #1.User 기입
    echo "1.생성할 유저기입(sysadm 및 root계정 패스워드 변경)";
    echo '{password}' | passwd --stdin sysadm;
    echo '{password}' | passwd --stdin root;
    echo "sysadm 패스워드 변경이 완료 되었습니다.";
    echo "1-1.추가 유저가 있을 경우 첫 번째 유저명을 기입해주세요.(유저 없을 경우 엔터)";
    read -a USER1;
    if [ -z "$USER1" ];
    then
            echo "기입할 유저가 없습니다.";
    else
            echo "1-2.두 번째 유저명을 기입해주세요.(유저 없을 경우 엔터)";
            read -a USER2;
            if [ -z "$USER2" ];
            then
                    echo "기입할 유저가 없습니다.";
            else
                    echo "1-3.세 번째 유저명을 기입해주세요.(유저 없을 경우 엔터)";
                    read -a USER3;
                    if [ -z "$USER3" ];
                    then
                            echo "기입할 유저가 없습니다.";
                    else 
                            echo "1-4.네 번째 유저명을 기입해주세요.(유저 없을 경우 엔터)";
                            read -a USER4;
                            if [ -z "$USER4" ];
                            then
                                    echo "기입할 유저가 없습니다.";
                            else
                                    echo "2-5.다섯 번째 유저명을 기입해주세요.(유저 없을 경우 엔터)";
                                    read -a USER5;
                                    if [ -z "$USER5" ];
                                    then
                                            echo "기입할 유저가 없습니다.";
                                    fi
                            fi
                    fi
            fi
    fi
    
    #2.볼륨기입
    echo "2.생성할 볼륨기입";
    echo "2-1.첫 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)";
    read -a VOL1;
    if [ -z "$VOL1" ];
    then
            echo "기입 할 볼륨이 없습니다.";
    else
            echo "2-2.두 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)";
            read -a VOL2;
            if [ -z "$VOL2" ];
            then
                    echo "기입할 볼륨이 없습니다.";
            else
                    echo "2-3.세 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)";
                    read -a VOL3;
                    if [ -z "$VOL3" ];
                    then
                            echo "기입할 볼륨이 없습니다.";
                    else
                            echo "2-4.네 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)";
                            read -a VOL4;
                            if [ -z "$VOL4" ];
                            then
                                    echo "기입할 볼륨이 없습니다.";
                            else
                                    echo "2-5.다섯 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)";
                                    read -a VOL5;
                                    if [ -z "$VOL5" ];
                                    then
                                            echo "기입할 볼륨이 없습니다.";
                                    fi
                            fi
                    fi
            fi
    fi
    
    #3.hostname 변경
    echo "3.Hostname 변경";
    echo "변경할 hostname 정보를 입력해주세요.";
    read -a HOSTNAME;
    hostnamectl set-hostname $HOSTNAME;
    echo "호스네임이 변경 되었습니다.";
    
    #4.유저생성
    # 첫 번째 유저명
    echo "4.유저생성";
    if [ -n "$USER1" ];
    then
            useradd $USER1;
            echo '{password}' | passwd --stdin $USER1;
    fi
    # 두 번째 유저명
    if [ -n "$USER2" ];
    then
            useradd $USER2;
            echo '{password}' | passwd --stdin $USER2;
    fi
    # 세 번째 유저명
    if [ -n "$USER3" ];
    then
            useradd $USER3;
            echo '{password}' | passwd --stdin $USER3;
    fi
    # 네 번째 유저명
    if [ -n "$USER4" ];
    then
            useradd $USER4;
            echo '{password}' | passwd --stdin $USER4;
    fi
    # 다섯 번째 유저명
    if [ -n "$USER5" ];
    then
            useradd $USER5;
            echo '{password}' | passwd --stdin $USER5;
    fi
    echo "유저 생성이 완료 되었습니다."
    
    #5.볼륨생성
    echo "5.볼륨생성"
    if [ -n "$VOL1" ];
    then
            cd /;
            mkdir $VOL1;
            ls -ld /$VOL1;
    fi
    if [ -n "$VOL2" ];
    then
            cd /;
            mkdir $VOL2;
            ls -ld /$VOL2;
    fi
    if [ -n "$VOL3" ];
    then
            cd /;
            mkdir $VOL3;
            ls -ld /$VOL3;
    fi
    if [ -n "$VOL4" ];
    then
            cd /;
            mkdir $VOL4;
            ls -ld /$VOL4;
    fi
    if [ -n "$VOL5" ];
    then
            cd /;
            mkdir $VOL5;
            ls -ld /$VOL5;
    fi
    echo "볼륨 생성이 완료 되었습니다.";
    
    #6. LVM 설치
    echo "6.LVM 설치";
    
    lvm=`rpm -qa | grep lvm |wc -l`;
    
    if [ $lvm -lt 1 ];
    then
            echo "LVM 패키지 설치가 필요합니다.";
            yum install -y lvm2;
            echo "LVM 설치가 완료 되었습니다."
    else
            echo "LVM 패키지가 설치 되어 있습니다.";
    fi
    
    #7. Root ssh
    echo "7.Root ssh 허용";
    
    sshconfig=`cat /etc/ssh/sshd_config | grep "PermitRootLogin no" | wc -l`;
    
    if [ $sshconfig -gt 0 ];
    then
            sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config;
            systemctl restart sshd;
            echo "root 계정에 ssh 접근 허용하였습니다.";
            cat /etc/ssh/sshd_config | grep "PermitRootLogin yes"
    else
            echo "root 계정에 대해 ssh 허용되어 있습니다.";
            cat /etc/ssh/sshd_config | grep "PermitRootLogin yes"
    fi
    
    #8. cloud config
    echo "8.hostname 보존"
    
    cloudconfig=`cat /etc/cloud/cloud.cfg | grep "preserve_hostname: false" | wc -l`;
    
    if [ $cloudconfig -gt 0 ];
    then
            sed -i 's/preserve_hostname: false/preserve_hostname: true/g' /etc/cloud/cloud.cfg;
            echo "호스트네임 보존 설정하였습니다.";
            cat /etc/cloud/cloud.cfg | grep "preserve_hostname: true"
    else
            echo "호스트네임 보존 설정이 되어 있습니다.";
            cat /etc/cloud/cloud.cfg | grep "preserve_hostname: true"
    fi
    
  4. LVM 구성

    1. pv 생성

      pvcreate /dev/nvme1n1
      pvcreate /dev/nvme2n1
      pvcreate /dev/nvme3n1
      pvcreate /dev/nvme4n1
      pvs
      
    2. vg 생성

      vgcreate APPVG /dev/nvme1n1
      vgcreate LOGVG /dev/nvme2n1
      vgcreate SRCVG /dev/nvme3n1
      vgcreate DATAVG /dev/nvme4n1
      vgs
      
    3. 파티션 분리안되어있으면, 전체 용량 engn001 디렉토리로 할당

      lvcreate -l 100%FREE -n engn001 APPVG
      ls /dev/APPVG/
      
      lvcreate -l 100%FREE -n logs001 LOGVG
      ls /dev/LOGVG/
      
      lvcreate -l 100%FREE -n sorc001 SRCVG
      ls /dev/SRCVG/
      
      lvcreate -l 100%FREE -n data001 DATAVG
      ls /dev/DATAVG/
      
    4. 마운트

      mkfs.xfs /dev/APPVG/engn001
      mkfs.xfs /dev/LOGVG/logs001
      mkfs.xfs /dev/SRCVG/sorc001
      mkfs.xfs /dev/DATAVG/data001
      
    5. LV 를 마운트할 디렉토리 생성

      mkdir -p /engn001
      ls /engn001
      
      mkdir -p /logs001
      ls /logs001
      
      mkdir -p /sorc001
      ls /sorc001
      
      mkdir -p /data001
      ls /data001
      
    6. 마운트한 디렉토리와 연결

      mount /dev/APPVG/engn001 /engn001
      mount /dev/LOGVG/logs001 /logs001
      mount /dev/SRCVG/sorc001 /sorc001
      mount /dev/DATAVG/data001 /data001
      lsblk
      
    7. fstab 설정

      blkid /dev/APPVG/engn001
      /dev/APPVG/engn001: UUID="4e937be5-63bd-45f5-9661-5715d0fe26e6" BLOCK_SIZE="512" TYPE="xfs"
      
      blkid /dev/LOGVG/logs001
      /dev/LOGVG/logs001: UUID="9d314094-cf28-4512-bfea-3ef551786237" BLOCK_SIZE="512" TYPE="xfs"
      
      blkid /dev/SRCVG/sorc001
      /dev/SRCVG/sorc001: UUID="7f1b3d94-cba5-4015-98ee-54acb4de3b7d" BLOCK_SIZE="512" TYPE="xfs"
      
      blkid /dev/DATAVG/data001
      /dev/DATAVG/data001: UUID="bdd8a06f-2ea5-4587-b006-bbe12dc60eb5" BLOCK_SIZE="512" TYPE="xfs"
      
  5. EFS 마운트

    1. nfs-utils 패키지 설치
    2. EFS 마운트할 디렉토리 생성
    3. EFS 마운트
    4. fstab 설정
    5. mount -a
  6. 데이트 이관 (os_move.sh)

    1. SG: 소스서버 SG outbound, 대상서버 SG inbound 에 서로 IP 로 22 port 오픈

    2. 소스서버에 rsync 를 위한 move 스크립트 세팅

    3. screen 세팅해서 백그라운드로 스크립트 실행

      스크린 생성 (screen -S test1)
      실행중인 스크린 목록 조회 (screen -ls)
      스크린 세션 재연결 (screen -r <id>)
      스크린 빠져나오기 (ctrl+a+d)
      스크린 삭제 (ctrl+D)
      
    4. 서버 → 서버로 rsync 데이터 전송을 위해서는 root 로 접근해야되기 때문에, 대상서버의 sshd_config 설정에서 root 로 접근되도록 설정

      # 대상서버 선작업
      vi /etc/ssh/sshd_config
      PermitRootLogin yes
      
      sudo systemctl restart sshd
      
      **# os_move.sh**
      
      #!/bin/sh
      echo "데이터 이전 할 대상 아이피 정보를 입력해주세요.";
      read -a IPCONFIG;
      
      echo "첫 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)";
      read -a VOL1;
      if [ -z "$VOL1" ];
      then
              echo "기입 할 볼륨이 없습니다."
      else
              echo "두 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)"
              read -a VOL2;
              if [ -z "$VOL2" ];
              then
                      echo "기입할 볼륨이 없습니다."
              else
                      echo "세 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)"
                      read -a VOL3;
                      if [ -z "$VOL3" ];
                      then
                              echo "기입할 볼륨이 없습니다."
                      else
                              echo "네 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)"
                              read -a VOL4;
                              if [ -z "$VOL4" ];
                              then
                                      echo "기입할 볼륨이 없습니다."
                              else
                                      echo "다섯 번째 볼륨을 기입해주세요.(볼륨 없을 경우 엔터)"
                                      read -a VOL5;
                                      if [ -z "$VOL5" ];
                                      then
                                              echo "기입할 볼륨이 없습니다."
                                      fi
                              fi
                      fi
              fi
      fi
      
      ## sshpass 설치 ##
      sshpass=`rpm -qa | grep sshpass | wc -l`;
      if [ $sshpass -lt 1 ];
      then
              echo "sshpass 패키지 설치가 필요합니다.";
              amazon-linux-extras install epel -y
              yum install sshpass
              echo "sshpass 패키지 설치가 완료 되었습니다.";
      else
              echo "sshpass 패키지가 설치 되어 있습니다.";
      fi
      
      # 데이터 이전
      rsync -av --rsh='sshpass -p "{password}" ssh' /etc/sudoers "$IPCONFIG":/etc/sudoers >> /usr/local/src/sudoers.log
      rsync -av --rsh='sshpass -p "{password}" ssh' /home/ "$IPCONFIG":/home/ >> /usr/local/src/home.log
      if [ -n "$VOL1" ];
      then
              rsync -av --rsh='sshpass -p "{password}" ssh' /$VOL1/ "$IPCONFIG":/$VOL1/ >> /usr/local/src/$VOL1.log
      fi
      if [ -n "$VOL2" ];
      then
              rsync -av --rsh='sshpass -p "{password}" ssh' /$VOL2/ "$IPCONFIG":/$VOL2/ >> /usr/local/src/$VOL2.log
      fi
      if [ -n "$VOL3" ];
      then
              rsync -av --rsh='sshpass -p "{password}" ssh' /$VOL3/ "$IPCONFIG":/$VOL3/ >> /usr/local/src/$VOL3.log
      fi
      if [ -n "$VOL4" ];
      then
              rsync -av --rsh='sshpass -p "{password}" ssh' /$VOL4/ "$IPCONFIG":/$VOL4/ >> /usr/local/src/$VOL4.log
      fi
      if [ -n "$VOL5" ];
      then
              rsync -av --rsh='sshpass -p "{password}" ssh' /$VOL5/ "$IPCONFIG":/$VOL5/ >> /usr/local/src/$VOL5.log
      fi
      echo "데이터 이전이 완료 되었습니다."
      echo "대상 서버 root계정에 대한 ssh 오픈 원복 작업 진행 부탁드립니다."
      ****
      

    e. 작업 후 소스/대상 서버 파일 개수 확인

    find /home/* -type f | wc -l
    find /logs001/* -type f | wc -l
    find /engn001/* -type f | wc -l
    find /data001/* -type f | wc -l
    

    f. 대상서버 sshd (작업 후 원복)

    vi /etc/ssh/sshd_config
    PermitRootLogin no
    
    sudo systemctl restart sshd
    
  7. 최종 작업: AL2023 OS 마이그레이션 한 EC2 를 기존 IP 로 교체작업

    1. 권한 세팅 및 swap 제거
    2. 로드밸런서 / 대상그룹 연결 확인 필요
    3. EC2 , EBS 의 기존 태그 확인
    4. 신규 생성한 2023 EC2 를 백업(AMI 생성)
    5. 기존 EC2 (아마존 리눅스2) 종료하여 기존 IP (ENI 확보)
    6. d 에서 생성한 AMI 및 기존 IP 로 신규 EC2 생성
    7. 타겟그룹 연결
    8. EC2, EBS 태그 세팅