Amazon Web Services ブログ

Amazon CloudWatch Metric Streams、AWS Cost and Usage Reports、Amazon Athena を使用した AWS でのコスト最適化

Amazon CloudWatch Metric Streams を使用して、設定した宛先に Amazon CloudWatch メトリクスのほぼリアルタイムなストリームを作成できます。Metric Streams は Amazon Kinesis Data Firehose を使用して、CloudWatch メトリクスを一般的なサードパーティーサービスプロバイダーの HTTP エンドポイントに送信することを容易にします。最新の情報を含んだ CloudWatch メトリクスから継続的でスケーラブルなストリームを作成することで、正確でタイムリーなメトリクスデータを必要とするダッシュボード、アラーム、その他ツールを強化することができます。

Metric Streams を使って、DatadogDynatraceNew RelicSplunkSumo Logic などのパートナーソリューションにメトリクスを送信することができます。また、Amazon Simple Storage Service (Amazon S3) のような、AWS 上に構築されたデータレイクにメトリクスを送信することもできます。監視データを継続的に取り込み、課金やパフォーマンスデータと最新の CloudWatch メトリクスデータを組み合わせて、リッチなデータセットを作成することができます。その後、Amazon Athena を使用して、コストの最適化、リソースのパフォーマンス、リソースの利用について洞察を得ることができます。Metric Streams はフルマネージドで拡張性があり、簡単に設定ができます。

この記事では、Metric Streams からのデータを S3 バケットに保存し、Amazon Athena を使って Amazon Elastic Compute Cloud (Amazon EC2) のメトリクスを分析する方法を紹介します。また、EC2 のメトリクスデータを AWS Cost and Usage Report と関連づける方法も紹介します。

図 1 は、この記事で紹介するソリューションのアーキテクチャを示しています。

Blog(yowat)

図 1 : ソリューションアーキテクチャ

ワークフローは、以下のステップで構成されています。

  • Amazon CloudWatch のメトリクスデータを、Kinesis Data Firehose のデータストリームに配信します。その後、データは S3 バケットに送信されます。
  • AWS Cost and Usage Reports は、AWS Billing レポートを S3 バケットに送信します。
  • AWS Glue クローラを使用して、両データセットのスキーマを検出します。
  • Amazon Athena を使用して、Metric Streams と AWS Cost and Usage Reports のデータに問い合わせをします。
  • (オプション) Amazon QuickSight を使用して、ダッシュボードを構築します。

前提条件

AWS アカウントの AWS Cost and Usage Report を作成してください。

Walkthrough

Create a metric stream (All metrics)

開始するには、Amazon CloudWatch コンソールの左側にあるナビゲーションペインで、 [Metrics] を展開し、[Streams] を選択した後に [Create metric stream] ボタンをクリックします。

また、CloudWatch API、AWS SDK、AWS CLI、または AWS CloudFormation を使用して、Metric Streams を作成することもできます。Metric Streams は、OpenTelemetry と JSON の出力形式をサポートしています。

Blog(yowat)

図 2 : CloudWatch コンソールの Metric Streams

デフォルトでは、Metric Streams は AWS アカウント内のすべてのメトリクスから、設定された宛先にデータを送信します。フィルタを使用して、送信されるメトリクスを制限することができます。この手順では、Create a metric stream ページはデフォルトの選択のままにします。

Blog(yowat)

図 3 : Metric Streams の作成

ストリームには一意の名前が生成されます。また、メトリクスを保存するためのユニークな名前の S3 バケット、S3 への書き込み用の AWS Identity and Access Management (IAM) ロール、S3 にメトリクスをストリームするための Kinesis Data Firehose データストリームが作成されます。

Blog(yowat)

図 4 : アカウントに追加されるリソース

[Create metric stream] をクリックします。

Blog(yowat)

図 5 : Metric streams タブ

Create a metric stream (Selected namespaces)

また、Amazon EC2 などのサービスに固有の CloudWatch メトリクスを対象として Metric Streams を作成することもできます。Create a metric stream ページの Metrics to be streamed で [Selected namespaces] を選択し、図 6 に示すように [EC2] を選択して [Create metric stream] をクリックします。

Blog(yowat)

図 6 : EC2 のメトリクスのみを対象とした Metric Streams の作成

これで、2 つの Metric Streams ができました。1 つはすべてのメトリクスのデータを持ち、もう 1 つは EC2 メトリクスのみのデータを持ちます。

Blog(yowat)

図 7 : コンソールに表示される Metric Streams

AWS Glue と Amazon Athena のセットアップ

AWS Glue は、分析、機械学習、アプリケーション開発のためのデータの検出、準備、結合を簡単に行える、サーバーレスのデータ統合サービスです。AWS Glue はデータ統合に必要なすべての機能を提供しており、数分でデータの分析と利用を開始できます。

Amazon Athena はインタラクティブなクエリサービスで、標準 SQL を使用して Amazon S3 内のデータを容易に分析できます。AWSコンソールでいくつかのアクションを行うだけで、Amazon S3 に保存されているデータに標準 SQL でアドホッククエリを実行し、数秒で結果を得ることができます。Athena は AWS Glue データカタログに登録されているデータセットおよびデータソースへのクエリを、ネイティブにサポートしています。

AWS Glue を使って、S3 にあるメトリクスデータソースに接続します。

  1. AWS Glue のコンソールで、[Crawlers] を選択し、[Add crawler] をクリックします。
  2. Crawler name には metric-stream-full と入力して [Next] をクリックします。
  3. Specify crawler source type では、デフォルトのオプションのまま [Next] をクリックします。
  4. Add a data storeChoose a data store で [S3] を選択します。Include path で、すべてのメトリクスのデータを持つバケットのパスを選択して [Next] をクリックします。
  5. Add another data store で [No] を選択し、 [Next] をクリックします。
  6. AWS Glue で使用する IAM ロールを任意の名前で作成し、[Next] をクリックします。作成した IAM ロールが、AWSGlueServiceRole のマネージドポリシーと S3 バケットへのアクセス権を持っていることを確認します。
  7. Create a schedule for this crawlerFrequency では、1 時間ごと (Hourly) の頻度でスケジュールを設定して [Next] をクリックします。
  8. Configure the crawler’s outputDatabase で [default] を選択して [Next] をクリックします。
  9. [Finish] をクリックするとクローラが作成されるので、作成されたクローラを選択して [Run crawler] をクリックします。

[Status] が [Ready] に遷移したら、左ペインの [Tables] から検出されたテーブルスキーマを見ることができます。すべての名前空間からのメトリクスを持つ S3 バケットの Location をメモしておきます。

図 8 : AWS Glue データカタログのテーブルの詳細

ここで、AWS Glue データカタログに EC2 メトリクス用のテーブルを作成するためにステップ 1~9 を繰り返します。ステップ 2 の [Crawler name] は任意の名前で作成し、ステップ 4 では EC2 メトリクス用の S3 バケットが選択されていることを確認します。

Blog(yowat)

図 9 : AWS Glue データカタログのテーブルの詳細

両方の AWS Glue データカタログテーブルでは、timestamp カラムはデフォルトで bigintとして判別されます。この記事の後半では、Athena のクエリを書きます。その作業を簡単にするために、データタイプを手動でtimestampに変更することができます。各 AWS Glue データカタログテーブルをクリックし、[Edit schema] をクリックします。timestamp カラムの Data type (bigint) をクリックして Column type をtimestampに変更します。変更後に [Save] をクリックします。

Blog(yowat)

図 10 : テーブルの定義とスキーマの詳細

作成した各クローラをクリックし、[Edit] をクリックします。Configure the crawler’s output まで進み、図 11 に示すように、Configuration options (optional) で [Ignore the change and don’t update the table in the data catalog] を選択し、[Update all new and existing partitions with metadata from the table] にチェックを入れます。[Next] と [Finish] をクリックして、設定変更を完了します。

Blog(yowat)

図 11 : クローラの出力設定

設定変更後に各クローラを再度実行 (Run crawler) し、すべてのパーティションを新しいスキーマで更新します。これで、Amazon Athena でメトリクスストリームデータの分析を開始する準備が整いました。

Athenaでのクエリ実行

Athena コンソールを開き、Query editor からメトリクスストリームデータへの問い合わせを行います。以降、テーブル名やインスタンス ID などは適宜置き換えて実行してください。

SELECT * FROM "default"."metricstreams_quickfull_l3bbbk_9mx9etry" limit 10;

Blog(yowat)

図 12 : Amazon Athena を使ったメトリクスストリームテーブルのデータプレビュー

クエリ 1 : 指定したインスタンス ID の平均および最大 CPU 使用率を検索

SELECT timestamp as datetime,
         value.sum/value.count AS average, value.max
FROM "default"."metricstreams_quickfull_l3bbbk_9mx9etry"
WHERE namespace='AWS/EC2'
        AND metric_name='CPUUtilization'
        AND dimensions.instanceid='i-02b5fc950b4231902'
ORDER BY  datetime DESC limit 1000

図 13 : Athena を使用した、 EC2 インスタンスの平均および最大 CPU 使用率の検索

クエリ 2 : 5 分間隔で集計したデータから平均 CPU 使用率を検索

SELECT min(timestamp) as timestamp,
         avg(value.sum/value.count) AS average
FROM "default"."metricstreams_quickfull_l3bbbk_9mx9etry"
WHERE namespace='AWS/EC2'
        AND metric_name='CPUUtilization'
        AND dimensions.instanceid='i-02b5fc950b4231902'
        GROUP BY floor(to_unixtime(timestamp)/60/5)
        order by timestamp desc limit 1000

Blog(yowat)

図 14 : 5 分間に集計された EC2 インスタンスの平均 CPU 使用率の検索

クエリ 3 : AWSリージョン内のすべてのEC2インスタンスの平均CPU使用率を求める。EC2のみのメトリクスを持つAthenaテーブルに対して、このクエリを実行します。

SELECT min(timestamp) as timestamp,
avg(value.sum/value.count) AS average
FROM "default"."metricstreams_quickpartial_354bg3_qo9wgvlr"
WHERE namespace='AWS/EC2'
AND metric_name='CPUUtilization'
AND dimensions.instanceid is Null
AND dimensions.imageid is Null
AND dimensions.autoscalinggroupname is Null
AND dimensions.instancetype is Null
GROUP BY floor(to_unixtime(timestamp)/60/5)
ORDER BY timestamp DESC

Blog(yowat)

図 15 : リージョン内のすべての EC2 インスタンスの平均 CPU 使用率

AWS Cost and Usage Reports との相関性

AWS Cost and Usage Report には、ユーザーのコストおよび使用状況に関する最も包括的な情報が含まれています。Athena を使用して 、AWS のコストと使用状況に関する情報について迅速かつ簡単に有効化して問い合わせを行う方法については「Amazon Athena を使用して AWS Cost and Usage Report をクエリする」のブログ記事と、「AWS コストと使用状況レポート」のユーザーガイドから「Amazon Athena を使用したコストと使用状況レポートへのクエリ」を参照してください。

クエリ 4 : us-east-2 リージョンで稼働している EC2 インスタンスの、時間単位での支払額を検索

SELECT line_item_product_code,
         line_item_usage_type,
         line_item_operation,
         line_item_blended_cost,
         product_region,
         line_item_currency_code,
         year,
         lpad(month,
        2,
        '0') AS month, lpad(cast(day_of_month(line_item_usage_start_date) as varchar),2,'0') AS day, lpad(cast(hour(line_item_usage_start_date) as varchar),2,'0') AS hour
FROM "athenacurcfn_cur_report_test"."cur_report_test" where line_item_product_code='AmazonEC2' and product_region='us-east-2' and line_item_usage_type like '%BoxUsage%' order by year desc, month desc, day desc, hour desc;

このクエリを Athena で実行すると、us-east-2 で複数の t3.small インスタンスが実行されていることがわかります。line_item_blended_cost (0.0208 USD/hour) に注目してください。
Blog(yowat)

図 16 : Athena を使用して EC2 の時間当たりの料金を分析

リージョンで稼働しているすべての EC2 インスタンスのコストを横断して集約し、EC2 インスタンスの平均 CPU 使用率と比較する事ができます。

クエリ 5 : すべての EC2 インスタンスのコストデータを集計し、平均 CPU 使用率と比較する

SELECT a.year,
         a.month,
         a.day,
         a.hour,
         a.cost,
         b.metric_name,
         b.unit,
         b.average_cpu_utilization
FROM 
    (SELECT year,
         month,
         day,
         hour,
         sum(line_item_blended_cost) AS cost
    FROM 
        (SELECT line_item_blended_cost,
         year,
         lpad(month,
         2,
         '0') AS month, lpad(cast(day_of_month(line_item_usage_start_date) AS varchar),2,'0') AS day, lpad(cast(hour(line_item_usage_start_date) AS varchar),2,'0') AS hour
        FROM "athenacurcfn_cur_report_test"."cur_report_test"
        WHERE line_item_product_code='AmazonEC2'
                AND product_region='us-east-2'
                AND line_item_usage_type LIKE '%BoxUsage%')
        GROUP BY  year, month, day, hour) AS a
    LEFT JOIN 
    (SELECT metric_name,
         unit,
         partition_0 AS year,
         partition_1 AS month,
         partition_2 AS day,
         partition_3 AS hour,
         avg(value.sum/value.count) AS average_cpu_utilization
    FROM "default"."metricstreams_quickpartial_354bg3_qo9wgvlr"
    WHERE metric_name='CPUUtilization'
            AND dimensions.instanceid is Null
            AND dimensions.imageid is Null
            AND dimensions.autoscalinggroupname is Null
            AND dimensions.instancetype is Null
    GROUP BY  metric_name, unit, partition_0, partition_1, partition_2, partition_3) AS b
    ON a.year = b.year
        AND a.month = b.month
        AND a.day = b.day
        AND a.hour = b.hour
WHERE a.year = '2021'
        AND a.month = '03'
ORDER BY  day desc, hour desc;

クエリの結果から、EC2 インスタンスに毎時約 0.25 ドルを費やしており、全インスタンスの平均 CPU 使用率は約 2 %であることがわかります。

Blog(yowat)

図 17 : Athena を使用した EC2 リソースの使用率とコストの比較

EC2 インスタンス全体の CPU 使用率は 2 %とかなり低いため、一部のインスタンスサイズは最適化できるかもしれません。

クエリ 6 : このリージョンで稼働している各インスタンスの平均および最大 CPU 使用率を検索

SELECT metric_name,
dimensions.instanceid instanceid,
value.max max,
value.sum/value.count AS average_cpu,
timestamp AS datetime
FROM "default"."metricstreams_quickpartial_354bg3_qo9wgvlr"
WHERE metric_name='CPUUtilization'
AND dimensions.instanceid is NOT Null
ORDER BY datetime desc

Blog(yowat)

図 18 : リージョン内の全インスタンスの平均および最大 CPU 使用率

このクエリ結果を見ると、どの EC2 インスタンスをダウンサイジングする必要があるか見つけ出すことができます。この例では、EC2 インスタンスによっては性能を使い切れていないので、代わりにサイズの小さいインスタンスを使用することができます。また、ORDER BY 句で datetime の代わりに CPU 使用率 (max または average_cpu) を使うこともできます。

インスタンスサイズの最適化を行ったら、クエリ 5 を実行して時間当たりのコストが減少傾向にあるか確かめます。図 19 では、cost 列で全体の支出が減少していることを示しています。

Blog(yowat)

図 19 : Athena を使用した EC2 リソースの使用率とコストの比較

Cleanup

アカウントへの継続的な課金を避けるために、作成したリソースを削除してください。

  • Metric Streams 、関連する Kinesis Data Firehose のデータストリーム、IAM ロールを削除します。
  • AWS Glue データカタログの AWS Glue クローラとテーブルを削除します。
  • メトリクスデータが保存されている S3 バケットを削除します。

結論

この記事では、Metric Streams を使って CloudWatch のメトリクスを S3 にエクスポートする方法を紹介しました。EC2 の CPU 使用率などのメトリクスを見るために Athena を使いました。Athena を使って、AWS Cost and Usage Report と Metric Streams からのデータを組み合わせて過去の傾向を調べ、インスタンスサイズを見直してコスト最適化を行う方法を学びました。Amazon QuickSight で可視化したい場合は、Athena で書いたクエリからダッシュボードを作成することもできます。

Metric Streams は、Amazon RDSAmazon Elastic Block Store、S3、AWS Lambda など、他の AWS サービスのレポートにも役立ちます。

著者について

Blog(yowat)

Amit Kalawat

Amit Kalawat は、Amazon Web Services のシニアソリューションアーキテクトで、ニューヨークに拠点を置いています。彼は、企業のお客様がビジネスを変革し、クラウドに移行する際の支援を行っています。

翻訳はソリューションアーキテクトの渡邊が担当しました。原文はこちら