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 を使って、Datadog、Dynatrace、New Relic、Splunk、Sumo 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 は、この記事で紹介するソリューションのアーキテクチャを示しています。
図 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 の出力形式をサポートしています。
図 2 : CloudWatch コンソールの Metric Streams
デフォルトでは、Metric Streams は AWS アカウント内のすべてのメトリクスから、設定された宛先にデータを送信します。フィルタを使用して、送信されるメトリクスを制限することができます。この手順では、Create a metric stream ページはデフォルトの選択のままにします。
図 3 : Metric Streams の作成
ストリームには一意の名前が生成されます。また、メトリクスを保存するためのユニークな名前の S3 バケット、S3 への書き込み用の AWS Identity and Access Management (IAM) ロール、S3 にメトリクスをストリームするための Kinesis Data Firehose データストリームが作成されます。
図 4 : アカウントに追加されるリソース
[Create metric stream] をクリックします。
図 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] をクリックします。
図 6 : EC2 のメトリクスのみを対象とした Metric Streams の作成
これで、2 つの Metric Streams ができました。1 つはすべてのメトリクスのデータを持ち、もう 1 つは EC2 メトリクスのみのデータを持ちます。
図 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 にあるメトリクスデータソースに接続します。
- AWS Glue のコンソールで、[Crawlers] を選択し、[Add crawler] をクリックします。
- Crawler name には
metric-stream-full
と入力して [Next] をクリックします。 - Specify crawler source type では、デフォルトのオプションのまま [Next] をクリックします。
- Add a data store の Choose a data store で [S3] を選択します。Include path で、すべてのメトリクスのデータを持つバケットのパスを選択して [Next] をクリックします。
- Add another data store で [No] を選択し、 [Next] をクリックします。
- AWS Glue で使用する IAM ロールを任意の名前で作成し、[Next] をクリックします。作成した IAM ロールが、AWSGlueServiceRole のマネージドポリシーと S3 バケットへのアクセス権を持っていることを確認します。
- Create a schedule for this crawler の Frequency では、1 時間ごと (Hourly) の頻度でスケジュールを設定して [Next] をクリックします。
- Configure the crawler’s output の Database で [default] を選択して [Next] をクリックします。
- [Finish] をクリックするとクローラが作成されるので、作成されたクローラを選択して [Run crawler] をクリックします。
[Status] が [Ready] に遷移したら、左ペインの [Tables] から検出されたテーブルスキーマを見ることができます。すべての名前空間からのメトリクスを持つ S3 バケットの Location をメモしておきます。
図 8 : AWS Glue データカタログのテーブルの詳細
ここで、AWS Glue データカタログに EC2 メトリクス用のテーブルを作成するためにステップ 1~9 を繰り返します。ステップ 2 の [Crawler name] は任意の名前で作成し、ステップ 4 では EC2 メトリクス用の S3 バケットが選択されていることを確認します。
図 9 : AWS Glue データカタログのテーブルの詳細
両方の AWS Glue データカタログテーブルでは、timestamp カラムはデフォルトで bigint
として判別されます。この記事の後半では、Athena のクエリを書きます。その作業を簡単にするために、データタイプを手動でtimestamp
に変更することができます。各 AWS Glue データカタログテーブルをクリックし、[Edit schema] をクリックします。timestamp カラムの Data type (bigint) をクリックして Column type をtimestamp
に変更します。変更後に [Save] をクリックします。
図 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] をクリックして、設定変更を完了します。
図 11 : クローラの出力設定
設定変更後に各クローラを再度実行 (Run crawler) し、すべてのパーティションを新しいスキーマで更新します。これで、Amazon Athena でメトリクスストリームデータの分析を開始する準備が整いました。
Athenaでのクエリ実行
Athena コンソールを開き、Query editor からメトリクスストリームデータへの問い合わせを行います。以降、テーブル名やインスタンス ID などは適宜置き換えて実行してください。
図 12 : Amazon Athena を使ったメトリクスストリームテーブルのデータプレビュー
クエリ 1 : 指定したインスタンス ID の平均および最大 CPU 使用率を検索
図 13 : Athena を使用した、 EC2 インスタンスの平均および最大 CPU 使用率の検索
クエリ 2 : 5 分間隔で集計したデータから平均 CPU 使用率を検索
図 14 : 5 分間に集計された EC2 インスタンスの平均 CPU 使用率の検索
クエリ 3 : AWSリージョン内のすべてのEC2インスタンスの平均CPU使用率を求める。EC2のみのメトリクスを持つAthenaテーブルに対して、このクエリを実行します。
図 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 インスタンスの、時間単位での支払額を検索
このクエリを Athena で実行すると、us-east-2 で複数の t3.small インスタンスが実行されていることがわかります。line_item_blended_cost (0.0208 USD/hour) に注目してください。
図 16 : Athena を使用して EC2 の時間当たりの料金を分析
リージョンで稼働しているすべての EC2 インスタンスのコストを横断して集約し、EC2 インスタンスの平均 CPU 使用率と比較する事ができます。
クエリ 5 : すべての EC2 インスタンスのコストデータを集計し、平均 CPU 使用率と比較する
クエリの結果から、EC2 インスタンスに毎時約 0.25 ドルを費やしており、全インスタンスの平均 CPU 使用率は約 2 %であることがわかります。
図 17 : Athena を使用した EC2 リソースの使用率とコストの比較
EC2 インスタンス全体の CPU 使用率は 2 %とかなり低いため、一部のインスタンスサイズは最適化できるかもしれません。
クエリ 6 : このリージョンで稼働している各インスタンスの平均および最大 CPU 使用率を検索
図 18 : リージョン内の全インスタンスの平均および最大 CPU 使用率
このクエリ結果を見ると、どの EC2 インスタンスをダウンサイジングする必要があるか見つけ出すことができます。この例では、EC2 インスタンスによっては性能を使い切れていないので、代わりにサイズの小さいインスタンスを使用することができます。また、ORDER BY 句で datetime の代わりに CPU 使用率 (max または average_cpu) を使うこともできます。
インスタンスサイズの最適化を行ったら、クエリ 5 を実行して時間当たりのコストが減少傾向にあるか確かめます。図 19 では、cost 列で全体の支出が減少していることを示しています。
図 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 RDS、Amazon Elastic Block Store、S3、AWS Lambda など、他の AWS サービスのレポートにも役立ちます。
著者について
翻訳はソリューションアーキテクトの渡邊が担当しました。原文はこちら。