AWS Health Dashbord イベントの「影響を受けるリソース」一覧を AWS CLI で取得したい

AWS ヘルスダッシュボードで確認できる特定のイベントの「影響を受けるリソース」を AWS CLI で一覧出力する方法を確認しました。恐らく誰も触ったことでないであろう、aws health describe-affected-entities コマンドを叩いてください。

コンバンハ、千葉(幸)です。

AWS Health Dashbord ではさまざまなイベントが確認できます。例えば「特定の EC2 インスタンスで再起動を伴うメンテナンスが予定されている」といったイベントです。

イベントの詳細画面から「影響を受けるリソース」を確認できます。以下の画像のイメージです。

AWS_Health_Dashboard_-_affected_resource

上記の例では「影響を受けるリソース」はひとつだけ記録されていますが、イベントによっては複数のリソースが羅列されます。

皆さんは、特定のイベントについて「影響を受けるリソース」を AWS CLI で一括で取得したいと思ったことはありませんか?わたしはありません。でした。

コンソールで確認するなり、イベント通知の仕組みと組み合わせるなりで「影響を受けるリソース」を確認する機会はあっても、わざわざ AWS CLI で取得したいケースはそうそう思いつきません。たまたま試みる機会があったので、その足跡を残しておきます。

3 行まとめ

  • 「影響を受けるリソース」を AWS CLI で取得する際にはaws health describe-affected-entitiesを使用する
  • 特定のイベントの「影響を受けるリソース」を取得したい場合にはイベント ARN でフィルタする必要あり
  • イベント ARN をコンソール上からは確認できないので事前にaws health describe-eventsで確認しよう

なお、aws healthコマンドを実行する際には、AWS サポートの以下のいずれかのプランに加入している必要があります。

  • Business
  • Enterprise On-Ramp
  • Enterprise

「影響を受けるリソース」を AWS CLI で取得したいモチベーション

冒頭の繰り返しになりますが、わざわざ AWS CLI で取得したいケースは少ないと思います。

今回わたしは「コンソールでの表示が途中で途切れている」というレアケースに遭遇したので、「AWS CLI で取得しても同じか確認したい」という背景で実行しました。

具体的にはSecurity tls deprecation notificationというイベントで、それは Amazon S3 オブジェクトへの TLS 1.0、TLS 1.1での接続があったものを通知してくれるものでした。

「影響を受けるリソース」部分がちょっと特殊で、以下の構文で接続の詳細を表示してくれます。

リージョン | バケット名 | API アクション | TLS バージョン | 接続数 | ユーザーエージェント

ここで、コンソールから確認した際に、いくつかの「影響を受けるリソース」が上記の構文を満たさず途中で途切れていることがありました。

AWS_Health_Dashboard_string

具体的には、以下のようにバケット名の羅列が続きそれ以降のセクションが表示されていない状態です。

リージョン | バケット名A、バケット名B、バケット名C……

これがコンソール特有の事象なのかどうかを確認したく、AWS CLI で取得を試みたというわけでした。

結論から言うと AWS CLI で取得しても同じだった

結論を言うと、AWS CLI で取得しても同じ途切れ方をしていました。なので、この件については AWS サポートに問い合わせることで対応しました。

余談:「影響を受けるリソース」の文字数の上限

先述の画像では「長すぎて文字列が途切れている」という表現をしましたが、改めて調査するとそれは正確ではありませんでした。

上限は「1224文字」で、今回のケースではそれより短い文字数で途切れていたためです。

entityValue
The ID of the affected entity.
Type: String
Length Constraints: Maximum length of 1224.

なので、正確には「何らかの原因で文字列が途中で途切れている」でした。

AWS CLI で「影響を受けるリソース」を取得してみよう

気を取り直して、単純に「AWS CLI で"影響を受けるリソース"を取得する時の手順」にフォーカスをあててやっていきます。

  • イベント ARN を確認する
  • 特定のイベントの「影響を受けるリソース」を取得する

イベント一覧からお目当てのイベント ARN を確認する

後続のコマンドでフィルターをかける際にイベント ARN を指定するため、先行してその ARN を確認します。コンソールからは確認できないため、AWS CLI で取得します。

aws health describe-eventsコマンドを使用します。

リファレンスから引用した実行例は以下です。ここでのarnが欲しいイベント ARN です。

{
    "events": [
        {
            "arn": "arn:aws:health:us-west-1::event/ECS/AWS_ECS_OPERATIONAL_ISSUE/AWS_ECS_OPERATIONAL_ISSUE_KWQPY_EXAMPLE111",
            "service": "ECS",
            "eventTypeCode": "AWS_ECS_OPERATIONAL_ISSUE",
            "eventTypeCategory": "issue",
            "region": "us-west-1",
            "startTime": 1589077890.53,
            "endTime": 1589086345.597,
            "lastUpdatedTime": 1589086345.905,
            "statusCode": "closed",
            "eventScopeCode": "PUBLIC"
        },
        {
            "arn": "arn:aws:health:global::event/BILLING/AWS_BILLING_NOTIFICATION/AWS_BILLING_NOTIFICATION_6ce1d874-e995-40e2-99cd-EXAMPLE1118b",
            "service": "BILLING",
            "eventTypeCode": "AWS_BILLING_NOTIFICATION",
            "eventTypeCategory": "accountNotification",
            "region": "global",
            "startTime": 1588356000.0,
            "lastUpdatedTime": 1588356524.358,
            "statusCode": "open",
            "eventScopeCode": "ACCOUNT_SPECIFIC"
        },
        {
            "arn": "arn:aws:health:us-west-2::event/CLOUDFORMATION/AWS_CLOUDFORMATION_OPERATIONAL_ISSUE/AWS_CLOUDFORMATION_OPERATIONAL_ISSUE_OHTWY_EXAMPLE111",
            "service": "CLOUDFORMATION",
            "eventTypeCode": "AWS_CLOUDFORMATION_OPERATIONAL_ISSUE",
            "eventTypeCategory": "issue",
            "region": "us-west-2",
            "startTime": 1588279630.761,
            "endTime": 1588284650.0,
            "lastUpdatedTime": 1588284691.941,
            "statusCode": "closed",
            "eventScopeCode": "PUBLIC"
        },
以下略

フィルターなしで aws health describe-events を実行すると出力量が多くお目当てのものを見つけるのに苦労するかもしれません。適宜フィルタリングしましょう。

「直近 10 日間で発生したイベント」に限定する例。

$ aws health describe-events --filter "startTimes={from='$(date -u -v -10d +%FT%TZ)',to='$(date -u +%FT%TZ)'}"

「サービス」でフィルタリングする例。

$ aws health describe-events --filter services=SECURITY

イベント名でフィルタリングできれば楽なのですが、以下のように違いがあるためちょっと工夫が必要です。

  • イベント名の例:Security tls deprecation notification
  • 当該イベントの eventTypeCode:AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION

余談:イベントの詳細を確認する

本筋から外れますが、特定のイベントの詳細はaws health describe-event-detailsで確認できます。

実行した際の例は以下です。先ほどのaws health describe-eventsコマンドと異なり、イベントの説明が取得できることが分かります。

$ aws health describe-event-details --event-arns arn:aws:health:ap-northeast-1::event/SECURITY/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION_fbcb49c36ddf859e2ab26exxxx以下略
{
    "successfulSet": [
        {
            "event": {
                "arn": "arn:aws:health:ap-northeast-1::event/SECURITY/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION_fbcb49c36ddf859e2ab26exxxx以下略",
                "service": "SECURITY",
                "eventTypeCode": "AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION",
                "eventTypeCategory": "accountNotification",
                "region": "ap-northeast-1",
                "startTime": "2023-04-06T16:45:00+09:00",
                "lastUpdatedTime": "2023-04-07T05:12:35.639000+09:00",
                "statusCode": "open",
                "eventScopeCode": "ACCOUNT_SPECIFIC"
            },
            "eventDescription": {
                "latestDescription": "English follows Japanese | 英語のメッセージは日本語の後にございます \n\nお客様のアカウントでホストされている Amazon Simple Storage Service (Amazon S3) オブジェクトへの TLS 1.0 または TLS 1.1 接続があるため、ご連絡を差し上
げています。AWS では、すべての AWS API エンドポイントの TLS 設定の最小バージョン を TLS 1.2 にする更新を進めているため [1]、これらの接続が S3 オブジェクトへのアクセスを維持できるように、できるだけ早く対策を講じていただく必要がございます。\n\nアクセスを維持するためにはどのようなアクションを取ることができますか?\n将来的な接続の中断を回避するには、TLS 1.0 または 1.1 を使用して Amazon S3 オブジェクトにアクセスするすべてのクライアントソフトウェアを TLS 1.2 以上を使用するように更新する必要があります。影響を受けるすべてのクライアントを更新できない、または更新したくない場合は、S3 オブジェクトへの直接のクライアントアクセスを Amazon CloudFront ディストリビューションなどのプロキシを使用したアクセスに置き換えることをお勧めします。これにより、クライアントは、許可した任意の TLS バー
ジョンを使用して Amazon CloudFront 経由で S3 オブジェクトにアクセスできるようになります。Amazon CloudFront は、TLS 1.2 以降を使用して S3 オブジェクトへのリクエストを転送します。S3 オブジェクトアクセスの前段に CloudFront ディストリビューションを設定する方法の詳細については、ナレッジセンターの記事 [2] をご覧ください。\n\n更新が必要なクライアントはどのように判断できますか?\nこのメッセージの最後に、影響を受ける、お客様のアカウントの S3 バケットを記載しております。影響を受けるオブジェクトおよび呼び出しを実行するユーザーエージェントに関する追加情報を収集するために、影響を受ける S3 バケットで Amazon CloudTrail データイベントを有効にすることをお勧めします [3] [4]。S3 データイベントに含まれる情報は、TLS 1.0 または TLS 1.1 を使用するクライアントソフトウェアを特定するのに役立つた
め、必要に応じてクライアントを更新できます。さらに、関連する AWS セキュリティブログ記事 [1] には、CloudTrail の tlsDetails フィールドに含まれる TLS 情報を使用する方法に関する内容を掲載しております。CloudTrail データイベントの有効化には関連料金が発生する点にご
注意ください。詳細については、CloudTrail 料金ページをご覧ください [5]。\n\nバケットへの接続を強制的にTLS 1.2以上にするにはどうすればよいですか?\nベストプラクティスとして、また TLS 1.2 以上へ強制する変更に備えて、すべての S3 バケットで TLS 1.2 以上への強制を積
極的に適用することをお勧めします。そのためには、ナレッジセンターの記事 [6] に記載されているように、s3:tlsVersion 条件キーを使用してバケットポリシーを適用します。\n\n詳細なガイダンスやサポートが必要な場合は、AWS サポート [7] またはテクニカルアカウントマネージャーまでお気軽にお問い合せください。\n\n[1] https://aws.amazon.com/jp/blogs/news/tls-1-2-required-for-aws-endpoints/\n[2] https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-access-old-tls/\n[3] https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/cloudtrail-logging-s3-info.html#cloudtrail-object-level-tracking\n[4] https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/enable-cloudtrail-logging-for-s3.html#enable-cloudtrail-events\n[5] https://aws.amazon.com/jp/cloudtrail/pricing/\n[6] https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-enforce-modern-tls/\n[7] https://aws.amazon.com/support\n\n2023 年 3 月 27 日から 2023 年 4 月 4 日の間にアカウントから検出された TLS 1.0 または TLS 1.1 接続の詳細については、「影響を受けるリソース」タブをご
覧ください(表示できる文字数の制限により、ユーザーエージェントは切り捨てられる場合があります)。\n\n接続の詳細は次の形式で記載されます。\nリージョン | バケット名 | API アクション | TLS バージョン | 接続数 | ユーザーエージェント\n\n\n---\n\nWe are reaching out because there are TLS 1.0 or TLS 1.1 connections to Amazon Simple Storage Service (Amazon S3) objects hosted in your account. As AWS is updating the TLS configuration for all AWS API endpoints to a minimum of version TLS 1.2 [1], you must take action as soon as possible for these connections to maintain their access to your S3 objects.\n\nWhat actions can I take to maintain access?\nTo avoid potential interruption, you must update all client software accessing your Amazon S3 objects using TLS 1.0 or 1.1, to use TLS 1.2 or higher. If you are unable or would prefer to not update all impacted clients, we recommend replacing direct client access to the S3 objects with use of a proxy, such as an Amazon CloudFront distribution. This will allow clients to access your S3 objects via Amazon CloudFront using any TLS version you choose to allow. Amazon CloudFront will forward the calls to your S3 objects using TLS 1.2 or higher. For more guidance for how to setup your CloudFront distribution to front your S3 object access, please review this Knowledge Center article [2].\n\nHow can I determine the client(s) I need to update?\nWe have provided the affected S3 bucket(s) in your account at the end of this message. In order to gather additional information about the affected objects and user agents performing these calls, we recommend enabling Amazon CloudTrail data events on the affected S3 bucket(s) [3][4]. The information contained in the S3 data events will help you pinpoint your client software that is responsible for using TLS 1.0 or TLS 1.1,
so you may update it accordingly. Additionally, our related AWS Security blog post [1] provides information on how you may use TLS information in the CloudTrail tlsDetails field. Please note there is an associated cost for enabling CloudTrail data events, plea
se see the CloudTrail pricing page for more detail [5].\n\nHow can I enforce connections to my bucket(s) be over TLS 1.2 and above?\nAs a best practice, and to prepare for our enforcement of TLS 1.2 or higher, we recommend you proactively enforce a minimum of
TLS 1.2 directly on all of your shared S3 bucket(s). You may do this by applying a bucket policy with the s3:TlsVersion condition key as per the documented this Knowledge Center article [6]\n\nIf you need further guidance or assistance, please contact AWS Supp
ort [7] or your Technical Account Manager.\n\n[1] https://aws.amazon.com/blogs/security/tls-1-2-required-for-aws-endpoints\n[2] https://aws.amazon.com/premiumsupport/knowledge-center/s3-access-old-tls/\n[3] https://docs.aws.amazon.com/AmazonS3/latest/userguide
/cloudtrail-logging-s3-info.html#cloudtrail-object-level-tracking\n[4] https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-cloudtrail-logging-for-s3.html#enable-cloudtrail-events\n[5] https://aws.amazon.com/cloudtrail/pricing/\n[6] https://aws.amazon.
com/premiumsupport/knowledge-center/s3-enforce-modern-tls/\n[7] https://aws.amazon.com/support\n\nPlease see the 'Affected resources' tab for further details on the TLS 1.0 or TLS 1.1 connections detected from your account between March 27, 2023 and April 04,
2023 (the UserAgent may be truncated due to a limit in the number of characters that can be displayed):\n\nConnections details will be in the following format:\nRegion | Bucket name(s) | APIAction | TLSVersion | NumCalls | UserAgent\n\n"
            }
        }
    ],
    "failedSet": []
}

影響を受けるリソースを取得する

お目当てのイベント ARN が確保できたら、それを指定してaws health describe-affected-entitiesを実行します。

実行例は以下です。

$ aws health describe-affected-entities\
  --filter eventArns=arn:aws:health:ap-northeast-1::event/SECURITY/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION_fbcb49c36ddf859e2ab26exxxx以下略
  
{
    "entities": [
        {
            "entityArn": "arn:aws:health:ap-northeast-1:000000000000:entity/g1xr2HDPUQtMLP54Y-uxMl9k_Ph-RPA25UKIRUAl6fl1Q=1g",
            "eventArn": "arn:aws:health:ap-northeast-1::event/SECURITY/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION_fbcb49c36ddf859e2ab26exxxx以下略",
            "entityValue": "ap-northeast-1|バケット名A | REST.COPY.OBJECT|TLSv1|32956|[s3fs/1.85 (commit hash befc2e9; OpenSSL)]",
            "awsAccountId": "000000000000",
            "lastUpdatedTime": "2023-04-07T03:39:17.201000+09:00"
        },
        {
            "entityArn": "arn:aws:health:ap-northeast-1:000000000000:entity/g124ryAWbp2wZnPaVV8DaDpiFNskiJCiRGpxg4dneSHEU=1g",
            "eventArn": "arn:aws:health:ap-northeast-1::event/SECURITY/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION_fbcb49c36ddf859e2ab26exxxx以下略",
            "entityValue": "ap-northeast-1|バケット名B | REST.PUT.OBJECT|TLSv1|30996|[s3fs/1.85 (commit hash befc2e9; OpenSSL)]",
            "awsAccountId": "000000000000",
            "lastUpdatedTime": "2023-04-07T03:39:17.200000+09:00"
        },
……

欲しいのはentityValueだけなので、以下のように出力すると見やすいです。

$ aws health describe-affected-entities\
  --filter eventArns=arn:aws:health:ap-northeast-1::event/SECURITY/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION/AWS_SECURITY_TLS_DEPRECATION_NOTIFICATION_fbcb49c36ddf859e2ab26exxxx以下略\
  --query "entities[*].[entityValue]" --output text

ap-northeast-1|バケット名A | REST.COPY.OBJECT|TLSv1|32956|[s3fs/1.85 (commit hash befc2e9; OpenSSL)]
ap-northeast-1|バケット名B | REST.PUT.OBJECT|TLSv1|30996|[s3fs/1.85 (commit hash befc2e9; OpenSSL)]
……

終わりに

AWS Health Dashbord イベントの「影響を受けるリソース」一覧を AWS CLI で取得してみました。

ケースが特殊なので、このブログが役に立つケースはあまり無いと思います。aws health describe-affected-entitiesを実行したことがある人は過去何人いるのでしょうか。

その分、普段あまり意識することがない部分をさらえて楽しかったです。イベントごとに ARN を持つんだな、というのが、考えれば当たり前ですが新鮮でした。また、「影響を受けるリソース」を取得したければ別の API を実行する必要がある、というのも気づきです。楽しかったのでオッケーです。

以上、 チバユキ (@batchicchi) がお送りしました。