CloudWatchメトリクスストリームを使用して、メトリクスをS3バケットに配信する

CloudWatchメトリクスストリームを使用して、メトリクスをS3バケットに配信する

本ページでは、CloudWatchのメトリクスストリームを扱います。

メトリクスストリームを使用すると、ほぼリアルタイムに着信するように低レイテンシーで、選択した送信先に CloudWatch メトリクスを継続的にストリーミングできます。サポートされる送信先には、Amazon Simple Storage Service などの AWS の送信先や、サードパーティーのサービスプロバイダーの送信先が含まれます。

メトリクスストリームを使用する

CloudWatchメトリクスの値をS3バケットに配信する方法を確認します。

構築する環境

Diagram of CloudWatch metrics streams to deliver metrics to S3 buckets.

CloudWatchでメトリクスストリームを使用します。
今回はEC2インスタンスのCPU使用率をメトリクスストリームで配信する対象とします。

メトリクスストリームの送信先はKinesis Data Firehoseです。

Kinesis Firehoseの送信先はS3バケットです。
このバケットにCloudWatchメトリクスから配信されたメトリクスデータをJSON形式で保存します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートファイルを設置しています。

GitHub
awstut-soa/01/003 at main · awstut-an-r/awstut-soa Contribute to awstut-an-r/awstut-soa development by creating an account on GitHub.

テンプレートファイルのポイント解説

CloudWatchメトリクスストリーム

Resources:
  MetricStream:
    Type: AWS::CloudWatch::MetricStream
    Properties:
      FirehoseArn: !Ref KinesisFirehoseDeliveryStreamArn
      IncludeFilters: 
        - MetricNames: 
            - !Ref MetricName1
          Namespace: !Ref Namespace1
      Name: !Sub "${Prefix}-ec2-cpu"
      OutputFormat: json
      RoleArn: !GetAtt MetricStreamRole.Arn
      StatisticsConfigurations: 
        - AdditionalStatistics: 
            - !Ref AdditionalStatistic1
          IncludeMetrics: 
            - MetricName: !Ref MetricName1
              Namespace: !Ref Namespace1
Code language: YAML (yaml)

FirehoseArnプロパティには、Kinesis Data FirehoseのARNを指定します。
このFirehoseがメトリクスの送信先となります。

ExcludeFiltersおよびIncludeFiltersプロパティで、取得するメトリクスを限定することができます。
前者は不要なメトリクスを、後者は必要なメトリクスを指定することができます。
今回は後者のみ使用し、EC2のCPU使用率のデータのみ取得するように設定します。
具体的には、MetricNamesに「CPUUtilization」、Namespaceに「AWS/EC2」を指定します。

OutputFormatプロパティでデータの配信形式を設定できます。
サポートされている形式は以下の通りですが、今回は「JSON」を指定します。

サポートされている形式は、JSON、OpenTelemetry 1.0.0、OpenTelemetry 0.7.0 です。

メトリクスストリームを使用する

StatisticsConfigurationsプロパティを設定すると、統計情報を追加で取得することができます。
デフォルトでは、以下の統計情報が取得できます。

メトリクスストリームには、常に Minimum、Maximum、SampleCount、および Sum の統計情報が含まれています。

メトリクスストリームを使用する

これ以外の統計情報が必要な場合は、手動で追加する必要があります。
追加できる統計情報は以下のページにまとめられています。

あわせて読みたい
CloudWatch 統計定義 - Amazon CloudWatch トリミング平均、ウィンソライズされた平均、トリミングされたカウント、百分位ランク、トリミングされた合計、平均、合計、最小、最大、サンプルカウントを含む Amazon Cl...

今回はEC2のCPU使用率の95パーセンタイル値を取得するように設定します。
AdditionalStatisticsプロパティには、追加する統計情報である「p95」を指定します。
IncludeMetricsプロパティには、追加する統計情報を算出する対象のメトリクス情報である「CPUUtilization」および「AWS/EC2」を指定します。

RoleArnプロパティでは、以下のIAMロールを指定します。

Resources:
  MetricStreamRole:
    Type: AWS::IAM::Role
    DeletionPolicy: Delete
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service:
                - streams.metrics.cloudwatch.amazonaws.com
      Policies:
        - PolicyName: MetricStreamPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - firehose:PutRecord
                  - firehose:PutRecordBatch
                Resource:
                  - !Ref KinesisFirehoseDeliveryStreamArn
Code language: YAML (yaml)

メトリクスストリームがKinesis Data Firehoseにデータを配信するために必要な権限を与えます。

こちらについては、以下のページを参考に設定しました。

あわせて読みたい
CloudWatch と Firehose 間の信頼 - Amazon CloudWatch Firehose 配信ストリームは、Firehose への書き込みアクセス許可を持つ IAM ロールを通じて CloudWatch を信頼する必要があります。このアクセス許可は、CloudWatch メトリ...

(参考) Kinessi Data Fireshose

Resources:
  KinesisFirehoseDeliveryStream:
    Type: AWS::KinesisFirehose::DeliveryStream
    Properties:
      DeliveryStreamName: !Sub "${Prefix}-FirehoseDeliveryStream"
      DeliveryStreamType: DirectPut
      S3DestinationConfiguration: 
        BucketARN: !Ref BucketArn
        CloudWatchLoggingOptions: 
          Enabled: true
          LogGroupName: !Ref LogGroup
          LogStreamName: !Ref LogStream
        CompressionFormat: UNCOMPRESSED
        Prefix: firehose/
        RoleARN: !GetAtt KinesisS3DestinationRole.Arn
Code language: YAML (yaml)

Kinesis Data Firehoseの基本的な事項については、以下のページをご確認ください。

あわせて読みたい
Kinesis Data Streamsで受信したデータを、Firehose経由でS3バケットに保存する 【Kinesis Data Streamsで受信したデータを、Firehose経由でS3バケットに保存する】 以下のページで、Lambda関数で生成したデータをKinesis Data Streamsで受け取り、Ki...

メトリクスストリームから送信されたデータをKinesis Data Firehoseで受け取る上でのポイントは、DeliveryStreamTypeプロパティです。
本プロパティには「DirectPut」を指定します。

配信先のS3バケットの指定は、S3DestinationConfigurationプロパティで行います。

RoleARNプロパティで以下のIAMロールを指定します。

Resources:
  KinesisS3DestinationRole:
    Type: AWS::IAM::Role
    DeletionPolicy: Delete
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service:
                - firehose.amazonaws.com
      Policies:
        - PolicyName: KinesisS3DestinationPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - s3:AbortMultipartUpload
                  - s3:GetBucketLocation
                  - s3:GetObject
                  - s3:ListBucket
                  - s3:ListBucketMultipartUploads
                  - s3:PutObject
                Resource:
                  - !Ref BucketArn
                  - !Sub "${BucketArn}/*"
              - Effect: Allow
                Action:
                  - logs:PutLogEvents
                Resource:
                  - !GetAtt LogGroup.Arn
Code language: YAML (yaml)

メトリクスデータをS3バケットに配信するために必要な権限を与えます。

(参考) S3バケット

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: Private
      BucketName: !Ref Prefix
Code language: YAML (yaml)

特別な設定は行う必要はありません。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

AWS Management Consoleから各リソースを確認します。

CloudWatchメトリクスストリームを確認します。

Detail of CloudWatch 01.

正常にCloudWatchメトリクスストリームが作成されています。
このメトリクスストリームがKinesis Data Firehose宛であることがわかります。
また下部のDashboardを見ると、まだメトリクスが配信されていないこともわかります。

Kinesis Data Firehoseを確認します。

Detail of Kinesis 01.

Kinesis Data Firehoseが正常に作成されています。
こちらは配信先がS3バケット(soa-01-003)であることが確認できます。

S3バケットを確認します。

Detail of S3 01.

S3バケットが正常に作成されています。
まだメトリクスが配信されていないため、バケットは空です。

動作確認

準備が整いましたので、しばらく待機します。

数分後、CloudWatchメトリクスストリームからの配信が開始されます。

Detail of CloudWatch 02.

Dashboardを見ると、メトリクスの配信が開始されたことがわかります。

次にKinesis Data Firehoseを確認します。

Detail of Kinesis 02.

Kinesis Data Firehoseのモニタリングを見ると、確かにデータが配信されてきています。
つまりCloudWatchメトリクスストリームから配信されたメトリクスデータが、Kinesis Data Firehoseまで到達しているということです。

最後にS3バケットを確認します。

Detail of S3 02.

S3バケットにフォルダが作成されました。

このフォルダの中身を確認します。

Detail of S3 03.

テキストファイルが配置されています。
このことからもCloudWatchメトリクスストリームから配信されたメトリクスデータが、Kinesis Data Firehoseを経由して、S3バケットに保存されたということです。

最後に保存されたテキストファイルの中身を確認します。

{
  "metric_stream_name": "soa-01-003-ec2-cpu",
  "account_id": "405418103230",
  "region": "ap-northeast-1",
  "namespace": "AWS/EC2",
  "metric_name": "CPUUtilization",
  "dimensions": {
    "InstanceId": "i-0548ccea730f12250"
  },
  "timestamp": 1709335800000,
  "value": {
    "max": 1.1247750449910017,
    "min": 1.0252392224852467,
    "sum": 2.1500142674762484,
    "count": 2,
    "p95": 1.1222726353249328
  },
  "unit": "Percent"
}
Code language: JSON / JSON with Comments (json)

中身はJSONファイルです。
これはCloudWatchメトリクスストリームの設定時に指定した通りのフォーマットです。

1つのEC2インスタンス(i-0548ccea730f12250)のCPU使用率が取得できています。
取得できているデータを見ると、最大値や最小値等に加えて、p95(95パーセンタイル値)も取得できています。
これもCloudWatchメトリクスストリームの設定時に、追加する統計情報として設定したものです。

まとめ

CloudWatchメトリクスストリームを使用して、CloudWatchメトリクスの値をS3バケットに配信する方法を確認しました。