연결할 수 없는 Amazon EC2 인스턴스를 디버그하려고 진단 인터럽트 보내기

연결할 수 없는 Amazon EC2 인스턴스를 디버그하려고 진단 인터럽트 보내기 (Send a diagnostic interrupt to debug an unreachable Amazon EC2 instance)

경고 진단 인터럽트는 고급 사용자를 위한 것이에요. 잘못 사용하면 인스턴스에 부정적인 영향을 줄 수 있어요. 인스턴스에 진단 인터럽트를 보내면 인스턴스가 충돌하고 재부팅될 수 있으며, 이로 인해 데이터가 손실될 수 있어요.

연결할 수 없거나 응답하지 않는 인스턴스에 진단 인터럽트를 보내 Linux 인스턴스의 경우 커널 패닉(kernel panic)을, Windows 인스턴스의 경우 중지 오류(stop error, 흔히 블루 스크린 오류라고 함)를 수동으로 트리거할 수 있어요.

Linux 인스턴스 (Linux instances)

Linux 운영 체제는 일반적으로 커널 패닉이 발생하면 충돌하고 재부팅돼요. 운영 체제의 구체적인 동작은 구성에 따라 달라져요. 커널 패닉을 사용해 인스턴스의 운영 체제 커널이 크래시 덤프 파일 생성 같은 작업을 수행하게 할 수도 있어요. 그런 다음 크래시 덤프 파일의 정보를 사용해 근본 원인 분석을 수행하고 인스턴스를 디버그할 수 있어요. 크래시 덤프 데이터는 인스턴스 자체의 운영 체제가 로컬로 생성해요.

Windows 인스턴스 (Windows instances)

일반적으로 Windows 운영 체제는 중지 오류가 발생하면 충돌하고 재부팅되지만, 구체적인 동작은 구성에 따라 달라져요. 중지 오류는 운영 체제가 커널 메모리 덤프 같은 디버깅 정보를 파일에 쓰게 할 수도 있어요. 그런 다음 이 정보를 사용해 근본 원인 분석을 수행해 인스턴스를 디버그할 수 있어요. 메모리 덤프 데이터는 인스턴스 자체의 운영 체제가 로컬로 생성해요.

인스턴스에 진단 인터럽트를 보내기 전에 운영 체제의 설명서를 참조하고 필요한 구성 변경을 수행할 것을 권장해요.

목차 (Contents)

  • 지원되는 인스턴스 유형
  • 사전 준비
  • 진단 인터럽트 보내기

지원되는 인스턴스 유형 (Supported instance types)

진단 인터럽트는 AWS Graviton 프로세서로 구동되는 인스턴스를 제외한 모든 Nitro 기반 인스턴스 유형에서 지원돼요. 자세한 내용은 AWS Nitro System 및 AWS Graviton을 기반으로 구축된 인스턴스를 참고하세요.

사전 준비 (Prerequisites)

진단 인터럽트를 사용하기 전에 인스턴스의 운영 체제를 구성해야 해요. 이렇게 하면 커널 패닉(Linux 인스턴스) 또는 중지 오류(Windows 인스턴스)가 발생할 때 필요한 작업을 수행하도록 보장돼요.

Amazon Linux 2 또는 Amazon Linux 2023이 커널 패닉 시 크래시 덤프를 생성하도록 구성 (To configure Amazon Linux 2 or Amazon Linux 2023 to generate a crash dump when a kernel panic occurs)

  • 인스턴스에 연결하세요.
  • kexec 및 kdump를 설치하세요.
[ec2-user ~]$ sudo yum install kexec-tools -y
  • 보조 커널에 적절한 메모리를 예약하도록 커널을 구성하세요. 예약할 메모리 양은 인스턴스의 총 사용 가능한 메모리에 따라 달라져요. 선호 텍스트 편집기로 /etc/default/grub 파일을 열고 GRUB_CMDLINE_LINUX_DEFAULT로 시작하는 줄을 찾은 뒤 다음 형식으로 crashkernel 매개변수를 추가하세요: crashkernel=memory_to_reserve. 예를 들어 256MB를 예약하려면 grub 파일을 다음과 같이 수정하세요:
GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=256M console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0"
GRUB_TIMEOUT=0
GRUB_DISABLE_RECOVERY="true"
  • 변경 사항을 저장하고 grub 파일을 닫으세요.
  • GRUB2 구성 파일을 다시 빌드하세요.
[ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  • Intel 및 AMD 프로세서 기반 인스턴스에서 send-diagnostic-interrupt 명령은 알 수 없는 마스크 불가능 인터럽트(NMI)를 인스턴스에 보내요. 커널이 알 수 없는 NMI를 받으면 충돌하도록 구성해야 해요. 선호 텍스트 편집기로 /etc/sysctl.conf 파일을 열고 다음을 추가하세요.
kernel.unknown_nmi_panic=1
  • 재부팅하고 인스턴스에 다시 연결하세요.
  • 커널이 올바른 crashkernel 매개변수로 부팅되었는지 확인하세요.
$ grep crashkernel /proc/cmdline

다음 예시 출력은 구성이 성공했음을 나타내요.

BOOT_IMAGE=/boot/vmlinuz-4.14.128-112.105.amzn2.x86_64 root=UUID=a1e1011e-e38f-408e-878b-fed395b47ad6 ro crashkernel=256M console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
  • kdump 서비스가 실행 중인지 확인하세요.
[ec2-user ~]$ systemctl status kdump.service

다음 예시 출력은 kdump 서비스가 실행 중일 때의 결과를 보여줘요.

kdump.service - Crash recovery kernel arming
   Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
   Active: active (exited) since Fri 2019-05-24 23:29:13 UTC; 22s ago
  Process: 2503 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS)
 Main PID: 2503 (code=exited, status=0/SUCCESS)

참고 기본적으로 크래시 덤프 파일은 /var/crash/에 저장돼요. 위치를 변경하려면 선호 텍스트 편집기로 /etc/kdump.conf 파일을 수정하세요.

SUSE Linux Enterprise, Ubuntu, Red Hat Enterprise Linux 구성 (To configure SUSE Linux Enterprise, Ubuntu, or Red Hat Enterprise Linux)

Intel 및 AMD 프로세서 기반 인스턴스에서 send-diagnostic-interrupt 명령은 알 수 없는 마스크 불가능 인터럽트(NMI)를 인스턴스에 보내요. 운영 체제의 구성 파일을 조정해 커널이 알 수 없는 NMI를 받으면 충돌하도록 구성해야 해요. 커널이 충돌하도록 구성하는 방법에 대한 정보는 운영 체제 설명서를 참고하세요:

  • SUSE Linux Enterprise
  • Ubuntu
  • Red Hat Enterprise Linux (RHEL)

Windows가 중지 오류 시 메모리 덤프를 생성하도록 구성 (To configure Windows to generate a memory dump when a stop error occurs)

  • 인스턴스에 연결하세요.
  • 제어판(Control Panel)을 열고 시스템(System), 고급 시스템 설정(Advanced system settings)을 선택하세요.
  • 시스템 속성(System Properties) 대화 상자에서 고급(Advanced) 탭을 선택하세요.
  • 시작 및 복구(Startup and Recovery) 섹션에서 설정(Settings...)을 선택하세요.
  • 시스템 오류(System failure) 섹션에서 필요에 따라 설정을 구성한 뒤 확인(OK)을 선택하세요.
  • Windows 중지 오류 구성에 대한 자세한 내용은 'Windows용 메모리 덤프 파일 옵션 개요'를 참고하세요.

진단 인터럽트 보내기 (Send a diagnostic interrupt)

필요한 구성 변경을 완료한 후 AWS CLI 또는 Amazon EC2 API를 사용해 인스턴스에 진단 인터럽트를 보낼 수 있어요.

AWS CLI

인스턴스에 진단 인터럽트 보내기:

send-diagnostic-interrupt 명령을 사용하세요.

aws ec2 send-diagnostic-interrupt --instance-id i-1234567890abcdef0

PowerShell

인스턴스에 진단 인터럽트 보내기:

Send-EC2DiagnosticInterrupt cmdlet을 사용하세요.

Send-EC2DiagnosticInterrupt -InstanceId i-1234567890abcdef0

더 알아보기 (Learn more)