継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

AWS CLI で振り返る AWS 障害時の各種ステータス確認方法

タダです.

先日, AWS で大規模なネットワーク障害が発生して様々な部分で影響が出ていたと各種メディアで報じられていました.

aws.amazon.com

8/28追記

2019年8月28日(日本時間)更新 で記事が更新されました.更新された箇所を引用します.影響箇所として新たに EC2 の障害が発生した Availability Zone の RDS, Redshift, ElastiCache, WorkSpaces, 予期せぬ影響として ALB の記載が追加されました.個別の問題は AWS より個々の利用者に共有するとのことです.

今回のイベントは、東京リージョンの1つのアベイラビリティゾーン(AZ)の一部に影響を与えました。この影響は当該 AZ の Amazon EC2 および Amazon EBS のリソースに対するものですが、基盤としている EC2 インスタンスが影響を受けた場合には、当該 AZ の他のサービス(RDS、 Redshift、 ElastiCache および Workspaces 等)にも影響がありました。お客様と今回のイベントの調査をさらに進めたところ、 個別のケースのいくつかで、複数のアベイラビリティゾーンで稼働していたお客様のアプリケーションにも、予期せぬ影響(例えば、 Application Load Balancer を AWS Web Application Firewall やスティッキーセッションと組み合わせてご利用しているお客様の一部で、想定されるより高い割合でリクエストが Internal Server Error を返す)があったことを AWS では確認しております。AWS では、個別の問題についての詳細な情報を、影響を受けたお客様に直接、共有を行う予定です。

aws.amazon.com

以下,本事象のサマリーです.

原因

東京リージョンの単一の Availability Zone(データセンター群) の一部(apne1-az4)でオーバーヒートが発生したが,空調設備の管理システムの障害により冷却装置が作動しなかったことが原因のようです.

影響

影響として次の部分に出ていました.

  • 該当 Availability Zone(apne1-az4)の EC2 インスタンス及び EBS ボリュームのパフォーマンスの劣化, RDS の使用不可やマルチ Availability Zone でのフェイルオーバーに伴う一時的な通信断が発生
    • EC2 RunInstances APIのエラー率の上昇が発生し,その他の EC2 API や Auto Scaling グループからのインスタンスの新規起動も阻害
  • EC2 の障害が発生した Availability Zone の RDS, Redshift, ElastiCache, WorkSpaces, 予期せぬ影響だがALB への影響

参考

piyolog.hatenadiary.jp

僕の会社でも本障害を受けて報告資料を公表しています.

今回,たまたま遭遇したのですがマネジメントコンソールの画面の表示が崩れたり表示ができない時間帯があり,状況確認が難かったです.その時に AWS CLI を使ってステータスの状況を確認していました.当時を振り返って,他にも利用できるコマンドもあると思い調べたのでブログにまとめていきます.

Availability Zone のステータス確認

今回の障害の原因となった Availabity Zone のステータスを確認するコマンドは describe-availabity-zonesです.障害が発生した「apne1-az4」はコマンド実行結果のZoneIdからステータスを確認可能です.

docs.aws.amazon.com

コマンド実行例

$ aws ec2 describe-availability-zones --output table                                     
-------------------------------------------------------------------
|                    DescribeAvailabilityZones                    |
+-----------------------------------------------------------------+
||                       AvailabilityZones                       ||
|+-----------------+------------+------------+-------------------+|
||   RegionName    |   State    |  ZoneId    |     ZoneName      ||
|+-----------------+------------+------------+-------------------+|
||  ap-northeast-1 |  available |  apne1-az4 |  ap-northeast-1a  ||
|+-----------------+------------+------------+-------------------+|
||                       AvailabilityZones                       ||
|+-----------------+------------+------------+-------------------+|
||   RegionName    |   State    |  ZoneId    |     ZoneName      ||
|+-----------------+------------+------------+-------------------+|
||  ap-northeast-1 |  available |  apne1-az1 |  ap-northeast-1c  ||
|+-----------------+------------+------------+-------------------+|
||                       AvailabilityZones                       ||
|+-----------------+------------+------------+-------------------+|
||   RegionName    |   State    |  ZoneId    |     ZoneName      ||
|+-----------------+------------+------------+-------------------+|
||  ap-northeast-1 |  available |  apne1-az2 |  ap-northeast-1d  ||
|+-----------------+------------+------------+-------------------+|

EC2 インスタンスのステータス確認

EC2 インスタンスのステータス確認を行うコマンドはdescribe-instance-statusになります.--filters オプションで Availability Zone や インスタンスのステータスをを指定して状況を確認することが可能です.

docs.aws.amazon.com

コマンド例

$ aws ec2 describe-instance-status --filters Name=availability-zone,Values=ap-northeast-1a Name=instance-status.status,Values=impaired --output table
-------------------------------------------------------------------------
|                        DescribeInstanceStatus                         |
+-----------------------------------------------------------------------+
||                          InstanceStatuses                           ||
|+-------------------------------+-------------------------------------+|
||  AvailabilityZone             |  ap-northeast-1a                    ||
||  InstanceId                   |  i-xxxx                ||
|+-------------------------------+-------------------------------------+|
|||                              Events                               |||
||+------------------+------------------------------------------------+||
|||  Code            |  instance-stop                                 |||
|||  Description     |  The instance is running on degraded hardware  |||
|||  InstanceEventId |  instance-event-xxxxxxx              |||
|||  NotBefore       |  2019-xx-xxTxx:xx:xx.xxxZ                   |||
||+------------------+------------------------------------------------+||
|||                           InstanceState                           |||
||+---------------------------+---------------------------------------+||
|||  Code                     |  xx                                  |||
|||  Name                     |  running                              |||
||+---------------------------+---------------------------------------+||
|||                          InstanceStatus                           |||
||+-----------------------------+-------------------------------------+||
|||  Status                     |  impaired                           |||
||+-----------------------------+-------------------------------------+||
||||                             Details                             ||||
|||+-----------------------+-----------------------------------------+|||
||||  ImpairedSince        |  2019-xx-xxTxx:xx:xx.xxxZ                 ||||
||||  Name                 |  reachability                           ||||
||||  Status               |  failed                                 ||||
|||+-----------------------+-----------------------------------------+|||
|||                           SystemStatus                            |||
||+-----------------------------+-------------------------------------+||
|||  Status                     |  impaired                           |||
||+-----------------------------+-------------------------------------+||
||||                             Details                             ||||
|||+-----------------------+-----------------------------------------+|||
||||  ImpairedSince        |  2019-xx-xxTxx:xx:xx.xxxZ               ||||
||||  Name                 |  reachability                           ||||
||||  Status               |  failed                                 ||||
|||+-----------------------+-----------------------------------------+|||

EBS ボリュームのステータス確認

EBS ボリュームでも障害が発生していましたので, EBS ボリュームのステータス確認を行うコマンドとしてdescribe-volumesがあります.--filters オプションで Availability Zone を絞れるので問題発生した Availability Zone を指定して状況を確認することが可能です.

docs.aws.amazon.com

コマンド例

$ aws ec2 describe-volumes --filters Name=availability-zone,Values=ap-northeast-1a --output table
---------------------------------------------------------
---------------------------------------------------------
|                    DescribeVolumes                    |
+-------------------------------------------------------+
||                       Volumes                       ||
|+---------------------+-------------------------------+|
||  AvailabilityZone   |  ap-northeast-1a              ||
||  CreateTime         |  2019-xx-xxTxx:xx:xx.xxxZ     ||
||  Encrypted          |  False                        ||
||  Iops               |  100                          ||
||  Size               |  8                            ||
||  SnapshotId         |  snap-xxxx       ||
||  State              |  in-use                       ||
||  VolumeId           |  vol-xxxx        ||
||  VolumeType         |  gp2                          ||
|+---------------------+-------------------------------+|
|||                    Attachments                    |||
||+----------------------+----------------------------+||
|||  AttachTime          |  2019-xx-xxTxx:xx:xx.xxxZ  |||
|||  DeleteOnTermination |  True                      |||
|||  Device              |  /dev/xvda                 |||
|||  InstanceId          |  i-xxxx       |||
|||  State               |  attached                  |||
|||  VolumeId            |  vol-xxxx     |||
||+----------------------+----------------------------+||

RDS インスタンスのステータス確認

RDS インスタンスの使用不可な状態やフェイルオーバーによる一時的な通信断があったため,RDS インスタンスへの接続確認も必要ですが,AWS CLI でステータス確認を行うコマンドとしてdescribe-db-instancesがあります.--queryオプションを使って Availability Zone やステータスを絞って確認可能です.

docs.aws.amazon.com

コマンド例

$ aws rds describe-db-instances --query 'DBInstances[?AvailabilityZone==`ap-northeast-1a`].{Name:DBInstanceIdentifier,Status:DBInstanceStatus}' --output table
---------------------------------------------------------
|                  DescribeDBInstances                  |
+------------------------------------------+------------+
|                   Name                   |  Status    |
+------------------------------------------+------------+
|  xxxx                         |  available |
|  xxxx                         |  available |
|  xxxx                      |  available |
|  xxxx                     |  available |
|  xxxx                     |  available |

まとめ

先日発生した AWS のネットワーク障害で障害点であった Availability Zone, EC2, EBS, RDS のステータスを確認するためのコマンドとコマンド例をまとめました.正解はないと思いますし,もっといい手法があれば教えてください! 今回の障害を機にどこが弱点か,改善するところがないかを再考し,より良いシステムの形に持っていけるようにしていきたいですね.