

# EC2Rescue を使用して問題のある Amazon EC2 Linux インスタンスのトラブルシューティングを行う
<a name="Linux-Server-EC2Rescue"></a>

Linux 用 EC2Rescue は、使いやすいオープンソースのツールであり、Amazon EC2 Linux インスタンスで実行し、100 を超えるモジュールのライブラリを使用して一般的な問題を診断、トラブルシューティング、修正できます。モジュールは、BASH または Python スクリプト、および必要なメタデータを含む YAML ファイルです。

Linux インスタンス用 EC2Rescue の一般的な使用例には、次のようなものがあります。
+ syslog ログとパッケージマネージャーログの収集
+ リソース使用率データの収集
+ 既知の問題のあるカーネルパラメータと一般的な OpenSSH の問題の診断と修復

**注記**  
`AWSSupport-TroubleshootSSH` AWS Systems Manager Automation ランブックは Linux 用 EC2Rescue をインストールし、そのツールを使用して、Linux インスタンスへの SSH 接続を妨げる、一般的な問題を確認しその修正を試みます。詳細については、「[AWSSupport-TroubleshootSSH](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-troubleshootssh.html)」を参照してください。

Windows インスタンスを使用している場合は、「[EC2Rescue を使用して問題のある Amazon EC2 Windows インスタンスのトラブルシューティングを行う](Windows-Server-EC2Rescue.md)」を参照してください。

**Topics**
+ [EC2Rescue をインストールする](ec2rl_install.md)
+ [EC2Rescue コマンドを実行する](ec2rl_working.md)
+ [EC2Rescue モジュールの開発](ec2rl_moduledev.md)

# Amazon EC2 Linux インスタンスに EC2Rescue をインストールする
<a name="ec2rl_install"></a>

Linux 用 EC2Rescue ツールは、次の前提要件を満たす Amazon EC2 Linux インスタンスにインストールできます。

**前提条件**
+ サポートされるオペレーティングシステム
  + Amazon Linux 2
  + Amazon Linux 2016.09\$1
  + SUSE Linux Enterprise Server 12\$1
  + RHEL 7\$1
  + Ubuntu 16.04\$1
+ ソフトウェア要件
  + Python 2.7.9\$1 または 3.2\$1

## EC2Rescue をインストールする
<a name="ec2rl-install"></a>

`AWSSupport-TroubleshootSSH` ランブックは Linux 用 EC2Rescue をインストールし、そのツールを使用して、Linux マシンへの SSH 経由でのリモートからの接続を妨げる、一般的な問題を確認しその修正を試みます。より詳しい情報を確認し、この自動化を実行するには、[サポート-TroubleshootSSH](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-troubleshootssh.html) をご参照ください。

システムに必要な Python バージョンがある場合は、標準ビルドをインストールできます。それ以外の場合は、Python の最小のコピーを含むバンドル済みのビルドをインストールできます。

**標準ビルドをインストールするには**

1. 作動している Linux インスタンスから、[Linux 用 EC2Rescue](https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz) ツールをダウンロードします。

   ```
   curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz
   ```

1. (オプション) Linux 用 EC2Rescue のインストールファイルの署名を検証します。詳細については、「[(オプション) Linux 用 EC2Rescue の署名を検証する](#ec2rl_verify)」を参照してください。

1. sha256 ハッシュファイルをダウンロードします。

   ```
   curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz.sha256
   ```

1. tarball の整合性を確認します。

   ```
   sha256sum -c ec2rl.tgz.sha256
   ```

1. Tarball を解凍します。

   ```
   tar -xzvf ec2rl.tgz
   ```

1. ヘルプファイルを表示してインストールを検証します。

   ```
   cd ec2rl-<version_number>
   ./ec2rl help
   ```

**バンドル済みのビルドをインストールするには**  
ダウンロードのリンクと制限については、github の「[Linux 用 EC2Rescue](https://github.com/awslabs/aws-ec2rescue-linux/blob/master/README.md)」を参照してください。

## (オプション) Linux 用 EC2Rescue の署名を検証する
<a name="ec2rl_verify"></a>

以下に、Linux ベースのオペレーティングシステム用の Linux 用 EC2Rescue パッケージの有効性を検証するための推奨されるプロセスを示します。

インターネットからアプリケーションをダウンロードする場合は、ソフトウェア発行元のアイデンティティを認証し、アプリケーションの発行後に改ざん、あるいは破損がないか確認することをお勧めします。これにより、ウイルスやマルウェアに感染したバージョンのアプリケーションをインストールせずに済みます。

このトピックのステップを実行した後に Linux 用 EC2Rescue のソフトウェアが変更または破損していることが判明した場合は、インストールファイルを実行しないでください。このような場合は Amazon Web Services にご連絡ください。

Linux ベースのオペレーティングシステム用の Linux 用 EC2Rescue ファイルの署名には、GnuPG が使用されています。これは安全なデジタル署名のための、オープンソース実装のプリティグッドプライバシー (OpenPGP) 標準です。GnuPG (GPG とも呼ばれます) では、デジタル署名を通じて認証と整合性のチェックが行われます。ダウンロードした Linux 用 EC2Rescue パッケージの検証に使用できるパブリックキーと署名は、AWS により公開されています。PGP と GnuPG (GPG) の詳細については、「[https://www.gnupg.org/](https://www.gnupg.org/)」を参照してください。

まず、ソフトウェア発行元との信頼を確立します。ソフトウェア発行元のパブリックキーをダウンロードし、キー所有者が一致していることを確認してから、キーリングに追加します。キーリングとは、既知のパブリックキーの集合です。真正性が確立されたパブリック キーは、アプリケーションの署名を確認するために使用できます。

**Topics**
+ [

### パブリック キーを認証およびインポートする
](#ec2rl_authenticate)
+ [

### パッケージの署名の確認
](#ec2rl_verify_signature)

### パブリック キーを認証およびインポートする
<a name="ec2rl_authenticate"></a>

次の手順では、Linux 用 EC2Rescue のパブリックキーを認証し、信頼されたキーとして GPG キーリングへ追加します。

**Linux 用 EC2Rescue のパブリックキーを認証してインポートするには**

1. コマンドプロンプトで、次のコマンドを使用して当社のパブリック GPG ビルドキーのコピーを取得します。

   ```
   curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.key
   ```

1. `ec2rl.key` を保存したディレクトリのコマンドプロンプトで、次のコマンドを使用して Linux 用 EC2Rescue のパブリックキーをキーリングにインポートします。

   ```
   gpg2 --import ec2rl.key
   ```

   コマンドで次のような結果が返されます。

   ```
   gpg: /home/ec2-user/.gnupg/trustdb.gpg: trustdb created
   gpg: key 2FAE2A1C: public key "ec2autodiag@amazon.com <EC2 Rescue for Linux>" imported
   gpg: Total number processed: 1
   gpg:               imported: 1  (RSA: 1)
   ```
**ヒント**  
コマンドが見つからないというエラーが表示された場合は、`apt-get install gnupg2` (Debian ベースの Linux) または `yum install gnupg2` (Red Hat ベースの Linux) を使用して GnuPG ユーティリティをインストールします。

### パッケージの署名の確認
<a name="ec2rl_verify_signature"></a>

GPG ツールをインストール後、Linux 用 EC2Rescue パブリックキーを認証してインポートし、Linux 用 EC2Rescue パブリック キーが信頼済みであることを確認すると、Linux 用 EC2Rescue インストールスクリプトの署名を確認できるようになります。

**Linux 用 EC2Rescue インストールスクリプトの署名を確認するには**

1. コマンド プロンプトで次のコマンドを実行し、インストール スクリプトの署名ファイルをダウンロードします。

   ```
   curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz.sig
   ```

1. `ec2rl.tgz.sig` と Linux 用 EC2Rescue インストールファイルを保存したディレクトリのコマンドプロンプトで次のコマンドを実行し、署名を確認します。ファイルが2つとも存在している必要があります。

   ```
   gpg2 --verify ./ec2rl.tgz.sig
   ```

   出力は次のようになります。

   ```
   gpg: Signature made Thu 12 Jul 2018 01:57:51 AM UTC using RSA key ID 6991ED45
   gpg: Good signature from "ec2autodiag@amazon.com <EC2 Rescue for Linux>"
   gpg: WARNING: This key is not certified with a trusted signature!
   gpg:          There is no indication that the signature belongs to the owner.
   Primary key fingerprint: E528 BCC9 0DBF 5AFA 0F6C  C36A F780 4843 2FAE 2A1C
        Subkey fingerprint: 966B 0D27 85E9 AEEC 1146  7A9D 8851 1153 6991 ED45
   ```

   出力に「`Good signature from "ec2autodiag@amazon.com <EC2 Rescue for Linux>"`」という句が含まれる場合は、署名が正常に確認されており、Linux 用 EC2Rescue のインストールスクリプトを実行できることを意味しています。

   出力結果に「`BAD signature`」という句が含まれる場合、手順が正しいことをもう一度確認してください。この応答が続く場合は、Amazon Web Services に連絡してください。以前にダウンロードしたインストール ファイルを実行しないでください。

以下は、表示される可能性のある警告の詳細です。
+ **WARNING: This key is not certified with a trusted signature\$1 There is no indication that the signature belongs to the owner.** これは、Linux 用 EC2Rescue の認証済みパブリック キーを所有していると考えるユーザーの個人レベルの信頼を参照します。本来は、ユーザーが Amazon Web Services オフィスを訪問してキーを受け取ることが理想的です。しかし、キーは多くの場合 ウェブ サイトからダウンロードされます。この場合、ウェブサイトは Amazon Web Services ウェブサイトです。
+ **gpg2: no ultimately trusted keys found.** これは、特定のキーがユーザー (またはユーザーが信頼する他のユーザー) によって「最終的に信頼された」キーでないことを意味します。

詳細については、「[https://www.gnupg.org/](https://www.gnupg.org/)」を参照してください。

# Amazon EC2 Linux インスタンスで EC2Rescue コマンドを実行する
<a name="ec2rl_working"></a>

EC2Rescue はコマンドラインツールです。Linux インスタンスに EC2Rescue をインストールすると、`./ec2rl help` を実行してツールの使用方法に関する一般的なヘルプを得ることができます。`./ec2rl list` を実行して使用可能なモジュールを表示し、`./ec2rl help module_name` を実行して特定のモジュールに関するヘルプを取得できます。

ここでは、このツールを使い始めるために実行できる一般的なタスクについて説明します。

**Topics**
+ [

## EC2Rescue モジュールを実行する
](#ec2rl_running_module)
+ [

## EC2Rescue モジュールの結果をアップロードする
](#ec2rl_uploading_results)
+ [

## Amazon EC2 Linux インスタンスのバックアップを作成する
](#ec2rl_creating_backups)

## EC2Rescue モジュールを実行する
<a name="ec2rl_running_module"></a>

**すべての EC2Rescue モジュールを実行するには**  
追加のパラメータを指定せずに、**./ec2rl run** コマンドを使用します。一部のモジュールには、ルートアクセスが必要です。ルートユーザーでない場合は、コマンドを実行するときに **sudo** を使用します。

```
./ec2rl run
```

**特定の EC2Rescue モジュールを実行するには**  
**./ec2rl run** コマンドを使用し、`--only-modules` には実行するモジュールの名前を指定します。一部のモジュールでは、それらを使用するための引数が必要です。

```
./ec2rl run --only-modules=module_name --arguments
```

例えば、**dig** モジュールを実行して `amazon.com` ドメインをクエリするには、次のコマンドを使用します。

```
./ec2rl run --only-modules=dig --domain=amazon.com
```

**EC2Rescue モジュールの結果を表示するには**  
モジュールを実行し、`cat /var/tmp/ec2rl/logfile_location` のログファイルを表示します。例えば、**dig** モジュールのログファイルは次の場所にあります。

```
cat /var/tmp/ec2rl/timestamp/mod_out/run/dig.log
```

## EC2Rescue モジュールの結果をアップロードする
<a name="ec2rl_uploading_results"></a>

サポート が EC2Rescue モジュールの結果をリクエストした場合は、EC2Rescue ツールを使用してログファイルをアップロードできます。結果は、サポート が提供する場所にアップロードすることも、所有している Amazon S3 バケットにアップロードすることもできます。

**サポート から提供された場所に結果をアップロードするには**  
**./ec2rl upload** コマンドを使用します。`--upload-directory` にはログファイルの場所を指定します。`--support-url` には、サポート によって提供される URL を指定します。

```
./ec2rl upload --upload-directory=/var/tmp/ec2rl/logfile_location --support-url="url_provided_by_aws_support"
```

**Amazon S3 バケットに結果をアップロードするには**  
**./ec2rl upload** コマンドを使用します。`--upload-directory` にはログファイルの場所を指定します。`--presigned-url` には、S3 バケットの署名付き URL を指定します。Amazon S3 に署名付きの URL を生成するための詳細については、「[署名付き URL を使用したオブジェクトのアップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html)」を参照してください。

```
./ec2rl upload --upload-directory=/var/tmp/ec2rl/logfile_location --presigned-url="presigned_s3_url"
```

## Amazon EC2 Linux インスタンスのバックアップを作成する
<a name="ec2rl_creating_backups"></a>

EC2Rescue を使用して Linux インスタンスをバックアップするには、AMI を作成するか、アタッチされたボリュームのスナップショットを作成します。

**AMI を作成するには**  
`./ec2rl run` コマンドを使用し、--`backup` には `ami` を指定します。

```
./ec2rl run --backup=ami
```

**アタッチされたすべてのボリュームのマルチボリュームスナップショットを作成するには**  
`./ec2rl run` コマンドを使用し、--`backup` には `allvolumes` を指定します。

```
./ec2rl run --backup=allvolumes
```

**特定のアタッチされたボリュームのスナップショットを作成するには**  
`./ec2rl run` コマンドを使用し、--`backup` にはバックアップするボリュームの ID を指定します。

```
./ec2rl run --backup=vol-01234567890abcdef
```

# Amazon EC2 Linux インスタンス用の EC2Rescue モジュールを開発する
<a name="ec2rl_moduledev"></a>

モジュールは、データシリアル化スタンダードである YAML デ書き込まれます。モジュールの YAML ファイルは、モジュールとその属性を示す単一のドキュメントで構成されます。

## モジュール属性の追加
<a name="ec2rl-adding-modules"></a>

次の表には、利用できるモジュールの属性が一覧表示されます。


| 属性 | 説明 | 
| --- | --- | 
| name | モジュールの名前。この名前は、長さが 18 文字以下である必要があります。 | 
| version | モジュールのバージョン番号。 | 
| タイトル | モジュールの短い説明タイトルです。この値は、長さが 50 文字以下である必要があります。 | 
| helptext |  モジュールの拡張された説明。各列は、長さが 75 文字以下である必要があります。必須あるいはオプションでモジュールが引数を消費する場合、helptext 値にこの引数を含めます。 次に例を示します。 <pre>helptext: !!str |<br />  Collect output from ps for system analysis<br />  Consumes --times= for number of times to repeat<br />  Consumes --period= for time period between repetition</pre> | 
| placement | モジュールが実行されるべきステージ。サポートされる値。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
| language | モジュールコードが書き込まれている言語。サポートされる値。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  Python コードは、Python 2.7.9\$1 および Python 3.2\$1 の両方と互換性がある必要があります。   | 
| 修復 |  モジュールが修復をサポートするかどうかを示します。サポートされている値は `True` または `False` です。 この値がない場合、モジュールのデフォルトは `False` です。修復をサポートしないそれらのモジュールのオプション属性となります。  | 
| コンテンツ | 全スクリプトコード。 | 
| 制約 | 制約値を含むオブジェクトの名前。 | 
| ドメイン | モジュールがどのようにグループ化または分類されているかの説明。含まれているモジュール一連は次のドメインを使用します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| class | モジュールによって実行されるタスクの種類の説明。含まれているモジュール一連は次のクラスを使用します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| distro | このモジュールがサポートする Linux ディストリビューションの一覧。含まれているモジュール一連は次のディストリビューションを使用します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| 必須 | CLI オプションからモジュールが消費する必要な引数。 | 
| optional | モジュールが使用できるオプションの引数。 | 
| ソフトウェア | モジュールで使用される実行可能なソフトウェア。この属性は、デフォルトでインストールされないソフトウェアの特定を行います。Linux 用 EC2Rescue ロジックは、モジュールを実行する前に、このプログラムが存在し、実行可能であることを確認します。 | 
| package | 実行ファイル用のソースソフトウェアパッケージ。この属性は、ソフトウェアのパッケージにダウンロード用 URL やそのほかの詳細などの詳しい情報を提供するためのものです。 | 
| sudo | ルートアクセスがモジュールの実行に必要であるかどうかを示します。 モジュールスクリプトで sudo チェックを行う必要はありません。値が true になると、Linux 用 EC2Rescue ロジックは実行しているユーザーがルートアクセスを所持している場合にのみモジュールを実行します。 | 
| perfimpact | モジュールが実行している環境に重要な影響を及ぼす可能性があるかどうかを示します。値が true であり、`--perfimpact=true` 引数が存在しない場合、モジュールはスキップされます。 | 
| parallelexclusive | 相互占有を必要とするプログラムを特定します。例えば、「bpf」を指定するすべてのモジュールはシリアル方法で実行します。 | 

## 環境変数の追加
<a name="ec2rl_adding_envvars"></a>

次の表には、利用できるモジュールの属性が一覧表示されます。


| 環境変数 | 説明 | 
| --- | --- | 
|  `EC2RL_CALLPATH`  | ec2rl.py へのパス。このパスを使用すると、lib ディレクトリを見つけて、ベンダーの Python モジュールを使用できます。 | 
|  `EC2RL_WORKDIR`  |  診断ツールの主要な tmp ディレクトリ。 デフォルト値: `/var/tmp/ec2rl`。 | 
|  `EC2RL_RUNDIR`  |  すべての出力が保存されているディレクトリ。 デフォルト値: `/var/tmp/ec2rl/<date&timestamp>`。  | 
|  `EC2RL_GATHEREDDIR`  |  収集されたモジュールデータを配置するルートディレクトリ。 デフォルト値:`/var/tmp/ec2rl/<date&timestamp>/mod_out/gathered/`。  | 
|  `EC2RL_NET_DRIVER`  |  初めて使用されるドライバーが、インスタンスの非仮想ネットワークインターフェースでアルファベット順に順序付けされます。 例: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
|  `EC2RL_SUDO`  |  Linux 用 EC2Rescue がルートとして実行されている場合には true、そうでない場合には false。  | 
|  `EC2RL_VIRT_TYPE`  |  インスタンスメタデータから提供される仮想化タイプ。 例: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
|  `EC2RL_INTERFACES`  |  システム上のインターフェースの列挙一覧。この値は、`eth0` や `eth1` などの名前が含まれる文字列です。これは `functions.bash` を介して生成され、これをソースとするモジュールのみで利用できます。  | 

## YAML 構文の使用
<a name="ec2rl_yamlsyntax"></a>

モジュール YAML ファイルを構築する際、以下に注意してください。
+ 3 つのハイフン (`---`) は、ドキュメントの明示的な開始を示します。
+ `!ec2rlcore.module.Module` タグは、データストリームからオブジェクトを作成する際にどのコンストラクタを呼び出すかを YAML パーサーに伝えます。`module.py` ファイル内コンストラクタを検索できます。
+ `!!str` タグは、データの種類を決定する試行を行なわず、代わりにコンテンツを文字列リテラルとして解釈するように YAML パーサーに伝えます。
+ パイプ文字 (`|`) は、値がリテラル形式のスカラーであることを YAML パーサーに伝えます。この場合、パーサーにはすべての空白が含まれます。インデントと改行文字が保持されるため、これはモジュールにとって重要です。
+ YAML スタンダードインデントは 2 つのスペースとなり、次の例で示されます。スクリプトでスタンダードインデント (例えば、Python では 4 つの空白) を維持して、モジュールファイル内で全コンテンツを 2 つのスペースでインデントすることを確認します。

## モジュールの例
<a name="ec2rl_example"></a>

例 1 (`mod.d/ps.yaml`):

```
--- !ec2rlcore.module.Module
# Module document. Translates directly into an almost-complete Module object
name: !!str ps
path: !!str
version: !!str 1.0
title: !!str Collect output from ps for system analysis
helptext: !!str |
  Collect output from ps for system analysis
  Requires --times= for number of times to repeat
  Requires --period= for time period between repetition
placement: !!str run
package: 
  - !!str
language: !!str bash
content: !!str |
  #!/bin/bash
  error_trap()
  {
      printf "%0.s=" {1..80}
      echo -e "\nERROR:	"$BASH_COMMAND" exited with an error on line ${BASH_LINENO[0]}"
      exit 0
  }
  trap error_trap ERR

  # read-in shared function
  source functions.bash
  echo "I will collect ps output from this $EC2RL_DISTRO box for $times times every $period seconds."
  for i in $(seq 1 $times); do
      ps auxww
      sleep $period
  done
constraint:
  requires_ec2: !!str False
  domain: !!str performance
  class: !!str collect
  distro: !!str alami ubuntu rhel suse
  required: !!str period times
  optional: !!str
  software: !!str
  sudo: !!str False
  perfimpact: !!str False
  parallelexclusive: !!str
```