この記事は『CRESCO Advent Calendar 2020』  5日目の記事です。

 

Amazon CloudFrontのモニタリングがしたいので、CloudWatch Alarmを利用してモニタリング設定をAWS CloudFormationのテンプレートで実装してみました。

途中、ハマった部分があったので何かお役に立てればと願いつつ少々長いですが書いていきます。

やりたい事

1.CloudWatch Alarmを利用してCloudFrontのモニタリング
2.Alarm状態になったらメールでお知らせ
3.OK状態になったらメールでお知らせ
4.1~3の機能をCloudFormationで実装

まずはCloudFrontのモニタリング項目(標準メトリクス)を確認

メトリクス名 有効な統計 説明
4xxErrorRate Average

レスポンスの HTTP ステータスコードが 4xx であるすべてのビューワーリクエストの割合 (%)

401ErrorRate Average

レスポンスの HTTP ステータスコードが 401 であるすべてのビューワーリクエストの割合 (%)

403ErrorRate Average

レスポンスの HTTP ステータスコードが 403 であるすべてのビューワーリクエストの割合 (%)

404ErrorRate Average

レスポンスの HTTP ステータスコードが 404 であるすべてのビューワーリクエストの割合 (%)

5xxErrorRate Average

レスポンスの HTTP ステータスコードが 5xx であるすべてのビューワーリクエストの割合 (%)

502ErrorRate Average

レスポンスの HTTP ステータスコードが 502 であるすべてのビューワーリクエストの割合 (%)

503ErrorRate Average

レスポンスの HTTP ステータスコードが 503 であるすべてのビューワーリクエストの割合 (%)

504ErrorRate Average

レスポンスの HTTP ステータスコードが 504 であるすべてのビューワーリクエストの割合 (%)

BytesDownloaded Sum GET リクエスト、HEAD リクエスト、および OPTIONS リクエストに対してビューワーがダウンロードしたバイト総数
BytesUploaded Sum POST リクエストと PUT リクエストを使用して CloudFront でビューワーがオリジンにアップロードしたバイト総数
CacheHitRate Average CloudFront がそのキャッシュからコンテンツを送信した対象のすべてのキャッシュ可能なリクエストの割合 (%)
OriginLatency Average CloudFront キャッシュではなくオリジンから送信されたリクエストについて、CloudFront がリクエストを受信してからネットワーク (ビューワーではなく) にレスポンスを提供し始めるまでに費やした合計時間 (ミリ秒単位)
Requests Sum すべての HTTP メソッド、および HTTP リクエストと HTTPS リクエストの両方について CloudFront が受信したビューワーリクエストの総数
TotalErrorRate Average レスポンスの HTTP ステータスコードが 4xx または 5xx であるすべてのビューワーリクエストの割合 (%)

モニタリング要件に応じて、メトリクスを選択してください。

出来上がったCloudFormation

AWSTemplateFormatVersion: 2010-09-09
Description: CloudWatch Alarm Setting
Parameters:
AppName:
Description: app name
Type: String
Default: sample-app
DistributionId:
Type: String
Default: DistributionId
Resources:
CloudFrontAlarmTopic:
Type: AWS::SNS::Topic
Properties:
DisplayName: SampleTopic
TopicName: cdn-alarm-topic
Tags:
- Key: "app-name"
Value: !Ref AppName
CdnDeveloperTopicEmailSubscriber:
Type: AWS::SNS::Subscription
Properties:
Endpoint: sample-emaile@sample.com
Protocol: email
TopicArn: !Ref CloudFrontAlarmTopic
CloudFront4xxErrorRateAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: CloudFront4xxErrorRateAlarm
Namespace: AWS/CloudFront
MetricName: 4xxErrorRate
Dimensions:
- Name: DistributionId
Value: !Ref DistributionId
Statistic: Average
Period: 300
TreatMissingData: notBreaching
EvaluationPeriods: 1
ComparisonOperator: GreaterThanOrEqualToThreshold
Threshold: 100
AlarmActions:
- !Ref CloudFrontAlarmTopic
OKActions:
- !Ref CloudFrontAlarmTopic

今回のCloudWatch Alarmの設定は5分に1回データを見に行き、閾値が100%を超えていたらアラーム状態となり、100%以下もしくはデータ不足の場合はOK状態となります。メールの通知はアラーム状態に遷移した時、もしくはアラーム状態からOK状態に遷移した時に登録したメールアドレス宛にお知らせされます。

CloudFormationのDeployが成功したので「できた!」と思い、早速403エラーを出してみましたが、、、青い線(AWSで言うデータポイント)がついてない、、、

調べてみると…

ディメンション

 

各 CloudFront メトリクスには、次の 2 つのディメンションがあります。

DistributionId DistributionId の値は、メトリクスを取得する対象の CloudFront ディストリビューションの ID です。

Region Region の値は常に Global です。CloudFront はグローバルサービスであるためです。

 

とのこと…

ちゃんと読めば分かる事なんですが解決するのに時間がかかりました。そんなこんなでDimentionsにRegionとGlobalを追記し、完成したテンプレートがこちら↓

WSTemplateFormatVersion: 2010-09-09
Description: CloudWatch Alarm Setting
Parameters:
AppName:
Description: app name
Type: String
Default: sample-app
DistributionId:
Type: String
Default: DistributionId
Resources:
CloudFrontAlarmTopic:
Type: AWS::SNS::Topic
Properties:
DisplayName: SampleTopic
TopicName: cdn-alarm-topic
Tags:
- Key: "app-name"
Value: !Ref AppName
CdnDeveloperTopicEmailSubscriber:
Type: AWS::SNS::Subscription
Properties:
Endpoint: sample-emaile@sample.com
Protocol: email
TopicArn: !Ref CloudFrontAlarmTopic
CloudFront4xxErrorRateAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: CloudFront4xxErrorRateAlarm
Namespace: AWS/CloudFront
MetricName: 4xxErrorRate
Dimensions:
- Name: Region
Value: Global
- Name: DistributionId
Value: !Ref DistributionId
Statistic: Average
Period: 300
TreatMissingData: notBreaching
EvaluationPeriods: 1
ComparisonOperator: GreaterThanOrEqualToThreshold
Threshold: 100
AlarmActions:
- !Ref CloudFrontAlarmTopic
OKActions:
- !Ref CloudFrontAlarmTopic

これをバージニア北部(us-east-1)にデプロイします。

今度はどうかな???

青い線(AWSで言うところの(略))が付きました!!!やったね!!!

Alarmメールも届きました!!!(嬉しい!!!)

CloudFrontはGlobalサービスです。うっかりしてました・・・・

CloudFormationはちょっとややこしかったり、ハマっちゃうことはあるけれど、慣れればインフラリソースの管理が楽になります。

皆さんもCloudFormationで快適なAWS LIFEを!!!