診断割り込みを送信して到達不能の Amazon EC2 インスタンスをデバッグする - Amazon Elastic Compute Cloud

診断割り込みを送信して到達不能の Amazon EC2 インスタンスをデバッグする

警告

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

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

Linux インスタンス

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

Windows インスタンス

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

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

サポートされるインスタンスタイプ

診断割り込みは、Nitro ベースのすべてのインスタンスタイプでサポートされます。ただし、AWS Graviton プロセッサで動作するものを除きます。詳細については、「Instances built on the AWS Nitro System」と「AWS Graviton」を参照してください。

前提条件

診断割り込みを使用する前に、インスタンスのオペレーティングシステムを設定する必要があります。こうすることで、カーネルパニック (Linux インスタンス) または停止エラー (Windows インスタンス) の発生時に必要なアクションが実行されるようになります。

カーネルパニックの発生時にクラッシュダンプが生成されるように Amazon Linux 2 を設定するには
  1. インスタンスに接続します。

  2. kexeckdump をインストールします。

    [ec2-user ~]$ sudo yum install kexec-tools -y
  3. セカンダリカーネル用に適切な量のメモリが予約されるようにカーネルを設定します。予約するメモリの量は、インスタンスで使用可能な合計メモリによって異なります。適切なテキストエディタを使用して /etc/default/grub ファイルを開き、GRUB_CMDLINE_LINUX_DEFAULT から始まる行を見つけて、crashkernel という形式で crashkernel=memory_to_reserve パラメータを追加します。たとえば、160MB を予約するには、grub ファイルを次のように変更します。

    GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=160M 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"
  4. 変更内容を保存し、grub ファイルを閉じます。

  5. GRUB2 設定ファイルを再構築します。

    [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  6. Intel および AMD プロセッサをベースとしたインスタンスの場合、send-diagnostic-interrupt コマンドを実行すると 不明なマスク不可割り込み (NMI、unknown non-maskable interrupt) がインスタンスに送信されます。不明な NMI を受信した際にはクラッシュするようにカーネルを設定しておく必要があります。適切なテキストエディタを使用して /etc/sysctl.conf ファイルを開き、以下を追加します。

    kernel.unknown_nmi_panic=1
  7. インスタンスを再起動して再接続します。

  8. 正しい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=160M console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
  9. 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 ファイルを変更します。

カーネルパニックの発生時にクラッシュダンプが生成されるように Amazon Linux を設定するには
  1. インスタンスに接続します。

  2. kexeckdump をインストールします。

    [ec2-user ~]$ sudo yum install kexec-tools -y
  3. セカンダリカーネル用に適切な量のメモリが予約されるようにカーネルを設定します。予約するメモリの量は、インスタンスで使用可能な合計メモリによって異なります。

    $ sudo grubby --args="crashkernel=memory_to_reserve" --update-kernel=ALL

    たとえば、クラッシュカーネル用に 160MB を予約するには、次のコマンドを使用します。

    $ sudo grubby --args="crashkernel=160M" --update-kernel=ALL
  4. Intel および AMD プロセッサをベースとしたインスタンスの場合、send-diagnostic-interrupt コマンドを実行すると 不明なマスク不可割り込み (NMI、unknown non-maskable interrupt) がインスタンスに送信されます。不明な NMI を受信した際にはクラッシュするようにカーネルを設定しておく必要があります。適切なテキストエディタを使用して /etc/sysctl.conf ファイルを開き、以下を追加します。

    kernel.unknown_nmi_panic=1
  5. インスタンスを再起動して再接続します。

  6. 正しいcrashkernel パラメータを使用してカーネルが起動されていることを確認します。

    $ grep crashkernel /proc/cmdline

    次の出力例は、適切な設定を示しています。

    root=LABEL=/ console=tty1 console=ttyS0 selinux=0 nvme_core.io_timeout=4294967295 LANG=en_US.UTF-8 KEYTABLE=us crashkernel=160M
  7. kdump サービスが実行中であることを確認します。

    [ec2-user ~]$ sudo service kdump status

    サービスが実行中であれば、コマンドから Kdump is operational 応答が返されます。

注記

デフォルトでは、クラッシュダンプファイルは /var/crash/ に保存されます。保存先を変更するには、適切なテキストエディタを使用して /etc/kdump.conf ファイルを変更します。

SUSE Linux Enterprise、Ubuntu、または Red Hat Enterprise Linux を設定するには

Intel および AMD プロセッサをベースとしたインスタンスの場合、send-diagnostic-interrupt コマンドを実行すると 不明なマスク不可割り込み (NMI、unknown non-maskable interrupt) がインスタンスに送信されます。オペレーティングシステムの設定ファイルを調整して、不明な NMI を受信したときにカーネルがクラッシュするように設定する必要があります。カーネルをクラッシュするように設定する方法については、オペレーティングシステムのドキュメントを参照してください。

停止エラーの発生時に Windows によってメモリダンプが生成されるように設定するには
  1. インスタンスに接続します。

  2. [コントロールパネル] を開き、[システム]、[システムの詳細設定] の順に選択します。

  3. [システムのプロパティ] ダイアログボックスの [詳細設定] タブを選択します。

  4. [起動と回復] セクションで、[設定...] を選択します。

  5. [システムエラー] セクションで必要に応じて設定を行い、[OK] を選択します。

Windows 停止エラーの設定の詳細については、「Overview of memory dump file options for Windows」を参照してください。

診断割り込みの送信

必要な設定変更を完了したら、AWS CLI または Amazon EC2 API を使用して、診断割り込みをインスタンスに送信できます。

AWS CLI
診断割り込みをインスタンス (AWS CLI) に送信するには

send-diagnostic-interrupt コマンドを使用し、インスタンス ID を指定します。

aws ec2 send-diagnostic-interrupt --instance-id i-1234567890abcdef0
PowerShell
診断割り込みをインスタンス (AWS Tools for Windows PowerShell) に送信するには

Send-EC2DiagnosticInterrupt cmdlt を使用し、インスタンス ID を指定します。

PS C:\> Send-EC2DiagnosticInterrupt -InstanceId i-1234567890abcdef0