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.0. リージョンの指定

変数の設定

export AWS_DEFAULT_REGION='ap-northeast-1'

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.3. CloudWatch名前空間の指定

CloudWatch名前空間を指定します。

変数の設定:

CLOUDWATCH_NAMESPACE="HandsonCliApplication"

0.4. CloudWatchディメンション名の指定

CloudWatchディメンション名を指定します。

変数の設定:

CLOUDWATCH_DIMENSION_NAME="HandsonCliFunction"

0.5. カスタムリソース名の指定

カスタムリソース名を指定します。

変数の設定:

CUSTOM_RESOURCE_NAME="|CUSTOM_RESOURCE_NAME|"

0.6. CloudWatchメトリック名の指定

CloudWatchメトリック名を指定します。

変数の設定:

CLOUDWATCH_METRIC_NAME="Invocations"

0.7. CloudWatchメトリック単位の指定

CloudWatchメトリック単位を指定します。

変数の設定:

CLOUDWATCH_METRIC_UNIT="Count"

0.8. CloudWatchメトリック統計値の指定

CloudWatchメトリック統計値を指定します。

変数の設定:

CLOUDWATCH_ALARM_STATISTIC="Average"

0.9. 監視周期の指定

監視周期を指定します。

変数の設定:

CLOUDWATCH_ALARM_PERIOD="300"

0.10. 監視評価周期

監視評価周期名を指定します。

変数の設定:

CLOUDWATCH_ALARM_EVALUATION_PERIOD="1"

0.11. 比較演算子

比較演算子を指定します。

変数の設定:

CLOUDWATCH_ALARM_COMPARISON="GreaterThanOrEqualToThreshold"

0.12. 閾値の指定

閾値を指定します。

変数の設定:

CLOUDWATCH_ALARM_THRESHOLD="1"

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

完了