AWS

【AWS】CloudWatchカスタムメトリクスを知る

今回は『JAWS-UG CLI専門支部 #166R CloudWatch基礎 (カスタムメトリック)|8/27開催』に参加した復習です。(2ヶ月前!!!w)

ハンズオン内で使用したCLIコマンドを整理して、CloudWatchカスタムメトリクスに関する学びを深めていきます。

(お断り)
記載しているCLIコマンドサンプルはハンズオン手順書から抜粋したものなので、そのまま動作させることはできません。各コマンドのオプション等で指定している変数は、事前に宣言しておく(または随時指定)必要があります。
CLIコマンドサンプルは「CLIコマンドの概要と、必要なオプションを把握する」ことを目的として記載しております。

(メモ)
今回のハンズオン手順書(波田野さん公式)はこちら:
ハンズオン(簡易版): CloudWatch基礎 カスタムメトリクス

AWS学習中の皆様は絶対に参加すべきコミュニティはこちら:

ハンズオンに参加した感想

今回もハンズオンイベントをきっかけに多くの学びがあったので感謝です。
CloudWatch関連の各種CLIコマンドの使用方法を確認できたのはもちろんのこと、「カスタムメトリクスって何?」な状態だったため、ドキュメントの読み込みによりCloudWatch自体の理解も深まりました。
カスタムメトリクスに対する理解はまだ浅い部分があると感じてますが、波田野さんが「CloudWatchはカラダで覚えるもの」 と言われていたようにw、CloudWatchを使い倒す中でより理解を深めていくつもりです。

ハンズオンの流れ & 使用したCLIコマンドたち

0. はじめに

【今回のハンズオン概要】

  • 仮想アプリとしてサンプルアプリを作成して、カスタムメトリクスを作成できるようにする
  • 発行(生成)されたカスタムメトリクス自体の確認も行うが、カスタムメトリクスに対するアラームを作成することにより、状態変化による確認も可能にする

ということで、
ここでは、事前作業として、アラームで使用する「SNSトピックの構築・購読」を行います。

  • SNSトピックの構築
aws sns create-topic \
  --name ${SNS_TOPIC_NAME}
  • SNSトピックの存在確認・ARN取得
aws sns list-topics \
  --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \
  --output text
  • SNSトピックの購読
aws sns subscribe \
  --topic-arn ${SNS_TOPIC_ARN} \
  --protocol ${SNS_SUBSCRIPTION_PROTOCOL} \
  --notification-endpoint ${SNS_SUBSCRIPTION_ENDPOINT}

購読開始のメールが来るので、承認リンクをクリックする必要がある。承認時に表示される画面でアンサブスクライブのリンクをクリックしないように注意。

  • SNSトピックに登録したメールアドレス(エンドポイント)の存在確認
aws sns list-subscriptions-by-topic \
  --topic-arn ${SNS_TOPIC_ARN} \
  --query "Subscriptions[?Endpoint == \`${SNS_SUBSCRIPTION_ENDPOINT}\`].Endpoint" \
  --output text
  • SNSトピックに登録したメールアドレス(エンドポイント)が購読状態になっている(承認済み)ことを確認
aws sns list-subscriptions-by-topic \
  --topic-arn ${SNS_TOPIC_ARN} \
  --query "Subscriptions[?Endpoint == \`${SNS_SUBSCRIPTION_ENDPOINT}\`].SubscriptionArn" \
  --output text

・承認プロセスが完了するとサブスクリプションARNが”PendingConfirmation” からARN形式のARNに変わる。

・対象メールアドレスがエンドポイントとして登録されているSNSトピック一覧を確認する場合は、コマンド「aws sns list-subscriptions」を利用することができる。以下、サンプル。

  • 任意のメールアドレスがエンドポイントとして登録されている、SNSトピック一覧を出力するコマンド (ハンズオンに含まれないコマンド)
aws sns list-subscriptions \
  --query "Subscriptions[?Endpoint == \`${SNS_SUBSCRIPTION_ENDPOINT}\`].TopicArn"

1. サンプルアプリの作成・実行

仮想アプリを配置して、カスタムメトリクスを登録する仕組みを構築します。
想定するフロートしては、外部リソースが出力したログファイルをカスタムメトリクスとして登録する、というもので、今回はシェルスクリプトにより実現しています。
シェルスクリプト全体は割愛させていただき(シェルスクリプトの全ては理解しきれてないこともあり)、他と同様CLIコマンド部分のみ抜粋します。

  • カスタムメトリクスを発行
aws cloudwatch put-metric-data \
  --region ${AWS_REGION} \
  --namespace ${CLOUDWATCH_NAMESPACE} \
  --metric-name ${CLOUDWATCH_METRIC_NAME_INVOCATIONS} \
  --dimensions ${CLOUDWATCH_DIMENSION_NAME}=${CLOUDWATCH_DIMENSION_VALUE} \
  --value ${invocations} \
  --unit ${CLOUDWATCH_METRIC_UNIT} \
  --timestamp ${timestamp}

AWSの各種サービスには、CloudWatch に対してメトリクスをパブリッシュする仕組み?が標準で準備されているが、AWS CLI やAPI を使用することにより独自メトリクスについてもCloudWatch にパブリッシュすることができる。

AWS CLI または API を使用して、独自のメトリクスを CloudWatch にパブリッシュできます。AWS マネジメントコンソール でパブリッシュしたメトリクスの統計グラフを表示できます。(参考:カスタムメトリクスを発行する|公式

2. CloudWatch メトリクス確認

  • CloudWatch メトリクスの一覧を確認
aws cloudwatch list-metrics \
  --namespace ${CLOUDWATCH_NAMESPACE} \
  --dimensions ${STRING_CLOUDWATCH_DIMENSIONS} \
  --query 'Metrics[].MetricName' \
  --output text \
| sed "s/\t/\n/g"

ここでは sed コマンドにより、標準出力文字列に対する置換(タブ→改行コード)を行っている。たぶん。

  • メトリクスの確認(取得)
aws cloudwatch get-metric-statistics \
  --namespace ${CLOUDWATCH_NAMESPACE} \
  --metric-name ${CLOUDWATCH_METRIC_NAME} \
  --dimensions ${STRING_CLOUDWATCH_DIMENSIONS} \
  --start-time ${CLOUDWATCH_METRIC_TIME_START} \
  --end-time ${CLOUDWATCH_METRIC_TIME_END} \
  --period ${CLOUDWATCH_METRIC_PERIOD} \
  --statistics ${CLOUDWATCH_METRIC_STATISTICS} \
  --query 'Datapoints' \
  --output text \
| sort -k2

3. CloudWatchアラームの作成

  • SNSトピックのARNを取得
aws sns list-topics \
  --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \
  --output text
  • CloudWatch アラームを作成
aws cloudwatch put-metric-alarm \
  --namespace ${CLOUDWATCH_NAMESPACE} \
  --dimensions ${STRING_CLOUDWATCH_DIMENSIONS} \
  --metric-name ${CLOUDWATCH_METRIC_NAME} \
  --statistic ${CLOUDWATCH_METRIC_STATISTIC} \
  --unit ${CLOUDWATCH_METRIC_UNIT} \
  --alarm-name ${CLOUDWATCH_ALARM_NAME} \
  --alarm-description "${CLOUDWATCH_ALARM_DESCRIPTION}" \
  --period ${CLOUDWATCH_ALARM_PERIOD} \
  --evaluation-periods ${CLOUDWATCH_ALARM_EVALUATION_PERIOD} \
  --threshold ${CLOUDWATCH_ALARM_THRESHOLD} \
  --comparison-operator ${CLOUDWATCH_ALARM_COMPARISON} \
  --treat-missing-data ${CLOUDWATCH_ALARM_TREAT_MISSING_DATA} \
  --alarm-actions ${ARRAY_CLOUDWATCH_ALARM_ACTIONS}
  • CloudWatch アラームの存在確認
aws cloudwatch describe-alarms \
  --alarm-names ${CLOUDWATCH_ALARM_NAME} \
  --query 'MetricAlarms[].AlarmName' \
  --output text

4. 動作確認

  • CloudWatchアラームのステータスを確認
aws cloudwatch describe-alarms \
  --alarm-names ${CLOUDWATCH_ALARM_NAME} \
  --query 'MetricAlarms[].StateValue' \
  --output text

ステータスの種類は「OK/ ALARM/ INSUFFICIENT_DATA」の3種類
INSUFFICIENT_DATA とは、メトリクスがアラームの状態を判断するのに十分なデータが存在しないことを意味します。
(参考:CloudWatch アラームが INSUFFICIENT_DATA 状態になる理由は何ですか?|公式

  • CloudWatchアラームの履歴を取得
aws cloudwatch describe-alarm-history \
  --alarm-name ${CLOUDWATCH_ALARM_NAME} \
  --max-items ${CLOUDWATCH_ALARM_HISTORY_MAX_ITEMS} \
  --query "AlarmHistoryItems[].[join(\`\`,[Timestamp,\`: \`,HistoryItemType,\`: \`,HistorySummary])]" \
  --output text

5. 後片付け

ここでは、SNSトピックの破棄を行います。

  • SNSトピックARNを取得
aws sns list-topics \
  --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \
  --output text
  • SNSトピックを破棄
aws sns delete-topic \
  --topic-arn ${SNS_TOPIC_ARN}
    • SNSトピックが存在しないことを確認
aws sns list-topics \
  --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \
  --output text

SNSトピックを削除してもサブスクリプションは残るので、別途削除が必要。
サブスクリプション(購読)の停止は、CLIコマンド`[aws sns unsubscribe –subscription-arn ]`を利用する。
なお、上のコマンドで指定するsubscription-arn は、CLIコマンド`[aws sns list-subscriptions-by-topic –topic-arn ]`にて取得が可能。

  • サブスクリプションのARNを取得する(ハンズオンに含まれないコマンド)
aws sns list-subscriptions-by-topic \
  --query "Subscriptions[].SubscriptionArn" \
  --topic-arn  \
  --output text
  • SNSトピックの購読を停止する(ハンズオンに含まれないコマンド)
aws sns unsubscribe \
  --subscription-arn 

CloudWatchの概念を理解する

Amazon CloudWatch の振り返りも兼ねて、「CloudWatchの概念|公式」ページを参考に思考を整理していきます。

Namespaces【名前空間】

各AWSサービスで作成されるメトリクスでは、「AWS/[service]」 が使用される
名前空間とAWSのサービス一覧→「CloudWatchメトリクスを発行するAWSのサービス|公式
利用者が自由に書き込めるのがカスタムメトリクスでは、「AWS/*」以外の名前空間を指定する必要がある

Metrics【メトリクス】

メトリクスはCloudWatch に発行された時系列のデータポイントのセット
AWSのサービスがCloudWatch に”メトリクス”を送信する
ユーザーは独自の”カスタムメトリクス”を CloudWatch に送信できる
メトリクスは作成されたリージョンにのみ存在する
メトリクスは削除できないが、15 か月後に自動的に有効期限切れになり削除される
メトリクスは名前、名前空間0以上のディメンションで一意に定義される
メトリクスの各データポイントには、タイムスタンプと(オプションで) 測定単位があり、CloudWatch から任意のメトリクスの統計を取得することができる

Dimensions【ディメンション】

Name/Value が存在する
(EC2における例:InstanceId/インスタンスのID)
メトリクスを検索する際にInstanceId ディメンションを指定することにより、特定のEC2 インスタンスの統計を取得することができる
1 つのメトリクスには最大10個のディメンションを指定することができる
CloudWatch は、メトリクスのメトリクス名が同じ場合でも、ディメンションの一意の各組み合わせを別個のメトリクスとして扱う
明示的に発行したディメンションの組み合わせを用いてのみ、統計を取得できる

DataPoint【データポイント】

CLIやSDKで書き込みが可能
EC2にCloudWatch統合Agentを導入して書き込みを行うことも可能
その場合、名前空間は「CWAgent/*」となる(設定にて変更が可能)

メトリクスの保存期間

期間が 60 秒未満のデータポイントは 3 時間使用可能。(高分解能カスタムメトリクス)
期間が 60 秒 (1 分) のデータポイントは、15 日間使用可能。
期間が 300 秒 (5 分) のデータポイントは、63 日間使用可能。
期間が 3600 秒 (1 時間) のデータポイントは、455 日 (15 か月) 間使用可能。

1 分の期間でデータを収集する場合、データは 1 分の解像度で 15 日にわたり利用可能になります。15 日を過ぎてもこのデータはまだ利用できますが、集計され、5 分の解像度のみで取得可能になります。63 日を過ぎるとこのデータはさらに集計され、1 時間の解像度のみで利用できます。

つまり、古いデータに関しては集計され、解像度が荒いデータとして保存される仕組み。

料金

すべてのカスタムメトリックの料金は時間単位で請求され、メトリクスを CloudWatch に送信したときにのみ計算される
(例:最初の10,000 メトリクスは、0.30USD(参考:Amazon CloudWatch の料金|公式))
詳細はこちらの記事がわかりやすかったのでご確認ください
CloudWatch カスタムメトリクスの料金計算|Qiita @nakayama_cw さま

以上です。
最後まで読んでいただきありがとうございます!