任意の AWS アカウントで Trusted Advisor Organizational(TAO)Dashboard を作成してみた

注) 本記事での紹介内容を利用する際は、実施者にて影響等をご確認の上、ご利用ください。また 2023/08/30 時点の AWS Well-Architected Labs を参考としており、以降の仕様変更等による対応や動作保証はされません。あらかじめご了承ください。
2023.08.30

AWS では、利用状況に関するデータ(利用費・利用量や推奨とのギャップ、最適化の機会など)を確認するサービスや機能がいくつも提供されています。ただし、複数アカウントを管理する場合、アカウントやサービスごとに確認する必要があり、実施者の負荷が高くなってしまいます。また関連するチーム間で、独自のデータやサービスを利用しているとコミュニケーションのオーバーヘッドや齟齬が生じるリスクがあります。

これらの解決策の一つとして AWS では Cloud Intelligence Dashboards Framework というソリューションを提供しています。これにより、目的に応じた必要なデータを集約し、一元的な利用状況の可視化を実現します。

Trusted Advisor Organizational(TAO)Dashboard とは

Cloud Intelligence Dashboards Framework は、AWS サービス群で構成される複数の Dashboard からなる Framework です。このソリューションには、下記で紹介されているようなメリットがあります。(個人的には専門の商用サービスを導入するよりも比較的安価にスモールスタート出来る点がメリットと感じています)

The Cloud Intelligence Dashboards offer various advantages, including, but not restricted to:

・ Easy to Use: All the data insights are presented in clear and understandable language, arranged by services, and include high-level summaries.
・ Secure: The dashboards support Identity and Access Management (IAM), do not require any agents to be installed, keep all data within the organization, and use only native AWS services.
・ In Depth: The dashboards provide hundreds of pre-built visuals, offer resource-level granularity, are fully customizable, and provide machine learning-driven insights.
・ Cost Efficient: Since the dashboards are serverless, users only need to pay for what they use.

↓↓↓ 機械翻訳 ↓↓↓

クラウドインテリジェンス・ダッシュボードには、以下のような様々な利点がある:

・ 使いやすい:すべてのデータ洞察は、明確で理解しやすい言葉で表示され、サービスごとに配置され、ハイレベルの要約が含まれています。
・ セキュア:ダッシュボードはIAM(Identity and Access Management)をサポートし、エージェントのインストールを必要とせず、すべてのデータを組織内に保持し、AWSのネイティブサービスのみを使用します。
・ 深さ:ダッシュボードは、何百ものビジュアルを事前に作成し、リソースレベルの粒度を提供し、完全にカスタマイズ可能で、機械学習主導の洞察を提供します。
・ コスト効率:ダッシュボードはサーバーレスなので、ユーザーは使用した分だけ支払えばよい。

引用元: https://wellarchitectedlabs.com/cost/200_labs/200_cloud_intelligence/

Trusted Advisor Organizational(TAO)Dashboard はその中の1つで、その名の通り AWS Trusted Advisor に関するデータを可視化する Dashboard になります。


引用元: https://wellarchitectedlabs.com/cost/200_labs/200_cloud_intelligence/

実現したいこと

『Organization 配下にある特定の AWS アカウント(管理アカウントへのアクセスは NG、関連しないメンバーアカウントのデータ収集も NG) または 非 Organization(スタンドアローン) の AWS アカウントから Trusted Advisor データを集約し可視化を行う』

このようなユースケースで TAO Dashboard を作成したいと考えていますが、 AWS Well-Architected Labs で紹介されている TAO Dashboard 作成方法は AWS Organizations 環境の全アカウントからデータ収集することを前提とした仕組みとなっているため、手順通りに実施すると要件を満たすことが出来ません。

There are 2 supported data collection methods:

1. Trusted Advisor API via deployment of Optimization Data Collection lab (recommended) - provides an automated way to collect Trusted Advisor checks for all accounts in your AWS Organizations via deployment of required AWS resources from provided AWS CloudFormation templates. Supports automated data refresh.
2. Trusted Advisor Organizational View - provides an easy way to collect Trusted Advisor checks for all accounts in your AWS Organizations without need to provision any additional resources. Only manual data refresh is supported.

↓↓↓ 機械翻訳 ↓↓↓

データ収集には2つの方法がある:

1. 最適化データ収集ラボのデプロイによる Trusted Advisor API(推奨) - 提供される AWS CloudFormation テンプレートから必要な AWS リソースをデプロイすることで、AWS 組織内のすべてのアカウントの Trusted Advisor チェックを収集する自動化された方法を提供します。自動データリフレッシュをサポートする。
2. Trusted Advisor Organizational View - 追加のリソースをプロビジョニングすることなく、AWS 組織内のすべてのアカウントの Trusted Advisor チェックを収集する簡単な方法を提供します。手動データリフレッシュのみがサポートされます。

引用元: https://wellarchitectedlabs.com/cost/200_labs/200_cloud_intelligence/trusted-advisor-dashboards/dashboards/2_create-upload-ta-report/

上記、データ収集方法2 は Organizational view for AWS Trusted Advisor という機能を利用しており、管理アカウントによる作業が必要なため、方法1 を修正することで実現します。


図:データ収集方法1
(引用元:https://wellarchitectedlabs.com/cost/300_labs/300_optimization_data_collection/

前提条件

可能な限り AWS Well-Architected Labs で提供されている TAO Dashboard 構築ガイドをベースに作成します。

アカウント構成

  • 集約アカウント(前述の図は Optimization Data Collection Account): 6XXX-XXXX-XXX3 / Aggregation Account
  • 対象アカウント(前述の図は Linked Account): 4XXX-XXXX-XXX9 / Target Account 01

構築手順 - データ収集編

参考手順

IAM Role 作成 - 対象アカウント&集約アカウント

参考手順では CloudFormation StackSets を利用しています。運用効率を考慮すると環境が整っている場合は StackSets が望ましいですが、そうではない場合は各アカウントで CloudFormation スタックを実行することで IAM Role を作成します。

対象アカウントへログイン -> バージニア北部 へリージョン変更 -> CloudFormation

スタックの作成 -> Amazon S3 URL へ参考手順に記載された YAML ファイルリンク を入力 -> 次へ

下記を入力します。

  • スタック名: OptimizationDataRoleStack
  • Cost Account Id: 集約アカウント ID

今回は Include AWS Trusted Advisor Data Collection Module のみ 「yes」 にして、他は 「no」 にします。

処理が終了すると IAM Policy と Role が作成されます。詳細は割愛しますが、入力した AWS アカウントを信頼関係に設定しているようです。

集約アカウントの Trusted Advisor データも収集する場合には、同様の内容を実行します。

データ収集リソース作成 - 集約アカウント

集約アカウントへログイン -> リンク からスタックを作成 -> バージニア北部 へリージョン変更

管理アカウントによる処理を回避するために Comma Delimited list of Account IDs for all Management Account IDs は空欄のままにしておきます。

こちらでも Include AWS Trusted Advisor Data Collection Module のみ 「yes」 にして、他は 「no」 にします。

複数サービス(Lambda, EventBridge, SQS, S3 など)で、リソースが作成されます。

AWS Lambda 修正 - 集約アカウント

デプロイされた Lambda では、管理アカウントへ所属する AWS アカウントリストやアカウントステータスチェックなどの情報取得が実行される仕組みとなっています(下図、赤枠内)。今回のユースケースでは、管理アカウントへのアクセスは制限されているため、Lambda 関数(Accounts-Collector-Function-OptimizationDataCollectionStack)を修正します。

環境変数作成

対象 AWS アカウントに関する情報を登録する変数を新しく用意します。(お察しの通り、対象アカウントに変更があった際は修正が必要となります、、)

環境変数 用途
ACCOUNT_IDS 対象AWSアカウントID(カンマ区切り)を記載
ACCOUNT_NAMES 対象AWSアカウント名(カンマ区切り)を記載

今回であれば、下記のように設定します。

コード修正

管理アカウントへ対象アカウント情報を取得する部分を削除し、環境変数から取得します。

必要最低限な内容となっているため、必要に応じて加筆・修正をお願いします。

import boto3
import logging
import os
import json

def sqs_message(account_data, QueueUrl):
    #posts message to que
    client = boto3.client('sqs')
    (account_id,account_name,payer_id) = account_data
    message = {
        "account_id": account_id,
        "account_name": account_name, 
        "payer_id": payer_id
        
    }
    response = client.send_message(
        QueueUrl=QueueUrl,
        MessageBody=json.dumps(message)
    )
    return response

def lambda_handler(event, context):
    role_name = os.environ['ROLE']
    account_ids = os.environ.get('ACCOUNT_IDS').split(",")
    account_names = os.environ.get('ACCOUNT_NAMES').split(",")
    payer_id = os.environ['MANAGEMENT_ACCOUNT_IDS']
    que = os.environ['SQS_URL']
    i = len(account_ids)
    
    for x in range(i):
        account_data = (account_ids[x], account_names[x], payer_id)
        sqs_message(account_data, que)

データ収集

EventBridge(Scheduler-For-Accounts)に指定した周期で実行されます。
(ここで3分クッキングでルールを無効→有効化で即時実行させます)



正常に処理が終了すると S3 に収集したデータが格納されます。

これで、データ収集が完了しました。あとは、EventBridge に設定したタイミングでデータ収集されていきます。

構築手順 - TAO Dashboard デプロイ編

参考手順

QuickSight サインアップ

上記、参考手順の通りに QuickSight へサインアップし、ユーザー名を控えておきます。

TAO Dashboard デプロイ(CloudFormation 利用)

集約アカウントへログイン -> リンク からスタックを作成 -> バージニア北部 へリージョン変更

  • I have enabled QuickSight Enterprise Edition AND I have a SPICE capacity in the current region.: yes
  • I understand that I need to manually give Permission to QuickSight to access CUR bucket and Query results bucket. Then manually refresh datasets after deploying this CFN.: yes
  • User name of QuickSight user: 先ほど控えた QuickSight ユーザー名

Path to Optimization Data Collection S3 bucket に、収集されたデータが保管されている S3 バケット名を入力します。

スタックが正常に終了すると、Dashboard URL が出力されます。

結果確認

先ほどの URL へアクセスすると TAO Dashboard が表示されます。

2つの AWS アカウントが集約されていることが確認出来ます!

試しに、両アカウントで検出された 「耐障害性 | Amazon S3 バケットバージョニング」 を確認します。

TAO Dashboard での表示

Aggregation Account Trusted Advisor 結果

Target Account 01 Trusted Advisor 結果

一致していますね! 実現したいユースケースでの TAO Dashboard を作成することが出来ました。

さいごに

今回、お客様から相談があった特定ユースケースでの TAO Dashboard 作成を検証・実施してみました。Cloud Intelligence Dashboards Framework には今回紹介した TAO 以外に Cost Intelligence Dashboard (CID), CUDOS Dashboard, KPI Dashboard, Compute Optimizer Dashboard (COD), Data Transfer Dashboard, Trends Dashboard があります。

直近のアップデートで CUDOS Dashboard に Public IPv4 情報が追加になるなど、随時アップデートがされているようです。

引用元: aws-samples/aws-cudos-framework-deployment

参考情報

Cloud Intelligence Dashboards Framework 関連

各 Dashboard 関連