AWS EC2에서 Linux Python 버전 upgrade시 ssh 연결이 되지 않는 문제 해결방법
DoDoBest
·2023. 5. 21. 16:35
상황
로컬 PC에서는 Python 3.9를 사용하고 있고, AWS EC2에서는 Python 3.6을 사용하고 있었습니다. 두 버전 간의 호환이 안 되는 것은 아니지만, 파이썬 버전에 따라 패키지가 deprecated 되기도 하기 때문에 AWS EC2의 Python 버전을 3.9로 올려야 했습니다.
문제
AWS EC2에서 Python 버전을 3.9로 올린 후, 인스턴스를 AMI로 만들고, AMI를 이용해 새로운 인스턴스를 만들었습니다. putty를 이용한 SSH 연결이 되지 않았고, AWS 인스턴스 상태 검사가 실패했습니다. 인스턴스를 중지한 후, 다시 실행하면 SSH 연결이 가능했습니다. 즉, AMI를 이용해 최초 생성한 시점에만 SSH 연결이 되지 않았습니다.
원인
Python 버전을 3.9로 올린 후, Python package 버전을 올리지 않은 게 문제였습니다.
먼저, 부팅되지 않는 인스턴스의 시스템 로그 가져오기에서 관련 로그를 확인합니다.
부팅 후 시스템 로그가 나오기까지는 5분 정도 걸리는 것 같습니다. 기다린 후, 로그 복사 왼쪽에 있는 새로고침 버튼을 누르면 어느 순간 로그가 나옵니다.
fail을 검색해서 문제가 되는 부분을 찾아봤고, `netifaces` 패키지 관련 오류가 있었습니다. 기존에 0.10.0 버전이 설치되어 있었고, `pip3 install --upgrade netifaces` 를 통해 0.11.0 버전으로 올려줬습니다.
[ 9.829052] cloud-init[548]: failed run of stage init-local
[ 9.830141] cloud-init[548]: ------------------------------------------------------------
[ 9.831627] cloud-init[548]: Traceback (most recent call last):
[ 9.832698] cloud-init[548]: File "/usr/lib/python3/dist-packages/cloudinit/cmd/main.py", line 767, in status_wrapper
[ 9.835681] cloud-init[548]: ret = functor(name, args)
[ 9.836662] cloud-init[548]: File "/usr/lib/python3/dist-packages/cloudinit/cmd/main.py", line 433, in main_init
[ 9.839543] cloud-init[548]: init.apply_network_config(bring_up=bring_up_interfaces)
[ 9.840995] cloud-init[548]: File "/usr/lib/python3/dist-packages/cloudinit/stages.py", line 941, in apply_network_config
[ 9.844096] cloud-init[548]: return self.distro.apply_network_config(
[ 9.845237] cloud-init[548]: File "/usr/lib/python3/dist-packages/cloudinit/distros/__init__.py", line 278, in apply_network_config
[ 9.848117] cloud-init[548]: self._write_network_state(network_state, renderer)
[ 9.849792] cloud-init[548]: File "/usr/lib/python3/dist-packages/cloudinit/distros/debian.py", line 142, in _write_network_state
[ 9.851878] cloud-init[548]: return super()._write_network_state(*args, **kwargs)
[ 9.853167] cloud-init[548]: File "/usr/lib/python3/dist-packages/cloudinit/distros/__init__.py", line 167, in _write_network_state
[ 9.855155] cloud-init[548]: renderer.render_network_state(network_state)
[ 9.856488] cloud-init[548]: File "/usr/lib/python3/dist-packages/cloudinit/net/netplan.py", line 298, in render_network_state
[ 9.858413] cloud-init[548]: self._netplan_generate(run=self._postcmds)
[ 9.863043] cloud-init[548]: File "/usr/lib/python3/dist-packages/cloudinit/net/netplan.py", line 305, in _netplan_generate
[ 9.865359] cloud-init[548]: subp.subp(self.NETPLAN_GENERATE, capture=True)
[ 9.866904] cloud-init[548]: File "/usr/lib/python3/dist-packages/cloudinit/subp.py", line 335, in subp
[ 9.869111] cloud-init[548]: raise ProcessExecutionError(
[ 9.870285] cloud-init[548]: cloudinit.subp.ProcessExecutionError: Unexpected error while running command.
[ 9.872056] cloud-init[548]: Command: ['netplan', 'generate']
[ 9.874942] cloud-init[548]: Exit code: 1
[ 9.876141] cloud-init[548]: Reason: -
[ 9.876941] cloud-init[548]: Stdout:
[ 9.877698] cloud-init[548]: Stderr: Traceback (most recent call last):
[ 9.878940] cloud-init[548]: File "/usr/sbin/netplan", line 20, in <module>
[ 9.880381] cloud-init[548]: from netplan import Netplan
[ 9.882696] cloud-init[548]: File "/usr/share/netplan/netplan/__init__.py", line 18, in <module>
[ 9.884696] cloud-init[548]: from netplan.cli.core import Netplan
[ 9.886525] cloud-init[548]: File "/usr/share/netplan/netplan/cli/core.py", line 24, in <module>
[ 9.888889] cloud-init[548]: import netplan.cli.utils as utils
[ 9.890563] cloud-init[548]: File "/usr/share/netplan/netplan/cli/utils.py", line 25, in <module>
[ 9.892206] cloud-init[548]: import netifaces
[ 9.893179] cloud-init[548]: ModuleNotFoundError: No module named 'netifaces'
[ 9.894902] cloud-init[548]: ------------------------------------------------------------
또한 시스템 부팅 관련 패키지들의 버전도 올려줬습니다.
# Reinstall python3-apt
sudo apt remove --purge python3-apt
sudo apt autoclean
sudo apt install python3-apt
# Install required packages
sudo apt install build-essential
sudo apt install build-essential python3.9-distutils
sudo apt install build-essential python3.9-venv
sudo apt install build-essential libpython3.9-dev
# Install latest pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python3.9 get-pip.py
# Upgrade outdated python libraries that break cloud-init
sudo -i
pip3 install --upgrade setuptools
pip3 install --upgrade urllib3
pip3 install --upgrade requests
pip3 install --upgrade jinja2
pip3 install --upgrade netifaces
pip3 install --upgrade --ignore-installed pyyaml
exit
# Upgrade cloud-init to latest version
sudo apt install --only-upgrade cloud-init
출처
https://stackoverflow.com/a/72325772/11722881
'기타' 카테고리의 다른 글
NVME SSD가 BIOS boot option에 인식되지 않는 경우 (0) | 2023.07.18 |
---|---|
Chrome inspect 창에서 selenium headless session이 나오지 않는 문제 해결방법 (0) | 2023.06.23 |
Linux python 3.9 설치 관련 오류 해결 모음 (0) | 2023.05.21 |
네이버클라우드플랫폼 서버 ssh 연결 시 server refused our key 오류 해결 (0) | 2023.01.30 |
Solution of AWS EC2 ubuntu password lock after creating ami instance (2) | 2023.01.18 |