

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 EC2Rescue 疑難排解受損的 Amazon EC2 Linux 執行個體
適用於 Linux 執行個體的 EC2Rescue

適用於 Linux 的 EC2Rescue 是容易使用的開源工具，您可在 Amazon EC2 Linux 執行個體執行它，利用其 100 多個*模組*的程式庫診斷、疑難排解及修復常見問題。模組是包含 BASH 或 Python 指令碼和必要中繼資料的 YAML 檔案。

適用於 Linux 的 EC2Rescue 執行個體的一些一般使用案例包括：
+ 收集 syslog 和套件管理員日誌
+ 收集資源使用率資料
+ 診斷和修復已知有問題的核心參數和常見 OpenSSH 問題

**注意**  
`AWSSupport-TroubleshootSSH` AWS Systems Manager Automation Runbook 安裝適用於 Linux 的 EC2Rescue，然後使用 工具來檢查或嘗試修正防止 SSH 連線至 Linux 執行個體的常見問題。如需詳細資訊，請參閱 [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
安裝 EC2Rescue

適用於 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


`AWSSupport-TroubleshootSSH` Runbook 安裝了 適用於 Linux 的 EC2Rescue，然後使用該工具來檢查或嘗試修正阻止透過 SSH 遠端連線至 Linux 機器的常見問題。如需詳細資訊，並執行此自動化，請參閱 [支援-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 的簽章


下列是驗證用於以 Linux 為基礎之作業系統的 適用於 Linux 的 EC2Rescue 套件有效性的建議程序。

當您從網際網路下載應用程式時，建議您驗證軟體發佈者的身分，並檢查應用程式在發佈之後並未遭更改或損毀。如此可保護您，避免安裝到包含病毒或其他惡意程式碼的應用程式版本。

如果在執行此主題中的步驟後，您判斷 適用於 Linux 的 EC2Rescue 的軟體已遭更改或損毀，請勿執行安裝檔案。反之，請聯絡 Amazon Web Services。

適用於以 Linux 為基礎之作業系統的 適用於 Linux 的 EC2Rescue 檔案使用 GnuPG 簽章，這是一種用於安全數位簽章的 Pretty Good Privacy (OpenPGP) 標準的開放原始碼實作。GnuPG （也稱為 GPG) 透過數位簽章提供身分驗證和完整性檢查。 會 AWS 發佈公有金鑰和簽章，供您用來驗證下載的 EC2Rescue for Linux 套件。如需 PGP 和 GnuPG (GPG) 的詳細資訊，請參閱 https：//[https://www.gnupg.org/](https://www.gnupg.org/)。

第一步是與軟體發佈者建立信任。下載軟體發佈者的公開金鑰，檢查公開金鑰的擁有者是否為聲稱的擁有者，然後將公開金鑰新增至您的 keyring。您的 keyring 是一組已知的公開金鑰。在您建立公開金鑰的真實性之後，即可用它來驗證應用程式的簽章。

**Topics**
+ [

### 驗證和匯入公開金鑰
](#ec2rl_authenticate)
+ [

### 驗證套件的簽章
](#ec2rl_verify_signature)

### 驗證和匯入公開金鑰


此程序的下一個步驟是驗證 適用於 Linux 的 EC2Rescue 公開金鑰，並將其做為信任的金鑰新增至 GPG keyring。

**驗證和匯入 適用於 Linux 的 EC2Rescue 公開金鑰**

1. 在命令提示中，使用以下命令以取得我們公開 GPG 建置金鑰的複本：

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

1. 在您儲存 `ec2rl.key` 的目錄的命令提示字元中，使用下列命令將 適用於 Linux 的 EC2Rescue 公開金鑰匯入至您的 keyring：

   ```
   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 公用程式。

### 驗證套件的簽章


在您安裝 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 安裝檔案的目錄中，在命令提示字元上執行以下命令以驗證簽章。兩個檔案都必須存在。

   ```
   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：//[https://www.gnupg.org/](https://www.gnupg.org/)。

# 在 Amazon EC2 Linux 執行個體上執行 EC2Rescue 命令
執行 EC2Rescue 命令

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 模組


**執行所有 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 模組結果


如果 支援 已請求 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 執行個體備份


您可以透過建立 AMI 或建立附加磁碟區的快照來使用 EC2Rescue 備份 Linux 執行個體。

**若要建立 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 模組
開發 EC2Rescue 模組

模組是使用 YAML (資料序列化標準) 撰寫。模組的 YAML 檔案是由單一文件組成，代表模組及其屬性。

## 新增模組屬性


下表列出可用的模組屬性。


| 屬性 | 描述 | 
| --- | --- | 
| name | 模組的名稱。此名稱長度應小於或等於 18 個字元。 | 
| version | 模組的版本編號。 | 
| title | 模組的簡述標題。此值長度應小於或等於 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/zh_tw/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
| 語言 | 撰寫模組程式碼的語言。支援的值為： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  Python 程式碼必須與 Python 2.7.9\$1 和 Python 3.2\$1 都相容。   | 
| remediation |  指出模組是否支援修補。支援的值為 `True` 或 `False`。 如果無此屬性，模組將預設為 `False`，讓其成為不支援修補之模組的選用屬性。  | 
| content | 完整的指令碼程式碼。 | 
| 限制條件 | 包含限制值的物件名稱。 | 
| domain | 說明模組如何分組或分類的描述項。包含的模組集使用下列網域： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| class | 模組執行的任務類型描述項。包含的模組集使用下列類別： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| distro | 此模組支援的 Linux 發行版本清單。包含的模組集使用下列發行版本： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| 必要 | 模組從 CLI 選項使用的必要引數。 | 
| 選擇性 | 模組可以使用的選用引數。 | 
| software | 在模組中使用的軟體可執行檔。此屬性旨在指定非預設安裝的軟體。適用於 Linux 的 EC2Rescue 邏輯在執行模組前會確保這些程式存在並可執行。 | 
| package | 可執行檔的來源軟體套件。此屬性旨在提供套件有關軟體的延伸詳細資料，包括下載或取得未來資訊的 URL。 | 
| sudo | 指出是否一定要有根存取才能執行模組。 您不必在模組指令碼中實作 sudo 檢查。如果此值為 true，則當執行使用者有根存取時，適用於 Linux 的 EC2Rescue 邏輯只會執行模組。 | 
| perfimpact | 指出模組是否會顯著影響其執行所在環境的效能。如果此值為 true 且無 `--perfimpact=true` 引數，則跳過模組。 | 
| parallelexclusive | 指定需要互斥的程式。例如，所有指定 "bpf" 的模組都依序執行。 | 

## 新增環境變數


下表列出可用的環境變數。


| 環境變數 | 描述 | 
| --- | --- | 
|  `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/zh_tw/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/zh_tw/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
|  `EC2RL_INTERFACES`  |  系統上的界面列舉清單。值是包含名稱的字串，例如 `eth0`、`eth1` 等等。這是透過 `functions.bash` 產生的，僅供其來源模組使用。  | 

## 使用 YAML 語法


建構您的模組 YAML 檔案時，應該注意下列各點：
+ 三個連字號 (`---`) 表示文件的明確開頭。
+ 從資料串流建立物件時，`!ec2rlcore.module.Module` 標籤會告訴 YAML 剖析器要呼叫哪個建構函數。您可於 `module.py` 檔案中找到建構函數。
+ `!!str` 標籤會告訴 YAML 剖析器不要嘗試判斷資料類型，改將內容解譯為字串常值。
+ 管道字元 (`|`) 會告訴 YAML 剖析器此值為常值型純量。在本例中，剖析器包含所有空格。這對模組而言很重要，因為會保留縮排和換行字元。
+ YAML 標準會縮排兩格，如下列範例所示。請確定您的指令碼保持標準縮排 (例如，Python 四格)，然後在模組檔案中將完整內容縮排兩格。

## 範例模組


範例一 (`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
```