AWS Healthを活用し障害検知しよう

記事タイトルとURLをコピーする

AWS障害時にどこを見ればいいのでしょうか。また、どうやって障害に気づけばいいのでしょうか。 例えば「Direct Connectが壊れた」「EC2のAPIに異常が発生した」時は、気づきたいものです。

AWS Health イベントの通知

AWS障害発生すると AWS Health イベント が通知されます。この通知内容を見るには、次の4つのサービスを利用できますが、取得できるものが少し異なります。

サービス 確認可能なイベント
AWS Service Health Dashboard ・パブリックイベント
AWS Personal Health Dashboard ・パブリックイベント
・アカウント固有のイベント
Amazon EventBridge ・アカウント固有のイベント(そのリージョン のイベント)
AWS Health API ・パブリックイベント
・アカウント固有のイベント

AWS Healthイベントには、パブリックイベントアカウント固有のイベントという分類があります。この理解はとても重要で、これが曖昧だと、どんなイベントが通知され、どんなイベントが通知されないか、よくわからなくなります。

Getting started with the AWS Personal Health Dashboard - AWS Health

パブリックイベントとは

AWSアカウント固有ではないサービスイベントです。例えば、AWSリージョンでAmazon Elastic Compute Cloud(Amazon EC2)に問題が発生した場合、そのリージョンのサービスやリソースを使用していなくても、AWS Healthはそのイベントに関する情報を提供します。

アカウント固有のイベントとは

お客様のAWSアカウントまたはお客様の組織内のアカウントに固有のものです。例えば、あなたが使用しているリージョンのAmazon EC2インスタンスに問題がある場合、AWS Healthはそのイベントとアカウント内の影響を受けたリソースに関する情報を提供します。

Service Health Dashboard(SHD)

SHDは、パブリックイベントのみ確認できます。

https://status.aws.amazon.com/

平時はこのように各サービスが緑色です。

f:id:swx-watanabe:20210902225539p:plain

問題発生中はこのように赤色になり、問題の詳細が確認できます。

f:id:swx-watanabe:20210902231519p:plain

Personal Health Dashboard(PHD)

ダッシュボード

Personal Health Dashboard > ダッシュボード

問題発生中は、 未解決の問題 のところにイベントが表示されます。(下記画像は問題ない時のものです)

なお、PHDはグローバルサービスなので、全リージョンの問題を確認できます。

f:id:swx-watanabe:20210902231028p:plain

イベントログ

Personal Health Dashboard > イベントログ

過去のイベントは、イベントログで確認できます。

影響を受けるリソース に記載があるのは、 アカウント固有のイベント で、その他は パブリックイベント になります。

f:id:swx-watanabe:20210902233139p:plain

イベントのカテゴリ をみると、 問題 の他に、 その他の通知 というのがあります。
サービスの仕様変更などのお知らせで影響を受けるリソースがあると、こういったイベントも発生します。

リージョン も表示されています。-(ハイフン)になっているのは、 global を意味します。 CloudTrailやIAM等はグローバルサービスなので、このようになっています。

イベントをクリックすると詳細情報を確認できます。パブリックイベントの場合は、SHDで見られるのと同じ内容です。

f:id:swx-watanabe:20210902234210p:plain

EventBridge

発生した問題をSHD・PHDで確認できるのはわかりましたが、イベント発生時に気づけるように通知も必要と思います。 EventBridgeで アカウント固有のイベント の通知をさせましょう。(パブリックイベントの通知はできません。)

通知構成の例

東京リージョン利用の場合

f:id:swx-watanabe:20210903000838p:plain

基本的には東京リージョンのみで通知設定をすればいいのですが、グローバルサービスからのイベントはバージニアリージョン で受けるため、us-east-1の通知設定もします。

本記事ではEventBridge、SNS、Chatbotの具体的な設定手順は省略しますが、以下記事を参考にしていただければと思います。

blog.serverworks.co.jp

また、Slackではなく、「EventBridge->SNS->メール」の構成でもいいと思います。

EventBridgeのルール設定は、シンプルに以下で問題ありません。ただ、使っているサービスが多い場合、通知が大量になる可能性もあります。その場合は後から調整していきましょう。

{
  "detail-type": ["AWS Health Event"],
  "source": ["aws.health"]
}

Slackで受信した時の例です。

f:id:swx-watanabe:20210903002655p:plain

f:id:swx-watanabe:20210903002707p:plain

AWS Health API

ほとんどの方はEventBridgeからの通知で問題ないと思いますが、APIも利用可能なので紹介しておきます。 APIの利点として、アカウント固有のイベントパブリックイベント の両方の取得が可能です。

利用するには、AWSアカウントがビジネスサポートプランまたはエンタープライズサポートプランの必要があります。 また、エンドポイントは、us-east-1である必要があります。

AWS Health API へのアクセス - AWS Health

今回はAWS CLIを使ってみました。

イベント一覧

$ aws --region us-east-1 health describe-events
{
    "events": [
        {
            "arn": "arn:aws:health:ap-northeast-1::event/DIRECTCONNECT/AWS_DIRECTCONNECT_OPERATIONAL_ISSUE/AWS_DIRECTCONNECT_OPERATIONAL_ISSUE_LUKGX_1630543140",
            "service": "DIRECTCONNECT",
            "eventTypeCode": "AWS_DIRECTCONNECT_OPERATIONAL_ISSUE",
            "eventTypeCategory": "issue",
            "region": "ap-northeast-1",
            "startTime": "2021-09-02T09:39:00.061000+09:00",
            "lastUpdatedTime": "2021-09-02T11:33:54.990000+09:00",
            "statusCode": "open",
            "eventScopeCode": "PUBLIC"
        },
        {
            "arn": "arn:aws:health:eu-west-1::event/ELASTICLOADBALANCING/AWS_ELASTICLOADBALANCING_OPERATIONAL_ISSUE/AWS_ELASTICLOADBALANCING_OPERATIONAL_ISSUE_NMXUL_1630445941",
            "service": "ELASTICLOADBALANCING",
            "eventTypeCode": "AWS_ELASTICLOADBALANCING_OPERATIONAL_ISSUE",
            "eventTypeCategory": "issue",
            "region": "eu-west-1",
            "startTime": "2021-09-01T06:39:01.939000+09:00",
            "endTime": "2021-09-01T08:04:21.991000+09:00",
            "lastUpdatedTime": "2021-09-01T08:04:22.218000+09:00",
            "statusCode": "closed",
            "eventScopeCode": "PUBLIC"
        },
        {
            "arn": "arn:aws:health:us-west-2::event/INTERNETCONNECTIVITY/AWS_INTERNETCONNECTIVITY_OPERATIONAL_ISSUE/AWS_INTERNETCONNECTIVITY_OPERATIONAL_ISSUE_LYEBS_1630434320",
            "service": "INTERNETCONNECTIVITY",
            "eventTypeCode": "AWS_INTERNETCONNECTIVITY_OPERATIONAL_ISSUE",
            "eventTypeCategory": "issue",
            "region": "us-west-2",
            "startTime": "2021-09-01T03:25:20.326000+09:00",
            "endTime": "2021-09-01T08:02:44.704000+09:00",
            "lastUpdatedTime": "2021-09-01T08:02:44.755000+09:00",
            "statusCode": "closed",
            "eventScopeCode": "PUBLIC"
        },
        {
            "arn": "arn:aws:health:ap-northeast-1::event/ATHENA/AWS_ATHENA_OPERATIONAL_NOTIFICATION/AWS_ATHENA_OPERATIONAL_NOTIFICATION_2b5aa2460c27d621938fae0dda1fd6e37ad82caf0a6fa6cfb1c5fc517e05270f",
            "service": "ATHENA",
            "eventTypeCode": "AWS_ATHENA_OPERATIONAL_NOTIFICATION",
            "eventTypeCategory": "accountNotification",
            "region": "ap-northeast-1",
            "startTime": "2021-08-31T09:30:00+09:00",
            "lastUpdatedTime": "2021-08-31T13:03:50.280000+09:00",
            "statusCode": "open",
            "eventScopeCode": "ACCOUNT_SPECIFIC"
        },

以下省略

イベント詳細

上記で取得したイベントのarnを指定します。

$ aws --region us-east-1 health describe-event-details --event-arns "arn:aws:health:ap-northeast-1::event/DIRECTCONNECT/AWS_DIRECTCONNECT_OPERATIONAL_ISSUE/AWS_DIRECTCONNECT_OPERATIONAL_ISSUE_LUKGX_1630543140"
{
    "successfulSet": [
        {
            "event": {
                "arn": "arn:aws:health:ap-northeast-1::event/DIRECTCONNECT/AWS_DIRECTCONNECT_OPERATIONAL_ISSUE/AWS_DIRECTCONNECT_OPERATIONAL_ISSUE_LUKGX_1630543140",
                "service": "DIRECTCONNECT",
                "eventTypeCode": "AWS_DIRECTCONNECT_OPERATIONAL_ISSUE",
                "eventTypeCategory": "issue",
                "region": "ap-northeast-1",
                "startTime": "2021-09-02T09:39:00.061000+09:00",
                "lastUpdatedTime": "2021-09-02T11:33:54.990000+09:00",
                "statusCode": "open",
                "eventScopeCode": "PUBLIC"
            },
            "eventDescription": {
                "latestDescription": "ネットワーク接続性 | Network Connectivity\n\n[05:39 PM PDT] 日本時間 2021/09/02 07:30 から一部の AWS Direct Connect 接続と AP-NORTHEAST-1 リージョン間にネットワーク接続性の問題が発生していることを確認しております。この問題について調査を行っております。| Starting at 3:30 PM PDT, we began to experience network connectivity issues, impacting AWS Direct Connect connectivity between some AWS Direct Connections and the AP-NORTHEAST-1 Region. We are actively investigating the issue. \n\n[06:02 PM PDT] 一部の AWS Direct Connect 接続と AP-NORTHEAST-1 リージョン間にネットワーク接続性の問題について追加の情報をご案内いたします。日本時間 2021/09/02 07:30 からコアネットワークデバイスに複数の問題が発生していることを確認しております。現在、問題が発生したデバイスについて復旧を進めており、デバイスがオンラインの状態に戻ることで接続性の問題が解消することが期待されます。現状では復旧の目途に関する情報はございません。進展がございましたら、随時更新致します。| We wanted to provide some more information for the event affecting some Direct Connect network connectivity in the AP-NORTHEAST-1 Region. Starting at 3:30 PM PDT, we began to experience network connectivity issues due to some failures in core networking devices. We are currently working on restoring these devices and we expect some restoration of connectivity as these devices come back online. We currently do not have an ETA on full recovery and will update further as information comes to hand. \n\n[06:43 PM PDT] 現在引き続き故障したデバイスの復旧を試みており、完全な復旧の
目途に関する情報はございません。今回の問題によりサイト間 VPN の接続性への影響はなく、VPN へのフェイルオーバーのオプションがあるお客様に関しては、VPN にフェイルオーバーいただくことをお勧めいたしま
す。| We are still trying to recover the failed devices and do not have an ETA on full recovery. VPN connectivity is not impacted by this failure, and those customers that have that option available for failover are recommended to do so to achieve recovery.\n\n[07:33 PM PDT] 現在 AP-NORTHEAST-1 リージョン内の故障したデバイスの復旧に取り組んでおりますが、現時点において完全な復旧の目途に関する情報はございません。今回の問題によりサイト間 VPN の接続性への影響はなく、VPN へのフェイルオーバーのオプションがあるお客様に関しては、VPN にフェイルオーバーいただくことをお勧めいたします。| We are continuing to work on recovering a number of failed devices within the AP-NORTHEAST-1 Region, but do not have an ETA on full recovery. VPN connectivity is not impacted by this failure, and those customers that have that option available for failover to VPN are recommended to do so to achieve recovery."
            }
        }
    ],
    "failedSet": []
}

オープン+パブリックイベント

$ aws --region us-east-1 health describe-events --filter "eventStatusCodes=open" | jq ' .events[] | select(.eventScopeCode == "PUBLIC")'
{
  "arn": "arn:aws:health:ap-northeast-1::event/DIRECTCONNECT/AWS_DIRECTCONNECT_OPERATIONAL_ISSUE/AWS_DIRECTCONNECT_OPERATIONAL_ISSUE_LUKGX_1630543140",
  "service": "DIRECTCONNECT",
  "eventTypeCode": "AWS_DIRECTCONNECT_OPERATIONAL_ISSUE",
  "eventTypeCategory": "issue",
  "region": "ap-northeast-1",
  "startTime": "2021-09-02T09:39:00.061000+09:00",
  "lastUpdatedTime": "2021-09-02T12:20:38.328000+09:00",
  "statusCode": "open",
  "eventScopeCode": "PUBLIC"
}

オープン+アカウント固有のイベント

$ aws --region us-east-1 health describe-events --filter "eventStatusCodes=open" | jq ' .events[] | select(.eventScopeCode == "ACCOUNT_SPECIFIC")'
{
  "arn": "arn:aws:health:global::event/ATHENA/AWS_ATHENA_OPERATIONAL_NOTIFICATION/AWS_ATHENA_OPERATIONAL_NOTIFICATION_698a9b29c74d3ce4cdc61f25e56957cc9a832c7519fd5c7e987fe17b545811d4",
  "service": "ATHENA",
  "eventTypeCode": "AWS_ATHENA_OPERATIONAL_NOTIFICATION",
  "eventTypeCategory": "accountNotification",
  "region": "global",
  "startTime": "2021-08-31T09:20:00+09:00",
  "lastUpdatedTime": "2021-08-31T17:06:18.264000+09:00",
  "statusCode": "open",
  "eventScopeCode": "ACCOUNT_SPECIFIC"
}
{
  "arn": "arn:aws:health:ap-northeast-1::event/ATHENA/AWS_ATHENA_OPERATIONAL_NOTIFICATION/AWS_ATHENA_OPERATIONAL_NOTIFICATION_2b5aa2460c27d621938fae0dda1fd6e37ad82caf0a6fa6cfb1c5fc517e05270f",
  "service": "ATHENA",
  "eventTypeCode": "AWS_ATHENA_OPERATIONAL_NOTIFICATION",
  "eventTypeCategory": "accountNotification",
  "region": "ap-northeast-1",
  "startTime": "2021-08-31T09:30:00+09:00",
  "lastUpdatedTime": "2021-08-31T13:03:50.280000+09:00",
  "statusCode": "open",
  "eventScopeCode": "ACCOUNT_SPECIFIC"
}
以下省略

イベントタイプ一覧

AWS Healthイベントのイベントタイプを見ることができます。

イベントタイプコード

Health イベントに表示されるイベントタイプコードには、影響を受けるサービスとイベントのタイプが含まれます。たとえば、Health イベントを受信した場合、AWS_EC2_SYSTEM_MAINTENANCE_EVENTイベントタイプコードの場合、サービスによって影響を受ける可能性のあるメンテナンスイベントがスケジュールされていることを意味します。この情報を使用して、事前に計画を立てたり、アカウントに対して対策を講じたりします。 https://docs.aws.amazon.com/ja_jp/health/latest/ug/aws-health-concepts-and-terms.html#event-type-code

$ aws --region us-east-1 health describe-event-types
{
    "eventTypes": [
        {
            "service": "A2I",
            "code": "AWS_A2I_CUSTOMER_ENGAGEMENT",
            "category": "accountNotification"
        },
        {
            "service": "A2I",
            "code": "AWS_A2I_OPERATIONAL_ISSUE",
            "category": "issue"
        },
        {
            "service": "A2I",
            "code": "AWS_A2I_OPERATIONAL_NOTIFICATION",
            "category": "accountNotification"
        },
        {
            "service": "A4B",
            "code": "AWS_A4B_API_ISSUE",
            "category": "issue"
        },
以下省略

A2IとかA4Bといった、全然わからないサービス名が表示されました。

次は試しにEC2に関するものだけ抜き出して見てみます。

$ aws --region us-east-1 health describe-event-types | jq '.eventTypes[] | select(.service == "EC2")'
{
  "service": "EC2",
  "code": "AWS_EC2_API_CLOUDWATCH_USAGE_METRICS_ENABLED",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_API_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_BILLING_NOTIFICATION",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_CLASSIC_NETWORK_HEALTH_INTERNET_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_CLASSIC_NETWORK_HEALTH_INTER_AZ_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_CLASSIC_NETWORK_HEALTH_INTRA_AZ_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_CUSTOMER_ENGAGEMENT",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_DEDICATED_HOST_ACCESS_REVOKED_RETIREMENT_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_DEDICATED_HOST_NETWORK_MAINTENANCE_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_DEDICATED_HOST_POWER_MAINTENANCE_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_DEDICATED_HOST_RETIREMENT_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_DEDICATED_HOST_UNDER_RESERVATION_REPLACE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_DNS_RESOLUTION_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_HOST_RECOVERY_COMPLETION",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_HOST_RECOVERY_FAILURE",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_HOST_RECOVERY_INITIATION",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_HOST_RECOVERY_PARTIAL_SUCCESS",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_HOST_RECOVERY_SUCCESS",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_HOST_RECOVERY_UNSUPPORTED",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INCREASED_LAUNCH_FAILURES",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_AUTO_RECOVERY_FAILURE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_AUTO_RECOVERY_NO_ACTION",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_AUTO_RECOVERY_SUCCESS",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_NETWORK_MAINTENANCE_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_POWER_MAINTENANCE_FAILED",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_POWER_MAINTENANCE_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_REBOOT_FLEXIBLE_MAINTENANCE_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_REBOOT_MAINTENANCE_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_RETIREMENT_EXPEDITED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_RETIREMENT_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_STOP_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_INSTANCE_TERMINATION_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_NETWORK_CONNECTIVITY_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_ODCR_DELAYED",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_ODCR_DEPOSIT_CONFIRMATION",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_ODCR_PENDING_CAPACITY_RESERVATION",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_ODCR_SCHEDULED",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_OPERATIONAL_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_OPERATIONAL_NOTIFICATION",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_PERSISTENT_INSTANCE_POWER_MAINTENANCE_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_EXPEDITED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULED",
  "category": "scheduledChange"
}
{
  "service": "EC2",
  "code": "AWS_EC2_POWER_CONNECTIVITY_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_RI_API_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_RI_MARKETPLACE_BANK_ACCOUNT_UPDATE_REQUIRED",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_RUNINSTANCES_API_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_SECURITY_NOTIFICATION",
  "category": "accountNotification"
}
{
  "service": "EC2",
  "code": "AWS_EC2_SPOT_API_UNAVAILABILITY",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_VPC_API_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_VPC_NETWORK_HEALTH_INTERNET_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_VPC_NETWORK_HEALTH_INTER_AZ_ISSUE",
  "category": "issue"
}
{
  "service": "EC2",
  "code": "AWS_EC2_VPC_NETWORK_HEALTH_INTRA_AZ_ISSUE",
  "category": "issue"
}

EC2だけでも多いですね。 今回はこれ以上の深追いはやめておきます。

まとめ

f:id:swx-watanabe:20210903015503p:plain

  • AWS障害はSHDとPHDで確認
  • AWS Health イベントは2種類
    • アカウント固有のイベント
    • パブリックイベント
  • EventBridgeでアカウント固有のイベントを通知
  • EventBridgeで足りない場合はAPI利用を検討

渡辺 信秀(記事一覧)

2017年入社 / 地味な内容を丁寧に書きたい