amareloのブログ(仮)

IT系勉強会で感じた想いや知見をメインに書いていきます。

JAWS-UG CLI専門支部 #165R CloudWatch入門 復習

8/6(木)、JAWS-UG CLI専門支部 #165R CloudWatch入門を受講しました。復習完了しましたので、今回もブログを書きます。

イベントページ

jawsug-cli.connpass.com

CloudWatchとは

AWSユーザーガイドより抜粋

  • AWSリソースと、AWS でリアルタイムに実行されるアプリケーションを監視します。CloudWatch を使用してメトリクスを収集し、追跡できます。メトリクスとは、リソースやアプリケーションに関して測定できる変数です。
  • メトリクスを監視し、しきい値を超過したときに通知を送信したり、モニタリングしているリソースを自動的に変更したりするアラームを作成できます。
  • リソース使用率、アプリケーションパフォーマンス、オペレーションの正常性をシステムワイドに把握できます。
CloudWatchの要素
  • メトリクス
  • ダッシュボード
  • Contributotr Insightsルール
  • タグ
メトリクス
  • メトリクスとは

    • CloudWatch に発行された時系列のデータポイントのセット。
    • AWS のサービスが CloudWatch にメトリクスを送信する。また、独自のカスタムメトリクスを CloudWatch に送信することも可能。
    • データポイントの順序や比率は、任意で選択して追加できる。
    • データポイントについての統計を、順序付けられた時系列データのセットとして取得できる。
    • メトリクスは作成されたリージョンにのみ存在する。
    • メトリクスは削除できないが、それらに対して新しいデータが発行されない場合、15 か月後に自動的に有効期限切れになる。
  • メトリクスの要素

ハンズオン構成図

http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-cloudwatch-getting_started/_images/handson-getting_started.png

SQSキューにメッセージを送信して取得可能なメッセージが入ったら、アラームステータスを「ALARM」にしてSNSで利用者にメール通知するという構成です。 メッセージ取得したら、ステータスが「OK」になることを確認します。

詳しい手順はこちらをご参照ください。

作成コマンドは、以下の通りです。

SQSキューの構築

 aws sqs create-queue \
--queue-name <キュー名>

作成されたことを確認します。

JMESPathのクエリは、SQSキューのJSONのカレントノードにキュー名を含むことを確認するという意味です。

aws sqs list-queues --query "QueueUrls[?contains(@, <トピック名>)]" --output text

SNSトピックの構築

aws sns create-topic --name <トピック名>

トピックが作成されたことを確認します。

aws sns list-topics \
--query "Topics[?contains(TopicArn, <トピック名>)].TopicArn" \ 
--output text

SNSサブスクリプションの作成

<使用プロトコル>はメール(email)を使います。

<使用エンドポイント>は、メールの場合は送信先メールアドレスを指定します。

aws sns subscribe \
--topic-arn <サブスクリプション作成先トピックのARN> \
--protocol <使用プロトコル> \
--notification-endpoint <使用エンドポイント>

作成したサブスクリプションのエンドポイントを確認します。

aws sns list-subscriptions-by-topic --topic-arn <トピックARN> \
--query "Subscriptions[?Endpoint == <使用エンドポイント>].Endpoint" \
--output text

作成したサブスクリプションのARNを確認します。

aws sns list-subscriptions-by-topic --topic-arn <トピックARN> \
--query "Subscriptions[?Endpoint == <使用エンドポイント>].SubscriptionArn" \
--output text

CloudWatchメトリックの確認

<CloudWatchネームスペース>はSQSの場合、"AWS/SQS"となります。

<CloudWatchディメンション>のディメンション名と値は以下の通りです。

  • Name=QueueName
  • Value=handson-cli-cloudwatch-gettings-queue
aws cloudwatch list-metrics \
--namespace <CloudWatchネームスペース> \
--dimensions <CloudWatchディメンション> --query "Metrics[].MetricName" --output text | sed "s/\t/\n/g"

タブ区切り(\t)で出力されるため、すべて改行(\n)に置き換えるため、出力結果をsedに引き渡します。 出力結果(例)は以下の通りです。

SentMessageSize
ApproximateNumberOfMessagesDelayed
NumberOfMessagesDeleted
NumberOfMessagesSent
NumberOfMessagesReceived
NumberOfEmptyReceives
ApproximateAgeOfOldestMessage
ApproximateNumberOfMessagesVisible
ApproximateNumberOfMessagesNotVisible

CloudWatchメトリックの確認 (SQS キュー: ApproximateNumberOfMessagesVisible)

今回は<統計周期>を60(秒)、<統計種別>を'average'(平均)とします。

aws cloudwatch get-metric-statistics \
--namespace <ネームスペース> \
--metric-name <メトリクス名> \
--dimensions <ディメンション> \
--start-time <統計期間の開始時刻> \
--end-time <統計期間の終了時刻> \
--period <統計周期> \
--statistics <統計種別> \
--query 'Datapoints' 
\--output text | sort -k2

出力結果をsortに渡して2行目(-k2)でソートしていますが、普通にコマンドすると統計時間がソートされずに出力されます。

※ソート前

0.0     2020-08-12T20:37:00Z    Count
0.0     2020-08-12T20:55:00Z    Count
0.0     2020-08-12T20:56:00Z    Count
0.0     2020-08-12T20:38:00Z    Count

(中略)

0.0     2020-08-12T20:36:00Z    Count
0.0     2020-08-12T20:54:00Z    Count
0.0     2020-08-12T20:53:00Z    Count

見やすいように、出力結果の2行目でソートします。

※ソート後

0.0     2020-08-12T20:36:00Z    Count
0.0     2020-08-12T20:37:00Z    Count
0.0     2020-08-12T20:38:00Z    Count
0.0     2020-08-12T20:39:00Z    Count

(中略)

0.0     2020-08-12T21:02:00Z    Count
0.0     2020-08-12T21:03:00Z    Count
0.0     2020-08-12T21:04:00Z    Count

CloudWatchアラームの作成

aws cloudwatch put-metric-alarm \
--namespace <名前空間> \
--dimensions <ディメンション名> \
--metric-name <メトリクス名> \
--statistic <メトリクス統計値> \
--unit <メトリクス単位> \
--alarm-name <アラーム名> \
--alarm-description "<アラームの説明>" \
--period <アラームの監視周期> \
--evaluation-periods <アラームの監視評価期間> \
--threshold <アラームの閾値> \
--comparison-operator <アラームの比較演算子> \
--alarm-actions <アクション配列(監視対象ARN)>

アラームが作成されたことを確認します。

aws cloudwatch describe-alarms \
--alarm-names <アラーム名> \
--query 'MetricAlarms[].AlarmName' \
--output text

CloudWatchアラームステータスの更新

aws cloudwatch set-alarm-state \
--alarm-name <アラーム名> \
--state-value <アラーム更新後のステータス> \
--state-reason "<アラームのステータス更新の理由>"

アラームステータスが”ALARM”であることを確認します。

aws cloudwatch describe-alarms \
--alarm-names <アラーム名> \
--query 'MetricAlarms[].StateValue' \
--output text

アラームの履歴取得

aws cloudwatch describe-alarm-history \
--alarm-name <アラーム名> \
--max-items <アラームの履歴最大数>

SQSキューへのメッセージ送信

アラームを発生させるために、SQSキューにメッセージ送信をします。

aws sqs send-message \
--queue-url <キューURL> \
--message-body "<メッセージボディ>"

メッセージ数が1であることを確認します。

aws sqs get-queue-attributes \
--queue-url <キューURL> \
--attribute-names  ApproximateNumberOfMessages \
--query 'Attributes.ApproximateNumberOfMessages' \
--output text

アラームステータスの確認

アラームのステータスが「ALARM」になっていることを確認します。

aws cloudwatch describe-alarms \
--alarm-names <アラーム名> \
--query 'MetricAlarms[].StateValue' \
--output text

CloudWatchアラームの終息

SQSキューからのメッセージ受信
aws sqs receive-message \
--queue-url "<キューURL>"
メッセージの削除
aws sqs delete-message --queue-url "<キューURL>" \
--receipt-handle <ReceiptHandleの値>

削除されたことをメッセージ数で確認します。

aws sqs get-queue-attributes --queue-url <キューURL> \
--attribute-names ApproximateNumberOfMessages \
--query 'Attributes.ApproximateNumberOfMessages' \
--output text
アラームステータスの確認

アラームのステータスが「OK」であることを確認します。

aws cloudwatch describe-alarms \
--alarm-names <アラーム名> \
--query 'MetricAlarms[].StateValue' \
--output text

アラームアクションの有効・無効

有効にする場合

以下の通り無効(false)に変更します。

aws cloudwatch disable-alarm-actions --alarm-names <アラーム名>

アラームアクションの状態を以下の通り確認します。

aws cloudwatch describe-alarms --alarm-names <アラーム名> --query 'MetricAlarms[].ActionsEnabled' --output text
無効にする場合

以下の通り、有効(True)に変更します。

aws cloudwatch enable-alarm-actions --alarm-names <アラーム名>

後片付け関係のコマンド

一通りハンズオンが終了したら、を実行します。

CloudWatchアラームの削除
aws cloudwatch delete-alarms --alarm-names <アラーム名>

アラームが削除されたことを確認します。

aws cloudwatch describe-alarms --alarm-names <アラーム名> \
--query 'MetricAlarms[].AlarmName' \
--output text
SNSトピックの削除
aws sns delete-topic --topic-arn <削除対象トピックのARN>

トピックが削除されたことを確認します。

aws sns list-topics \
--query "Topics[?contains(TopicArn, <削除対象トピックのARN>)].TopicArn" \
--output text
SQSキューの破棄
aws sqs delete-queue --queue-url <削除対象キューURL>

キューが削除されたことを確認します。

aws sqs list-queues --queue-name-prefix <削除対象キュー名> \
--query "QueueUrls[?contains(@, <削除対象キュー名>]" \
--output text

最後に

今回もSNS、SQSともにコマンド操作を通して復習することができました。メインテーマのサービスだけでなく、過去のサービスも復習出来て、ハンズオンに参加するたびに学習内容の密度が増しているなぁと思いました。

今回のハンズオンの環境で行われたこと、コマンドの内容については復習を通して少し理解できるようになりましたが、まだ頭だけで理解しようとしているなという節があります。完全に理解するにはもう少し突っ込んで勉強する必要があるかなと思います。

公式ドキュメント類を読み込むことも大事ですが、何事も使ってみなければですね。そのためにも、AWS上にシステム構築してCloudWatchで監視する仕組みを作ってみたいと思います。自分で作れれば、運用の勉強だけでなく開発の勉強にもなって良い経験になると思います!考えて実践したいです!