

# 診断割り込みを送信して到達不能の Amazon EC2 インスタンスをデバッグする
<a name="diagnostic-interrupt"></a>

**警告**  
診断割り込みは上級ユーザーが使用することを目的としています。不適切な使用はインスタンスに悪影響を与える可能性があります。診断割り込みをインスタンスに送信すると、インスタンスがクラッシュして再起動し、データが失われる可能性があります。

到達できない、または応答しないインスタンスに診断割り込みを送信して、Linux インスタンスのカーネルパニック、または Windows インスタンスの*停止エラー* (通称*ブルースクリーンエラー*) を手動でトリガーできます。

**Linux インスタンス**  
Linux オペレーティングシステムは一般的に、カーネルパニックが発生するとクラッシュして再起動されます。ただし、オペレーティングシステムの具体的な動作は設定によって異なります。カーネルパニックはインスタンスのオペレーティングシステムカーネルでクラッシュダンプファイルの生成などのタスクを実行するためにも使用できます。このクラッシュダンプファイル内の情報を使用すると、根本原因解析を実施してインスタンスのデバッグを行うことができます。クラッシュダンプデータはインスタンスの代わりにオペレーティングシステムによってローカルで生成されます。

**Windows インスタンス**  
一般的に、Windows オペレーティングシステムは停止エラーが発生するとクラッシュして再起動されますが、具体的な動作は設定によって異なります。停止エラーが発生すると、オペレーティングシステムからカーネルメモリダンプなどのデバッグ情報がファイルに出力されることもあります。この情報を使用すると、根本原因解析を実施してインスタンスのデバッグを行うことができます。メモリダンプデータはインスタンスの代わりにオペレーティングシステムによってローカルで生成されます。

インスタンスに診断割り込みを送信する前に、OS のドキュメントを参照し、必要な設定変更を行うことをお勧めします。

**Topics**
+ [サポートされるインスタンスタイプ](#diagnostic-interrupt-instances)
+ [前提条件](#diagnostic-interrupt-prereqs)
+ [診断割り込みの送信](#diagnostic-interrupt-use)

## サポートされるインスタンスタイプ
<a name="diagnostic-interrupt-instances"></a>

診断割り込みはNitro ベースのすべてのインスタンスタイプでサポートされます。ただし、AWS Graviton プロセッサで動作するものを除きます。詳細については「[Instances built on the AWS Nitro System](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、unknown 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、unknown 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. [**システムエラー**] セクションで必要に応じて設定を行い、[**OK**] を選択してください。

Windows 停止エラーの設定の詳細については「[Overview of memory dump file options for 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) コマンドレットを使用します。

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

------