想定読者2021年になってからなぜ、触ったか実際にやってみたまずはドキュメントからシリアルコンソールシリアルコンソールを有効にするLinux インスタンス用 EC2 シリアルコンソールWindows インスタンス用 EC2 シリアルコンソールEC2RescueLinux 用 EC2RescueEC2Rescue for Windows Serverルートボリュームを入れ替える以前のスナップショットを使用した Amazon EBS ボリュームの置き換え実際に行うシナリオシリアルコンソールEC2Rescueルートボリュームを入れ替える事前準備AWS CLIPowershellでのalias$profile に記載する内容動作確認IAMEC2実験環境準備初めてEC2を起動した場合に表示されるエラー実験サーバたち実験開始シリアルコンソールEC2Rescueルートボリュームを入れ替えるまとめ
想定読者
- AWSのAmazonEC2で運用している方
- トラブルシューティングを行う立場の方
- 当該サービスを利用したことが無い方
2021年になってから
EC2のサービスアップデート、それも地味なんですが大事なアップデートがありました。
なぜ、触ったか
興味もありますが、この渋い機能を触ってみないことにはありがたみを体験できない、
いざ本番でいきなり触らざるを得ない状況になったときに慌てずに済むかと思いました。
実際にやってみた
まずはドキュメントから
シリアルコンソール
- デフォルトではシリアルコンソールにアクセス不可
- インスタンスのトラブルシューティングにするために(できれば専用の)ユーザとパスコードを設定
- 利用可能なリージョン(2021年5月1日時点)
- 米国東部(バージニア北部)、米国東部 (オハイオ)、米国西部 (オレゴン) 欧州 (アイルランド)、欧州 (フランクフルト)、アジアパシフィック (シドニー)、アジアパシフィック (東京)、アジアパシフィック (シンガポール)
- サポートされるインスタンスファミリー(2021年5月1日時点)
- A1
- C5、C5a、C5ad、C5d、C5n、C6g、C6gd
- M5、M5a、M5ad、M5d、M5dn、M5n、M5zn、M6g、M6gd
- R5、R5a、R5ad、R5d、R5dn、R5n、R6、R6gd
- T3、T3a、T4g
- Z1d
シリアルコンソールを有効にする
- アクセスできないとき
>aws ec2 get-serial-console-access-status --region ap-northeast-1
{
"SerialConsoleAccessEnabled": false
}
>aws ec2 get-serial-console-access-status --region ap-northeast-1
{
"SerialConsoleAccessEnabled": true
}
Linux インスタンス用 EC2 シリアルコンソール
- シリアルコンソール接続で利用するユーザのパスコードを設定する
- 設定をしたいインスタンスで
sudo passwd root
(これはrootユーザの例)などを行う
- 設定をしたいインスタンスで
- 接続するクライアントでSSHクライアントと独自のキーで接続する
- Windows端末だと予めパブリックキー、プライベートキーを作成するのは少数かも...
Windows インスタンス用 EC2 シリアルコンソール
- Windowsの場合は、予めAdministratorのパスワードを作成されるのでそちらを利用
EC2Rescue
Linux 用 EC2Rescue
- Linux 用 EC2Rescue のインストール
- サポートされるオペレーティングシステム
- Amazon Linux 2
- Amazon Linux 2016.09+
- SUSE Linux Enterprise Server 12+
- RHEL 7+
- Ubuntu 16.04+
- ソフトウェア要件
- Python 2.7.9+ または 3.2+
- サポートされるオペレーティングシステム
EC2Rescue for Windows Server
- サポートされるオペレーティングシステム
- Windows Server 2008 R2 以降
ルートボリュームを入れ替える
以前のスナップショットを使用した Amazon EBS ボリュームの置き換え
- 現在のボリュームをデタッチしてから、新しいボリュームをアタッチする
- EBS ボリュームのアタッチ先は、同じアベイラビリティーゾーン内の EC2 インスタンスに限られる
- 状況によっては、
/dev/xvda
や/dev/sda
にアタッチしたボリューム以外のボリュームでルートボリュームになる可能性がある
実際に行うシナリオ
シリアルコンソール
- Linux
- sshのデーモンプロセスを 誤って Killしてしまった場合( kill -9
${sshd_pid}
) .ssh/config
の権限を 誤って 設定してしまった場合
- sshのデーモンプロセスを 誤って Killしてしまった場合( kill -9
- Windows
- RDPが利用できない端末を使用している場合
EC2Rescue
- Linux
- すべてのモジュールを実行(
sudo ./ec2rl run
)
- すべてのモジュールを実行(
- Windows
- 管理者パスワードが分からなくなった場合
- EC2Config (Windows Server 2012 R2 以前)を利用してEc2SetPasswordを使い新しい管理者パスワードを生成
- EC2Launch (Windows Server 2016 以降)を利用してEc2SetPasswordを使い新しい管理者パスワードを生成
- 管理者パスワードが分からなくなった場合
ルートボリュームを入れ替える
- Linux
- 滅びの呪文(
sudo rm -rf /
)を 誤って 実行してしまった場合
- 滅びの呪文(
事前準備
まずは実験環境を作成するために必要な設定を実施
AWS CLI
- 公式 AWS CLI バージョン 2 Docker イメージの使用
- Linux/macOSだとaliasで完結してしまうので、Windows想定
docker run --rm -it -v %userprofile%\\.aws:/root/.aws amazon/aws-cli
%command%
- Linux/macOSだとaliasで完結してしまうので、Windows想定
Powershellでのalias
- 管理者権限でPowershellを起動し実行ポリシーの変更
Set-ExecutionPolicy RemoteSigned -Force
Get-ExecutionPolicy
で確認
- Windows に Docker Desktop をインストール
docker -v
で確認Docker version 20.10.5, build 55c4c88
で記事を作成
- Powershell
New-Item –type file –force $profile
でPS起動時に読み込むファイルを作成notepad $profile
で編集aws --version
で動作確認
$profile
に記載する内容
function aws {
$location = Get-Location
docker run --rm -v ${HOME}/.aws:/root/.aws -v ${location}:/aws amazon/aws-cli $Args
}
動作確認
> aws --version
Unable to find image 'amazon/aws-cli:latest' locally
latest: Pulling from amazon/aws-cli
99a21848b482: Pull complete
f3944f83fc76: Pull complete
faabaca4f97b: Pull complete
e9ba7dc72ebe: Pull complete
40686cdddde2: Pull complete
Digest: sha256:cb3819faeea756e87b273c8eb6d007b607f12282440755794295e75e28fa2659
Status: Downloaded newer image for amazon/aws-cli:latest
aws-cli/2.2.1 Python/3.8.8 Linux/5.4.72-microsoft-standard-WSL2 docker/x86_64.amzn.2 prompt/off
IAM
- rescue-admin という名前でIAMユーザを作成
EC2
実験環境準備
aws-cdk-sample にて公開していますが、
前述の実験するための環境を作成するCDKのサンプルファイルを作成しています。
予め、キーペアを作成して頂いて、リソース作成時にパラメータとして渡すことで作成されます
- VPC
- Subnet
- EC2 ✕ 6台
- Amazon Linux2 4台
- Windows Server 2019 Core 2台
初めてEC2を起動した場合に表示されるエラー
初めてEC2を起動するリージョンの場合は、しばらく待つとAWSから「Your Request For Accessing AWS Resources Has Been Validated」というメールが届くのでお待ちください
8/16 | 13:57:03 | CREATE_FAILED | AWS::EC2::Instance | tkyEc2f Your request for accessing resources in this region is being validated, and you will not be able
to launch additional resources in this region until the validation is complete. We will notify you by email once your request has been validated. While normally resolved within minutes, please allow up to 4 hours for this process to complete. If the issue still persists, please let us know by writing to aws-verification@amazon.com for further assistance. (Service: AmazonEC2; Status Code: 400; Error Code: PendingVerification; Request ID: 6a88df4b-d83b-4320-8700-5ee9f6c1764f; Proxy: null)
new SrcStack (C:\\Projects\\aws-cdk-sample\\aws-cdk-sample\\src\\lib\\src-stack.ts:152:23)
\\_ Object.<anonymous> (C:\\Projects\\aws-cdk-sample\\aws-cdk-sample\\src\\bin\\src.ts:7:1)
\\_ Module._compile (internal/modules/cjs/loader.js:1063:30)
\\_ Module.m._compile (C:\\Projects\\aws-cdk-sample\\aws-cdk-sample\\src\\node_modules\\ts-node\\src\\index.ts:1056:23)
\\_ Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
\\_ Object.require.extensions.<computed> [as .ts] (C:\\Projects\\aws-cdk-sample\\aws-cdk-sample\\src\\node_modules\\ts-node\\src\\index.ts:1059:12)
\\_ Module.load (internal/modules/cjs/loader.js:928:32)
\\_ Function.Module._load (internal/modules/cjs/loader.js:769:14)
\\_ Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
\\_ main (C:\\Projects\\aws-cdk-sample\\aws-cdk-sample\\src\\node_modules\\ts-node\\src\\bin.ts:198:14)
\\_ Object.<anonymous> (C:\\Projects\\aws-cdk-sample\\aws-cdk-sample\\src\\node_modules\\ts-node\\src\\bin.ts:288:3)
\\_ Module._compile (internal/modules/cjs/loader.js:1063:30)
\\_ Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
\\_ Module.load (internal/modules/cjs/loader.js:928:32)
\\_ Function.Module._load (internal/modules/cjs/loader.js:769:14)
\\_ Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
\\_ internal/main/run_main_module.js:17:47
8/16 | 13:57:03 | CREATE_FAILED | AWS::EC2::Instance |
実験サーバたち
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[{Instance:InstanceId}, {State:State.Name},{PublicIpAddress:PublicIpAddress},{VolumeName:BlockDeviceMappings[*].DeviceName},{VolumeId:BlockDeviceMappings[*].Ebs.VolumeId},{ImageId:ImageId}]' --output yaml
- - - Instance: i-0d5ed80e0cf1cf423
- State: running
- PublicIpAddress: 13.231.159.93
- VolumeName:
- /dev/sda1
- VolumeId:
- vol-0fbf23be9d7829fc8
- ImageId: ami-0a8f70a19608d9e8f
- - - Instance: i-027fc9866bcdebea4
- State: running
- PublicIpAddress: 18.179.14.108
- VolumeName:
- /dev/xvda
- VolumeId:
- vol-0cb6295c58b0d24b3
- ImageId: ami-0f037327d64de9e49
- - - Instance: i-0affaf9475a0c08e7
- State: running
- PublicIpAddress: 13.114.175.144
- VolumeName:
- /dev/xvda
- VolumeId:
- vol-024a2457c789b9f49
- ImageId: ami-0f037327d64de9e49
- - - Instance: i-00be31cf6a8086b47
- State: running
- PublicIpAddress: 54.238.231.164
- VolumeName:
- /dev/xvda
- VolumeId:
- vol-06e289e23476d3e55
- ImageId: ami-0f037327d64de9e49
- - - Instance: i-0d646b701c2c8ddf7
- State: running
- PublicIpAddress: 54.250.148.9
- VolumeName:
- /dev/sda1
- VolumeId:
- vol-00ccd542e5aab6e05
- ImageId: ami-0a8f70a19608d9e8f
- - - Instance: i-0cf0e004d715d8d49
- State: running
- PublicIpAddress: 18.183.149.191
- VolumeName:
- /dev/xvda
- VolumeId:
- vol-00829f9b262d558c3
- ImageId: ami-0f037327d64de9e49
aws ec2 describe-images --query 'Images[].[{ImageId:ImageId},{Description:Description}]' --image-ids ami-0a8f70a19608d9e8f ami-0f037327d64de9e49 --output yaml
- - ImageId: ami-0a8f70a19608d9e8f
- Description: Microsoft Windows Server 2019 with Desktop Experience Locale Japanese
AMI provided by Amazon
- - ImageId: ami-0f037327d64de9e49
- Description: Amazon Linux 2 AMI 2.0.20210421.0 x86_64 HVM gp2
実験開始
シリアルコンソール
- Linux
- sshのデーモンプロセスを 誤って 停止してしまった場合( kill -9 ${sshd_pid}でもいいかな?)
- プロセス確認
sudo systemctl status sshd
Active: active (running)
- プロセス停止
sudo systemctl stop sshd
Active: inactive (dead)
- EC2シリアルコンソール接続
- 設定したユーザとパスワードを入力
- SSHプロセスの復旧
- SSHの接続も可能
- プロセス確認
.ssh/authorized_keys
を 誤って 設定してしまった場合- 権限変更
$ ls -al .ssh/authorized_keys -rw------- 1 ec2-user ec2-user 388 May 1 07:05 .ssh/authorized_keys $ $ sudo chown root:root .ssh/authorized_keys $ $ ls -al .ssh/authorized_keys -rw------- 1 root root 388 May 1 07:05 .ssh/authorized_keys $
- 権限変更
- シリアルコンソール接続
- sshのデーモンプロセスを 誤って 停止してしまった場合( kill -9 ${sshd_pid}でもいいかな?)
# sudo chown ec2-user:ec2-user /home/ec2-user/.ssh/authoriz
#
#
# ls -l /home/ec2-user/.ssh/authorized_keys
-rw------- 1 root root 388 May 1 07:05 /home/ec2-user/.ssh/authorized_keys
#
# sudo chown ec2-user:ec2-user /home/ec2-user/.ssh/authoriz
# ls -l /home/ec2-user/.ssh/authorized_keys
-rw------- 1 ec2-user ec2-user 388 May 1 07:05 /home/ec2-user/.ssh/authorized_keys
#
- 変更後
- Windows
- RDPが利用できない端末を使用している場合
t3.micro
だと起動処理の途中で止まったのでt3.medium
へ変更後起動した様子
EC2Rescue
- Linux
- すべてのモジュールを実行(
sudo ./ec2rl run
)
- すべてのモジュールを実行(
$ sudo ./ec2rl run
-----------[Backup Creation]-----------
No backup option selected. Please consider backing up your volumes or instance
----------[Configuration File]----------
Configuration file saved:
/var/tmp/ec2rl/2021-05-01T07_51_32.356031/configuration.cfg
-------------[Output Logs]-------------
The output logs are located in:
/var/tmp/ec2rl/2021-05-01T07_51_32.356031
--------------[Module Run]--------------
Running Modules:
arptable, blkid, cgroups, clocksource, cpuinfo, date, ethtool, ethtoolg, ethtooli, ethtoolk, ethtools, ifconfig, iomem, iproute, ipslink, iptablesrules, kernelcmdline, kernelversion, kpti, last, localtime, lsblk, lsmod, lspci, mdstat, meminfo, mounts, osrelease, pagetypeinfo, partitions, procstat, retpoline, rpmpackages, scheddebug, slabinfo, sysctl, vmallocinfo, xenfeatures, zoneinfo, arpcache, arpignore, asymmetricroute, conntrackfull, consoleoverload, duplicatefslabels, duplicatefsuuid, duplicatepartuuid, hungtasks, ixgbevfversion, kernelbug, kerneldereference, kernelpanic, oomkiller, openssh, softlockup, tcprecycle, xennetrocket, cloudinitlog, dhclientleases, dmesg, environment, fstab, hosts, httpdlogs, inittab, kerberosconfig, kernelconfig, libtirpcnetconfig, lvmconf, messages, mysqldlog, nginxlogs, nsswitch, ntpconf, profile, resolvconf, sarhistory, sysctlconf, systemsmanager, udev, workspacelogs, yumlog
----------[Diagnostic Results]----------
module run/openssh [FAILURE] Improper configuration of one or more OpenSSH components.
-- SSH may deny access to users when improperly configured.
-- FAILURE Permission mode includes permissions for groups and/or other users: /etc/ssh/ssh_host_rsa_key
-- Adjust permissions: sudo chmod 600 /etc/ssh/ssh_host_rsa_key
-- FAILURE Permission mode includes permissions for groups and/or other users: /etc/ssh/ssh_host_ecdsa_key
-- Adjust permissions: sudo chmod 600 /etc/ssh/ssh_host_ecdsa_key
-- FAILURE Permission mode includes permissions for groups and/or other users: /etc/ssh/ssh_host_ed25519_key
-- Adjust permissions: sudo chmod 600 /etc/ssh/ssh_host_ed25519_key
module run/arpcache [SUCCESS] Aggressive arp caching is disabled.
module run/arpignore [SUCCESS] arp ignore is disabled for all interfaces.
module run/asymmetricroute [SUCCESS] No duplicate subnets found.
module run/conntrackfull [SUCCESS] No conntrack table full errors found.
module run/consoleoverload [SUCCESS] No serial console overload found
module run/duplicatefslabels [SUCCESS] No duplicate filesystem labels found.
module run/duplicatefsuuid [SUCCESS] No duplicate filesystem UUIDs found.
module run/duplicatepartuuid [SUCCESS] No duplicate partition UUIDs found.
module run/hungtasks [SUCCESS] No hung tasks found
module run/ixgbevfversion [SUCCESS] Not using ixgbevf driver.
module run/kernelbug [SUCCESS] No kernel bug occurrences found
module run/kerneldereference [SUCCESS] No kernel null pointer dereference ocurrences found
module run/kernelpanic [SUCCESS] No kernel panic ocurrences found
module run/oomkiller [SUCCESS] No oom-killer invocations found
module run/softlockup [SUCCESS] No CPU soft lockup ocurrences found
module run/tcprecycle [SUCCESS] Aggressive TCP recycling is disabled.
module run/xennetrocket [SUCCESS] Not using xen_netfront driver.
--------------[Run Stats]--------------
Total modules run: 82
'diagnose' modules run: 18
successes: 17
failures: 1
warnings: 0
unknown: 0
'collect' modules run: 39
'gather' modules run: 25
Modules not run due to missing: sudo | software | parameters | perf-impact
0 | 7 | 63 | 7
----------------[NOTICE]----------------
Please note, this directory could contain sensitive data depending on modules run! Please review its contents!
----------------[Upload]----------------
You can upload results to AWS Support with the following, or run 'help upload' for details on using an S3 presigned URL:
sudo ./ec2rl upload --upload-directory=/var/tmp/ec2rl/2021-05-01T07_51_32.356031 --support-url="URLProvidedByAWSSupport"
The quotation marks are required, and if you ran the tool with sudo, you will also need to upload with sudo.
---------------[Feedback]---------------
We appreciate your feedback. If you have any to give, please visit:
<https://aws.au1.qualtrics.com/jfe1/form/SV_3KrcrMZ2quIDzjn?InstanceID=i-00be31cf6a8086b47&Version=1.1.4>
- 実行結果が得られるのでAWSサポートに提供する(流れが公式手順)
$ pwd
/var/tmp/ec2rl
$
$ tree
.
tqq 2021-05-01T07_50_44.679097
x?? tqq gathered_out
x?? tqq Main.log
x?? mqq mod_out
x?? tqq postdiagnostic
x?? tqq prediagnostic
x?? mqq run
mqq 2021-05-01T07_51_32.356031 [error opening dir]
7 directories, 1 file
$
- Windows
- 管理者パスワードが分からなくなった場合
- EC2Config (Windows Server 2012 R2 以前)を利用してEc2SetPasswordを使い新しい管理者パスワードを生成
- EC2Launch (Windows Server 2016 以降)を利用してEc2SetPasswordを使い新しい管理者パスワードを生成
- EC2Rescue for Windows ServerをInternet Explorer セキュリティ強化の構成 (ESC) を変更せずにダウンロードするPowershellコマンド
Invoke-WebRequest <https://s3.amazonaws.com/ec2rescue/windows/EC2Rescue_latest.zip> -OutFile $env:USERPROFILE\\Desktop\\EC2Rescue_latest.zip
- このインスタンスか、アタッチしたインスタンスか確認
- 公式手順に沿って、調査対象のインスタンスからルートボリュームをデタッチして、このインスタンスにアタッチ
- そうするとツールが自動で追加でアタッチしたボリュームを検出
- どのログを取得するかチェックボックスで選択
- 確認画面が表示
- ZIPの保存先を指定すると実行
- 指定のログが出力されるのであとは確認
- 管理者パスワードが分からなくなった場合
ルートボリュームを入れ替える
- Linux
- 滅びの呪文(
sudo rm -rf /
)を 誤って 実行してしまった場合- 現在の状態を確認
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[{Instance:InstanceId}, {State:State.Name},{PublicIpAddress:PublicIpAddress},{VolumeName:BlockDeviceMappings[*].DeviceName},{VolumeId:BlockDeviceMappings[*].Ebs.VolumeId},{ImageId:ImageId}]' --instance-ids i-0cf0e004d715d8d49 --output yaml
- - - Instance: i-0cf0e004d715d8d49 - State: running - PublicIpAddress: 18.183.149.191 - VolumeName: - /dev/xvda - VolumeId: - vol-00829f9b262d558c3 - ImageId: ami-0f037327d64de9e49
- スナップショットの状態を確認
> aws ec2 describe-snapshots --owner-ids self --query 'Snapshots[]' --region=ap-northeast-1 [ { "Description": "", "Encrypted": false, "OwnerId": "***********", "Progress": "100%", "SnapshotId": "snap-0432042c8b3bcbeb0", "StartTime": "2021-05-01T08:47:45.086000+00:00", "State": "completed", "VolumeId": "vol-00829f9b262d558c3", "VolumeSize": 8 } ]
- 実験開始
- 置き換えタスクの設定(完了と表示されているけど...)
- 実行結果の確認
- 実行結果の確認
- VolumeIdが置き換わっています
- 現在の状態を確認
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[{Instance:InstanceId}, {State:State.Name},{PublicIpAddress:PublicIpAddress},{VolumeName:BlockDeviceMappings[*].DeviceName},{VolumeId:BlockDeviceMappings[*].Ebs.VolumeId},{ImageId:ImageId}]' --instance-ids i-0cf0e004d715d8d49 --output yaml
- - - Instance: i-0cf0e004d715d8d49 - State: running - PublicIpAddress: 18.183.149.191 - VolumeName: - /dev/xvda - VolumeId: - vol-00c2c1dd79beb1db8 - ImageId: ami-0f037327d64de9e49
- 滅びの呪文(
まとめ
最近のEC2でサービスアップデートされている内容が一通り実施できてよかったです。
どうしても新しいサービスに飛びつきですが、こういったトラブルシューティング関連の内容は、
実際の現場で初めて触って、ただでさえ1分1秒の復旧が望まれるような状況で、
そもそもの使い方をドキュメントから読み解きながら実行するという二重苦からは少し開放されるかなと思います。
日頃から訓練って大事ですね。