2
3

CloudWatchメトリクスを長期的に保存する!with Amazon Data Firehose(旧Amazon Kinesis Data Firehose)

Posted at

CloudWatchメトリクスには保存期間が存在する

以下の記事がとてもわかりやすいです。

AWS CloudWatchのメトリクスデータの保持期間には制約があります。AWSの公式サイトに、以下のような保持期間が設定されていると記載があります。

60秒未満のデータポイント: 3時間
1分間隔のデータポイント: 15日間
5分間隔のデータポイント: 63日間
1時間間隔のデータポイント: 15か月間

このため、1分間隔のデータポイントは15日間のみ保存され、その後はデータがロールアップされてしまいます。これにより、保持期間を超えたデータポイントは失われてしまいます。

結構な落とし穴ですよね・・・。

今回は、記事で紹介されていた、Cloudwatchメトリクスを、Metric Streams → Data Firehose経由でs3に保存する方法を試してみようと思います!

cap1.PNG

参考:
メトリクスストリームは、AWS Data FirehoseやDatadogなどにメトリクス情報をストリームするサービスです。

AWS Data Firehoseは、S3やRedshiftなどにストリームデータを加工・投げ込んでくれるサービスです。

動作確認

Data Firehose → S3の動作確認

バケット、Firehose用IAMロールを準備する

メトリクスログを保存するS3バケットを準備します。

cap02.PNG

下記ドキュメントを参考に、Data Firehoseにアタッチするサービスロールを作成します。

こんな感じのポリシーを持つロールを作りました。

policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:ListBucketMultipartUploads",
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:AbortMultipartUpload"
            ],
            "Effect": "Allow",
            "Resource": [
                "${aws_s3_bucket.main.arn}",
                "${aws_s3_bucket.main.arn}/*"
            ]
        }
    ]
}

Firehoseストリームを作成する

準備ができたので、Firehoseストリームを作成します!

マネコンに移動する

cap03.PNG

「Firehose ストリームを作成」をクリックします。

ソースと送信先を選択する

cap04.PNG

ソースをクリックします。

cap05.PNG

Direct PUTを選択します。
CloudwatchメトリクスStreamを作成すると、そのリソースがPUT APIを叩いてくれます。

cap06.PNG

送信先はS3を選択します。Datadogとか触ってみたいなー。

Firehose ストリーム名を設定する

cap07.PNG

任意のストリーム名を入力します。アカウント内で一意である必要があります。

(任意)レコードの変換設定を行う

cap08.PNG

今回はスキップします。SAAの試験で良く問われるやつですね。

送信先の設定を行う

cap09.PNG

作成したS3バケットを設定します。

詳細設定を行う

cap10.PNG

簡単な動作確認なのでログ出力は無効化しておきます。

cap11.PNG

選択したIAMロールを使用するよう設定します。

cap12.PNG

設定内容に問題がなければ、「Firehose ストリームを作成」をクリックします。

ストリームがアクティブになることを確認する

cap13.PNG

ストリームの作成には最大5分かかるらしいです。少し待ちます。

cap14.PNG

1分くらいで作成が完了しました。

デモデータでテストする

ストリーム詳細画面を下にスクロールします。

cap15.PNG

「デモデータの送信を開始」ボタンでデモデータをストリームに送信します。

cap16.PNG

少し待った後、送信を停止します。

cap20.PNG

デフォルトでは、ストリームは300秒に1度、配信先にデータを配信します。

cap17.PNG

少し待機し、S3を見に行きます。
それっぽいプレフィックスがきられています。

cap21.PNG

デフォルトでは、ストリームは「YYYY/MM/dd/HH」プレフィックスでオブジェクトを保存します。

cap18.PNG

デフォルトプレフィックスでオブジェクトが保存されていますね!!

cap19.PNG

中身は意味不明ですが、動いていそうです。
Data Firehose → S3の動作確認ができたので、CloudWatchメトリクスをこのストリームへ配信するためのリソースを作成していきます。

CloudWatch Metric Streams → Data Firehoseの動作確認

Metric Streams用IAMロール、メトリクスを収集したいリソースを準備する

下記ドキュメントを参考に、Metric Streamsにアタッチするサービスロールを作成します。

Metric Streamsは、メトリクスをstream形式で配信してくれるサービス、という認識で大丈夫です。

こんな感じのポリシーを持つロールを作りました。

policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "firehose:PutRecordBatch",
                "firehose:PutRecord"
            ],
            "Effect": "Allow",
            "Resource": "${aws_kinesis_firehose_delivery_stream.stream.arn}"
        }
    ]
}

次に、メトリクスを収集したいリソースを準備します。
今回は、複数のEC2のCPUUtilizationとNetworkOutを収集しようと思います。

cap22.PNG

適当にEC2を起動しました。

Metric Streamsを作成する

準備が終わったので、Metric Streamsを作成し、メトリクスをstream形式でData Firehoseに配信してみます!!!

マネコンに移動する

cap23.PNG

cloudwatchのマネコンから、「ストリーム」をクリックします。

メトリクスストリーム作成画面に移動する

cap24.PNG

「メトリクスストリームの作成」をクリックします。

セットアップ方法を選択する

cap25.PNG

セットアップ方法が表示されます。

cap26.PNG

デフォルトのクイックセットアップでは、DataFirehoseまで一緒に作られてしまうので、右端の「Custom setup」を選択します。

cap27.PNG

先ほど作成したDataFirehoseのストリームを選択します。

cap28.PNG

サービスロールを選択します。デフォルトから変更します。

cap29.PNG

先ほど作成したIAMロールを選択します。

出力フォーマットを変更する

cap30.PNG

今回はログファイルの中身をそのまま確認したいので、JSON形式を選択します。

ストリームするメトリクスを設定する

cap31.PNG

ストリーム対象のメトリクスを選択します。デフォルトでは全てのメトリクスが対象になっています。

cap32.PNG

名前空間を指定します。今回はEC2を対象とします。
Select metrics → Include → EC2 の順に選択します。

cap33.PNG

メトリクスを指定します。
任意のものを指定可能です。

メトリクスストリーム名を設定する

cap34.PNG

任意の名前を設定します。

リソースを作成する

cap35.PNG

「メトリクスストリームの作成」をクリックします。

cap36.PNG

正常に作られました。

S3にストリームが保存されることを確認する

5~10分ほど待機し、S3を確認します。

cap37.PNG

来てますね!
中身を確認します。以下のようなjsonが得られました。

{"metric_stream_name":"my-metric-stream","account_id":"123456789012","region":"ap-northeast-1","namespace":"AWS/EC2","metric_name":"CPUUtilization","dimensions":{"InstanceId":"i-05528977c4a5b0e40"},"timestamp":1726301400000,"value":{"max":0.3416780559351978,"min":0.2249962500624989,"sum":0.5666743059976966,"count":2.0},"unit":"Percent"}
{"metric_stream_name":"my-metric-stream","account_id":"123456789012","region":"ap-northeast-1","namespace":"AWS/EC2","metric_name":"NetworkOut","dimensions":{"InstanceId":"i-05528977c4a5b0e40"},"timestamp":1726301400000,"value":{"max":19653.0,"min":19203.0,"sum":38856.0,"count":2.0},"unit":"Bytes"}
{"metric_stream_name":"my-metric-stream","account_id":"123456789012","region":"ap-northeast-1","namespace":"AWS/EC2","metric_name":"CPUUtilization","dimensions":{"InstanceId":"i-00b59eb5cdf98b054"},"timestamp":1726301400000,"value":{"max":0.3584169639582569,"min":0.2248089124244392,"sum":0.5832258763826961,"count":2.0},"unit":"Percent"}
{"metric_stream_name":"my-metric-stream","account_id":"123456789012","region":"ap-northeast-1","namespace":"AWS/EC2","metric_name":"NetworkOut","dimensions":{"InstanceId":"i-00b59eb5cdf98b054"},"timestamp":1726301400000,"value":{"max":23298.0,"min":19131.0,"sum":61704.0,"count":3.0},"unit":"Bytes"}

めっちゃ良い感じ!!!
動作確認は以上です。簡単にメトリクスの保存ができました。

おわりに

メトリクスは永続的に保存されないことを知らず、
障害を復旧させた後、メトリクスを確認しようとしたら、メトリクスが消えていた・・・という経験があります。
今回のような対応で、しっかり永続化しておきたいですね。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3