「AWS無料相談会」をオンラインで開催中

EC2インスタンスにつながらない障害が発生した状況と対策

EC2インスタンスにつながらない障害が発生した状況と対策

はじめに

今週、 AWS Systems Manager(SSM)Session Manager で踏み台用のEC2インスタンスにつながらなくなる障害が2件立て続けに発生した。
それぞれ原因が違っており、復旧に手間取ってしまったため、今回は備忘録も兼ねて状況と対応策について整理してまとめておきたいと思う。

1. No space left on device

状況

1件目の障害は下記のような状況だった。
AWSのマネジメントコンソールから Session Manager で接続しようとすると、ボタンは押せるものの…

下記のような状態で、いつまで経ってもプロンプトが返ってこない状態だった。

SSMの Session History から確認すると、 Start dateEnd date が同じ時間になっており、 StatusTerminated となっていた。

原因

取り急ぎ、インスタンスの再起動を行ってみたものの、現象は改善されず。
下記の画像の通り、 Actions -> Monitor and troubleshoot -> Get system log からログを確認すると…

No space left on device

と出ていた。
ディスクの使用率が100%になってしまっていたことが原因だった。

対応

ディスクはデフォルトの8GBとしか割り当てていなかったため、EBSを拡張する必要がある。

該当のEBSから Modify Volume を選択する。

サイズを変更する。今回は再現環境のため、9GBにした。

Yes を押す。

EBS ボリュームのサイズを増やしたら、ファイルシステムを拡張する。

【参考】
ボリュームサイズ変更後の Linux ファイルシステムの拡張

ディスクがフルの状態になっている踏み台EC2インスタンスでは作業ができないので、作業用のEC2インスタンスを立ち上げ、そちらにフルになったEBSをアタッチして、作業を行う。

Detach Volume でデタッチする。

次に、作業用のEC2インスタンスへ該当のEBSをアタッチする。

作業用のEC2インスタンス gene-tmp-ec2 へアタッチ。

Attach をクリック。

作業用のEC2インスタンスに Session Manager で接続して作業開始。
lsblk コマンドを使用して、インスタンスにアタッチされているデバイスに関する情報を表示する。

[root@ip-172-31-27-241 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0   9G  0 disk
└─xvdf1 202:81   0   8G  0 part

デバイスを mount コマンドで /mnt へマウントする。

[root@ip-172-31-27-241 ~]# mount -t xfs -o nouuid /dev/xvdf1 /mnt

先程マウントした /mnt の使用率が100%になっていることが確認できる。

[root@ip-172-31-27-241 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        482M     0  482M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  440K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1      8.0G  1.5G  6.6G  18% /
tmpfs            99M     0   99M   0% /run/user/0
/dev/xvdf1      8.0G  8.0G   20K 100% /mnt

growpart コマンドで、パーティションを拡張する。

[root@ip-172-31-27-241 ~]# growpart /dev/xvdf 1
CHANGED: partition=1 start=4096 old: size=16773087 end=16777183 new: size=18870239 end=18874335

再度 lsblk コマンドで確認。1番下の行のSIZEが8GBから9GBになっていることが確認できる。

[root@ip-172-31-27-241 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0   9G  0 disk
└─xvdf1 202:81   0   9G  0 part /mnt

xfs_growfs コマンドでファイルシステムを拡張する。

[root@ip-172-31-27-241 ~]# xfs_growfs -d /mnt
meta-data=/dev/xvdf1             isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 2358779

df コマンドで見てみると、 /mnt の使用率が100%から89%になったことを確認。

[root@ip-172-31-27-241 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        482M     0  482M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  440K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1      8.0G  1.5G  6.6G  18% /
tmpfs            99M     0   99M   0% /run/user/0
/dev/xvdf1      9.0G  8.0G 1022M  89% /mnt

あとは、該当のEBSを元の踏み台EC2インスタンスへアタッチしなおせば起動する。
正常に Session Manager で接続できることを確認して、作業終了。

2. no EC2 instance role found

状況

2件目の現象としては、下記のようにAWSのマネジメントコンソールから Session Manager で接続しようとすると Connect ボタンが押せなくなっていた。

1件目と同様に、ログを確認するも正常に起動しているように見えた。
SSMエージェントも正常に起動しているログが出ていた。

なんとか別のEC2インスタンスから、SSH接続してログなどを確認して見ると

/var/log/amazon/ssm/hibernate.logThe security token included in the request is invalid. と出ていたり…

[root@ip-172-31-23-250 ~]# cat /var/log/amazon/ssm/hibernate.log
2021-05-01 02:08:51 ERROR Health ping failed with error - UnrecognizedClientException: The security token included in the request is invalid.
    status code: 400, request id: e77970b7-576c-42b2-ad40-faeed8b0fd2a

/var/log/amazon/ssm/amazon-ssm-agent.logno EC2 instance role found など見慣れないログが出ていた。

2021-05-01 02:27:54 INFO [ssm-agent-worker] Entering SSM Agent hibernate - EC2RoleRequestError: no EC2 instance role found
caused by: EC2MetadataError: failed to make EC2Metadata request
    status code: 404, request id:
caused by: <?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>404 - Not Found</title>
 </head>
 <body>
  <h1>404 - Not Found</h1>
 </body>
</html>

原因と対応

ログから推測すると、どうもEC2インスタンスにアタッチしている IAM Role まわりが怪しいそうだ、と判断。

  • EC2インスタンスを停止
  • IAM Roleをデタッチ
  • 再度IAM Roleをアタッチ
  • EC2インスタンスを起動

という手順を行ってみたところ、正常に Session Manager で接続できた。

関係者に確認してみると、 Terraform で作業中に、IAM Roleの再作成が行われていたようだ、とのことだった。

今回、再現環境を構築して試してみたところ、EC2インスタンスが起動中でも、アタッチされているIAM Roleは削除可能だった。
また、削除後に同じ名前でIAM Roleを作成することもできるため、EC2側のコンソールを見ると正常にIAM Roleがアタッチされているに見えてしまうこともわかった。
おそらく今回のケースでは、EC2インスタンスが削除される前のIAM Roleを参照し続けており正常なオペレーションが行えない状態だったと思われる。

まとめ

障害が発生しているときは、どうしても復旧を急ぐあまり、焦ってしまいがち。
同じような現象が発生してもすぐに対応できるように、対応などをしっかりと整理してまとめておくのは重要なことだと思っている。
今回の情報がどこかで役に立つと嬉しい。