CloudWatchメトリクスストリームを使用して、メトリクスをS3バケットに配信する
本ページでは、CloudWatchのメトリクスストリームを扱います。
メトリクスストリームを使用すると、ほぼリアルタイムに着信するように低レイテンシーで、選択した送信先に CloudWatch メトリクスを継続的にストリーミングできます。サポートされる送信先には、Amazon Simple Storage Service などの AWS の送信先や、サードパーティーのサービスプロバイダーの送信先が含まれます。
メトリクスストリームを使用する
CloudWatchメトリクスの値をS3バケットに配信する方法を確認します。
構築する環境
CloudWatchでメトリクスストリームを使用します。
今回はEC2インスタンスのCPU使用率をメトリクスストリームで配信する対象とします。
メトリクスストリームの送信先はKinesis Data Firehoseです。
Kinesis Firehoseの送信先はS3バケットです。
このバケットにCloudWatchメトリクスから配信されたメトリクスデータをJSON形式で保存します。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートファイルを設置しています。
テンプレートファイルのポイント解説
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 の統計情報が含まれています。
メトリクスストリームを使用する
これ以外の統計情報が必要な場合は、手動で追加する必要があります。
追加できる統計情報は以下のページにまとめられています。
今回は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にデータを配信するために必要な権限を与えます。
こちらについては、以下のページを参考に設定しました。
(参考) 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 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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
AWS Management Consoleから各リソースを確認します。
CloudWatchメトリクスストリームを確認します。
正常にCloudWatchメトリクスストリームが作成されています。
このメトリクスストリームがKinesis Data Firehose宛であることがわかります。
また下部のDashboardを見ると、まだメトリクスが配信されていないこともわかります。
Kinesis Data Firehoseを確認します。
Kinesis Data Firehoseが正常に作成されています。
こちらは配信先がS3バケット(soa-01-003)であることが確認できます。
S3バケットを確認します。
S3バケットが正常に作成されています。
まだメトリクスが配信されていないため、バケットは空です。
動作確認
準備が整いましたので、しばらく待機します。
数分後、CloudWatchメトリクスストリームからの配信が開始されます。
Dashboardを見ると、メトリクスの配信が開始されたことがわかります。
次にKinesis Data Firehoseを確認します。
Kinesis Data Firehoseのモニタリングを見ると、確かにデータが配信されてきています。
つまりCloudWatchメトリクスストリームから配信されたメトリクスデータが、Kinesis Data Firehoseまで到達しているということです。
最後にS3バケットを確認します。
S3バケットにフォルダが作成されました。
このフォルダの中身を確認します。
テキストファイルが配置されています。
このことからも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バケットに配信する方法を確認しました。