この記事は『CRESCO Advent Calendar 2020』 5日目の記事です。
Amazon CloudFrontのモニタリングがしたいので、CloudWatch Alarmを利用してモニタリング設定をAWS CloudFormationのテンプレートで実装してみました。
途中、ハマった部分があったので何かお役に立てればと願いつつ少々長いですが書いていきます。
| メトリクス名 | 有効な統計 | 説明 |
| 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 であるすべてのビューワーリクエストの割合 (%) |
モニタリング要件に応じて、メトリクスを選択してください。
| 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を!!!


