4.1. CloudWatchアラームの作成 (カスタム: handson-cli-cloudwatch-custom-alarm)¶
作業の目的 [why]¶
カスタムメトリックについてCloudWatchアラーム"handson-cli-cloudwatch-custom-alarm"を作成します。
完了条件/事前条件 [設計者用情報]
完了条件 [after]
主処理は、以下を満たしたときに成功したものとします。
- 完了条件1
CloudWatchアラーム"handson-cli-cloudwatch-custom-alarm"が存在する。
事前条件 [before]
主処理の実施は、以下の状態であることを前提とします。
- 事前条件1
カスタムリソースが存在する。
- 事前条件2
SNSトピック"handson-cli-cloudwatch-custom-topic"が存在する。
作業対象 [what]¶
CloudWatchメトリック
標準時間(合計)¶
8分
パラメータ設定¶
- パラメータ設定の標準時間
2分
作業に必要なモノ・情報 [resource]¶
作業開始には、以下が全て揃っていることが必要です。
リソース1: CloudWatchアラーム名
作成するCloudWatchアラームの名称です。
今回は"handson-cli-cloudwatch-custom-alarm"とします。
リソース2: CloudWatchアラームの説明
作成するCloudWatchアラームの説明です。
今回は"Visible messages alarm for handson-cli-cloudwatch-custom"とします。
リソース3: CloudWatch名前空間
作成するCloudWatchアラームの対象となるメトリックの名前空間です。
今回は"HandsonCliApplication"とします。
リソース4: CloudWatchディメンション名
作成するCloudWatchアラームの対象となるメトリックのディメンション名です。
今回は"HandsonCliFunction"とします。
リソース5: カスタムリソース名
作成するCloudWatchアラームの対象となるカスタムリソースの名称です。
今回は"|CUSTOM_RESOURCE_NAME|"とします。
リソース6: CloudWatchメトリック名
作成するCloudWatchアラームの対象となるメトリック名です。
今回は"Invocations"とします。
リソース7: CloudWatchメトリック単位
作成するCloudWatchアラームの対象となるメトリックの単位です。
今回は"Count"とします。
リソース8: CloudWatchメトリック統計値
作成するCloudWatchアラームの対象となるメトリックの統計値です。
今回は"Average"とします。
リソース9: 監視周期
作成するCloudWatchアラームの監視周期です。
今回は"300"とします。
リソース10: 監視評価周期
作成するCloudWatchアラームの監視評価周期です。
今回は"1"とします。
リソース11: 比較演算子
作成するCloudWatchアラームの監視評価における比較演算子です。
今回は"GreaterThanOrEqualToThreshold"とします。
リソース12: 閾値
作成するCloudWatchアラームの監視評価における閾値です。
今回は"1"とします。
リソース13: SNSトピック名
CloudWatchアラームの発生時の通知先となるSNSトピックの名称です。
今回は"handson-cli-cloudwatch-custom-topic"とします。
パラメータの指定¶
作業に必要なパラメータを変数に格納をします。
0.1. CloudWatchアラーム名の指定¶
CloudWatchアラーム名を指定します。
変数の設定:
CLOUDWATCH_ALARM_NAME='handson-cli-cloudwatch-custom-alarm'
0.2. CloudWatchアラームの説明の指定¶
CloudWatchアラームの説明を指定します。
変数の設定:
CLOUDWATCH_ALARM_DESC="Visible messages alarm for handson-cli-cloudwatch-custom"
0.4. CloudWatchディメンション名の指定¶
CloudWatchディメンション名を指定します。
変数の設定:
CLOUDWATCH_DIMENSION_NAME="HandsonCliFunction"
0.13. SNSトピック名の指定¶
アラーム発生時の通知先SNSトピック名を指定します。
変数の設定:
SNS_TOPIC_NAME="handson-cli-cloudwatch-custom-topic"
パラメータの保存¶
設定されている変数の保存先となるファイル名を指定します。
変数の設定:
DIR_PARAMETER="${HOME}/tmp/parameter-handson-cli-cloudwatch-custom" FILE_PARAMETER="${DIR_PARAMETER}/$(date +%Y-%m-%d)-cloudwatch-alarm-create-expand-custom.env" \ && echo ${FILE_PARAMETER}
結果(例):
${HOME}/tmp/parameter-handson-cli-cloudwatch-custom/2020-03-02-cloudwatch-alarm-create-expand-custom.env
各変数に正しいパラメータ値が格納されていることを確認しながら保存します。
変数の確認:
cat << EOF > ${FILE_PARAMETER} # 0.0. AWS_DEFAULT_REGION:"ap-northeast-1" AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}" # 0.1. CLOUDWATCH_ALARM_NAME:"handson-cli-cloudwatch-custom-alarm" CLOUDWATCH_ALARM_NAME="${CLOUDWATCH_ALARM_NAME}" # 0.2. CLOUDWATCH_ALARM_DESC:"Visible messages alarm for handson-cli-cloudwatch-custom" CLOUDWATCH_ALARM_DESC="${CLOUDWATCH_ALARM_DESC}" # 0.3. CLOUDWATCH_NAMESPACE:"HandsonCliApplication" CLOUDWATCH_NAMESPACE="${CLOUDWATCH_NAMESPACE}" # 0.4. CLOUDWATCH_DIMENSION_NAME:"HandsonCliFunction" CLOUDWATCH_DIMENSION_NAME="${CLOUDWATCH_DIMENSION_NAME}" # 0.5. CUSTOM_RESOURCE_NAME:"|CUSTOM_RESOURCE_NAME|" CUSTOM_RESOURCE_NAME="${CUSTOM_RESOURCE_NAME}" # 0.6. CLOUDWATCH_METRIC_NAME:"Invocations" CLOUDWATCH_METRIC_NAME="${CLOUDWATCH_METRIC_NAME}" # 0.7. CLOUDWATCH_METRIC_UNIT:"Count" CLOUDWATCH_METRIC_UNIT="${CLOUDWATCH_METRIC_UNIT}" # 0.8. CLOUDWATCH_ALARM_STATISTIC:"Average" CLOUDWATCH_ALARM_STATISTIC="${CLOUDWATCH_ALARM_STATISTIC}" # 0.9. CLOUDWATCH_ALARM_PERIOD:"300" CLOUDWATCH_ALARM_PERIOD="${CLOUDWATCH_ALARM_PERIOD}" # 0.10. CLOUDWATCH_ALARM_EVALUATION_PERIOD:"1" CLOUDWATCH_ALARM_EVALUATION_PERIOD="${CLOUDWATCH_ALARM_EVALUATION_PERIOD}" # 0.11. CLOUDWATCH_ALARM_COMPARISON:"GreaterThanOrEqualToThreshold" CLOUDWATCH_ALARM_COMPARISON="${CLOUDWATCH_ALARM_COMPARISON}" # 0.12. CLOUDWATCH_ALARM_THRESHOLD:"1" CLOUDWATCH_ALARM_THRESHOLD="${CLOUDWATCH_ALARM_THRESHOLD}" # 0.13. SNS_TOPIC_NAME:"handson-cli-cloudwatch-custom-topic" SNS_TOPIC_NAME="${SNS_TOPIC_NAME}" EOF cat ${FILE_PARAMETER}
下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。
タスクの実施¶
課題
(未検証)
- タスク標準時間
6分
1. 前処理¶
1.1. 状態確認に必要な情報の取得¶
ディメンション文字列の生成
変数の設定:
STRING_CLOUDWATCH_DIMENSIONS="Name=${CLOUDWATCH_DIMENSION_NAME},Value=${SQS_QUEUE_NAME}" \ && echo ${STRING_CLOUDWATCH_DIMENSIONS}
結果(例):
Name=FunctionName,Value=HandsonCliFunction
1.2. 処理対象の状態確認¶
主処理の実施は、以下の状態であることを前提とします。
前提と異なることが判明した場合、直ちに処理を中止します。
事前条件1: カスタムリソースが存在する。
「カスタムリソースが存在する。」ことを確認します。
事前条件2: SNSトピック"handson-cli-cloudwatch-custom-topic"が存在する。
「SNSトピック"handson-cli-cloudwatch-custom-topic"が存在する。」ことを確認します。
コマンド:
aws sns list-topics \ --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \ --output text
結果(例):
arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-cloudwatch-custom-topic
事前条件3: CloudWatch名前空間"HandsonCliApplication"にディメンション名"HandsonCliFunction"、ディメンション値"|CUSTOM_RESOURCE_NAME|"のメトリック"Invocations"が存在する。
「CloudWatch名前空間"HandsonCliApplication"にディメンション名"HandsonCliFunction"、ディメンション値"|CUSTOM_RESOURCE_NAME|"のメトリック"Invocations"が存在する。」ことを確認します。
コマンド:
aws cloudwatch list-metrics \ --namespace ${CLOUDWATCH_NAMESPACE} \ --dimensions ${STRING_CLOUDWATCH_DIMENSIONS} \ --query "Metrics[?MetricName == \`${CLOUDWATCH_METRIC_NAME}\`].MetricName" \ --output text
結果(例):
Invocations
事前条件4: CloudWatchアラーム"handson-cli-cloudwatch-custom-alarm"が存在しない。
「CloudWatchアラーム"handson-cli-cloudwatch-custom-alarm"が存在しない。」ことを確認します。
コマンド:
aws cloudwatch describe-alarms \ --alarm-names ${CLOUDWATCH_ALARM_NAME} \ --query 'MetricAlarms[].AlarmName' \ --output text
結果(例):
(出力なし)
1.3. 主処理に必要な情報の取得¶
SNSトピックARNの取得
変数の設定:
SNS_TOPIC_ARN=$( \ aws sns list-topics \ --query "Topics[?contains(TopicArn, \`${SNS_TOPIC_NAME}\`)].TopicArn" \ --output text \ ) \ && echo ${SNS_TOPIC_ARN}
結果(例):
arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-cloudwatch-custom-topic
アクション配列の生成
変数の設定:
ARRAY_CLOUDWATCH_ALARM_ACTIONS="${SNS_TOPIC_ARN}" \ && echo ${ARRAY_CLOUDWATCH_ALARM_ACTIONS}
結果(例):
arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-cloudwatch-custom-topic
2. 主処理¶
CloudWatchアラームの作成¶
変数の確認:
cat << ETX # CLOUDWATCH_ALARM_NAME:"handson-cli-cloudwatch-custom-alarm" CLOUDWATCH_ALARM_NAME="${CLOUDWATCH_ALARM_NAME}" # CLOUDWATCH_ALARM_DESC:"Visible messages alarm for handson-cli-cloudwatch-custom" CLOUDWATCH_ALARM_DESC="${CLOUDWATCH_ALARM_DESC}" # CLOUDWATCH_NAMESPACE:"HandsonCliApplication" CLOUDWATCH_NAMESPACE="${CLOUDWATCH_NAMESPACE}" # STRING_CLOUDWATCH_DIMENSIONS:"Name=FunctionName,Value=HandsonCliFunction" STRING_CLOUDWATCH_DIMENSIONS="${STRING_CLOUDWATCH_DIMENSIONS}" # CLOUDWATCH_METRIC_NAME:"Invocations" CLOUDWATCH_METRIC_NAME="${CLOUDWATCH_METRIC_NAME}" # CLOUDWATCH_METRIC_UNIT:"Count" CLOUDWATCH_METRIC_UNIT="${CLOUDWATCH_METRIC_UNIT}" # CLOUDWATCH_ALARM_STATISTIC:"Average" CLOUDWATCH_ALARM_STATISTIC="${CLOUDWATCH_ALARM_STATISTIC}" # CLOUDWATCH_ALARM_PERIOD:"300" CLOUDWATCH_ALARM_PERIOD="${CLOUDWATCH_ALARM_PERIOD}" # CLOUDWATCH_ALARM_EVALUATION_PERIOD:"1" CLOUDWATCH_ALARM_EVALUATION_PERIOD="${CLOUDWATCH_ALARM_EVALUATION_PERIOD}" # CLOUDWATCH_ALARM_COMPARISON:"GreaterThanOrEqualToThreshold" CLOUDWATCH_ALARM_COMPARISON="${CLOUDWATCH_ALARM_COMPARISON}" # CLOUDWATCH_ALARM_THRESHOLD:"1" CLOUDWATCH_ALARM_THRESHOLD="${CLOUDWATCH_ALARM_THRESHOLD}" # ARRAY_CLOUDWATCH_ALARM_ACTIONS:"arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:handson-cli-cloudwatch-custom-topic" ARRAY_CLOUDWATCH_ALARM_ACTIONS="${ARRAY_CLOUDWATCH_ALARM_ACTIONS}" ETX
コマンド:
aws cloudwatch put-metric-alarm \ --alarm-name ${CLOUDWATCH_ALARM_NAME} \ --alarm-description "${CLOUDWATCH_ALARM_DESC}" \ --namespace ${CLOUDWATCH_NAMESPACE} \ --dimensions ${STRING_CLOUDWATCH_DIMENSIONS} \ --metric-name ${CLOUDWATCH_METRIC_NAME} \ --unit ${CLOUDWATCH_METRIC_UNIT} \ --statistic ${CLOUDWATCH_ALARM_STATISTIC} \ --period ${CLOUDWATCH_ALARM_PERIOD} \ --evaluation-periods ${CLOUDWATCH_ALARM_EVALUATION_PERIOD} \ --comparison-operator ${CLOUDWATCH_ALARM_COMPARISON} \ --threshold ${CLOUDWATCH_ALARM_THRESHOLD} \ --alarm-actions ${ARRAY_CLOUDWATCH_ALARM_ACTIONS}
結果(例):
(出力なし)
3. 後処理¶
完了条件の確認¶
主処理は、以下を満たしたときに成功したものとします。
完了条件1: CloudWatchアラーム"handson-cli-cloudwatch-custom-alarm"が存在する。
「CloudWatchアラーム"handson-cli-cloudwatch-custom-alarm"が存在する。」ことを確認します。
コマンド:
aws cloudwatch describe-alarms \ --alarm-names ${CLOUDWATCH_ALARM_NAME} \ --query 'MetricAlarms[].AlarmName' \ --output text
結果(例):
handson-cli-cloudwatch-custom-alarm