

# 연결할 수 없는 Amazon EC2 인스턴스를 디버깅하기 위한 진단 인터럽트 보내기
<a name="diagnostic-interrupt"></a>

**주의**  
진단 인터럽트를 고급 사용자를 대상으로 하는 기능입니다. 잘못 사용하면 인스턴스에 부정적인 영향을 줄 수 있습니다. 진단 인터럽트를 인스턴스에 전송하면 인스턴스가 고장 나거나 재부팅될 수 있으며 이는 데이터 손실로 이어질 수 있습니다.

연결할 수 없거나 응답하지 않는 인스턴스에 진단 인터럽트를 전송하여 Linux 인스턴스의 경우 **커널 패닉을 수동으로 트리거하거나 Windows 인스턴스의 경우 **중지 오류(일반적으로 **블루 스크린 오류라고 함)를 트리거할 수 있습니다.

**Linux 인스턴스**  
Linux 운영 체제는 일반적으로 커널 패닉이 발생할 때 충돌하고 재부팅됩니다. 운영 체제의 특정 동작은 해당 구성에 따라 다릅니다. 커널 패닉을 사용하여 인스턴스의 운영 체제 커널이 크래시 덤프 파일 생성과 같은 작업을 수행하도록 할 수도 있습니다. 그런 다음 크래시 덤프 파일의 정보를 사용하여 근본 원인 분석을 수행하고 인스턴스를 디버그할 수 있습니다. 크래시 덤프 데이터는 인스턴스 자체에서 운영 체제에 의해 로컬로 생성됩니다.

**Windows 인스턴스**  
일반적으로 중단 오류가 발생하면 Windows 운영 체제가 충돌하고 다시 부팅되지만 특정 동작은 해당 구성에 따라 다릅니다. 중단 오류가 발생하면 운영 체제는 커널 메모리 덤프와 같은 디버깅 정보를 파일에 쓸 수도 있습니다. 이 정보를 사용하여 근본 원인 분석을 수행하여 인스턴스를 디버그할 수 있습니다. 메모리 덤프 데이터는 인스턴스 자체에서 운영 체제에 의해 로컬로 생성됩니다.

인스턴스에 진단 인터럽트를 전송하기 전에 운영 시스템에 대한 문서를 읽고 필요한 구성을 변경하시기를 권장합니다.

**Topics**
+ [지원되는 인스턴스 유형](#diagnostic-interrupt-instances)
+ [사전 조건](#diagnostic-interrupt-prereqs)
+ [진단 인터럽트 보내기](#diagnostic-interrupt-use)

## 지원되는 인스턴스 유형
<a name="diagnostic-interrupt-instances"></a>

진단 인터럽트는 AWS Graviton 프로세서에서 제공되는 경우를 제외한 모든 Nitro 기반 인스턴스 유형에서 지원됩니다. 자세한 내용은 [AWS Nitro 시스템에 구축된 인스턴스](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html) 및 [AWS Graviton](https://aws.amazon.com/ec2/graviton/)을 참조하세요.

## 사전 조건
<a name="diagnostic-interrupt-prereqs"></a>

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

### Linux 인스턴스
<a name="diagnostic-interrupt-prereqs-linux"></a>

**커널 패닉이 발생할 때 크래시 덤프를 생성하도록 Amazon Linux 2 또는 Amazon Linux 2023을 구성하려면**

1. 인스턴스에 연결합니다.

1. **kexec** 및 **kdump**를 설치합니다.

   ```
   [ec2-user ~]$ sudo yum install kexec-tools -y
   ```

1. 보조 커널에 적절한 양의 메모리를 예약하도록 커널을 구성하세요. 예약할 메모리 크기는 인스턴스의 사용 가능한 총 메모리에 따라 다릅니다. 원하는 텍스트 편집기를 사용하여 `/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"
   ```

1. 변경 내용을 저장하고 `grub` 파일을 닫습니다.

1. GRUB2 구성 파일을 재구축합니다.

   ```
   [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
   ```

1. Intel 및 AMD 프로세서 기반의 인스턴스에서 `send-diagnostic-interrupt` 명령은 *알 수 없는 NMI(Non-Maskable Interrupt)*를 인스턴스에 보냅니다. 알 수 없는 NMI를 수신하면 커널이 충돌하도록 구성해야합니다. 원하는 텍스트 편집기를 사용하여 `/etc/sysctl.conf` 파일을 열고 다음을 추가합니다.

   ```
   kernel.unknown_nmi_panic=1
   ```

1. 재부팅하고 인스턴스에 다시 연결하세요.

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
   ```

1. **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를 구성하려면**  
Intel 및 AMD 프로세서 기반의 인스턴스에서 `send-diagnostic-interrupt` 명령은 *알 수 없는 NMI(Non-Maskable Interrupt)*를 인스턴스에 보냅니다. 알 수 없는 NMI를 수신하면 운영 체제의 구성 파일을 조정하여 커널이 충돌하도록 구성해야 합니다. 커널이 충돌하도록 구성하는 방법에 대한 자세한 내용은 운영 체제에 대한 설명서를 참조하세요.
+ [SUSE Linux Enterprise](https://www.suse.com/support/kb/doc/?id=3374462)
+ [Ubuntu](https://ubuntu.com/server/docs/kernel-crash-dump)
+ [Red Hat Enterprise Linux (RHEL)](https://access.redhat.com/solutions/6038)

### Windows 인스턴스
<a name="diagnostic-interrupt-prereqs-windows"></a>

**중단 오류가 발생할 때 메모리 덤프를 생성하도록 Windows를 구성하려면**

1. 인스턴스에 연결합니다.

1. **제어판**을 열고 **시스템**, **고급 시스템 설정**을 선택합니다.

1. **시스템 속성** 대화 상자에서 **권한** 탭을 선택합니다.

1. **시작 및 복구** 섹션에서 **설정...**을 선택합니다.

1. **시스템 오류** 섹션에서 필요에 따라 설정을 구성한 다음 **확인**을 선택하세요.

Windows 중단 오류 구성에 대한 자세한 내용은 [Windows의 메모리 덤프 파일 옵션 개요](https://support.microsoft.com/en-us/help/254649/overview-of-memory-dump-file-options-for-windows)를 참조하세요.

## 진단 인터럽트 보내기
<a name="diagnostic-interrupt-use"></a>

필요한 구성 변경을 완료하면 AWS CLI 또는 Amazon EC2 API를 사용하여 인스턴스에 진단 인터럽트를 보낼 수 있습니다.

------
#### [ AWS CLI ]

**인스턴스에 진단 인터럽트를 보내려면**  
[send-diagnostic-interrupt](https://docs.aws.amazon.com/cli/latest/reference/ec2/send-diagnostic-interrupt.html) 명령을 사용합니다.

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

------
#### [ PowerShell ]

**인스턴스에 진단 인터럽트를 보내려면**  
[Send-EC2DiagnosticInterrupt](https://docs.aws.amazon.com/powershell/latest/reference/items/Send-EC2DiagnosticInterrupt.html) cmdlet을 사용합니다.

```
Send-EC2DiagnosticInterrupt -InstanceId i-1234567890abcdef0
```

------