1.1. スクリプトの作成 (cloudwatch-sample-app.sh)

作業の目的 [why]

スクリプト名"cloudwatch-sample-app.sh"を作成します。

完了条件/事前条件 [設計者用情報]

完了条件 [after]

主処理は、以下を満たしたときに成功したものとします。

完了条件1

スクリプトファイル名"${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh"が存在する。

事前条件 [before]

主処理の実施は、以下の状態であることを前提とします。

事前条件1

スクリプト用ディレクトリ"${HOME}/environment/conf-handson-cli-cloudwatch-custom"が存在する。

事前条件2

スクリプトファイル名"${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh"が存在しない。

作業対象 [what]

  • スクリプト

標準時間(合計)

8分

パラメータ設定

パラメータ設定の標準時間

2分

作業に必要なモノ・情報 [resource]

作業開始には、以下が全て揃っていることが必要です。

リソース1: スクリプト用ディレクトリ

  • 今回は"${HOME}/environment/conf-handson-cli-cloudwatch-custom"をスクリプト用ディレクトリとします。

ディレクトリが存在することを確認します。

コマンド:

ls -d ${HOME}/environment/conf-handson-cli-cloudwatch-custom

結果(例:存在する場合):

${HOME}/environment/conf-handson-cli-cloudwatch-custom

存在しない場合は作成します。

コマンド:

mkdir -p ${HOME}/environment/conf-handson-cli-cloudwatch-custom

リソース2: スクリプトファイル名

  • 作成するスクリプトのファイル名です。

  • 今回は"${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh"とします。

リソース3: CloudWatch名前空間

  • 確認するCloudWatchメトリックの名前空間です。

  • 今回は"HandsonCliApplication"とします。

リソース4: CloudWatchメトリック名 (実行数)

  • CloudWatchメトリック名です。

  • 今回は"Invocations"とします。

リソース5: CloudWatchメトリック名 (エラー数)

  • CloudWatchメトリック名です。

  • 今回は"Errors"とします。

リソース6: CloudWatchディメンション名

  • CloudWatchメトリックの対象となるディメンション名です。

  • 今回は"HandsonCliFunction"とします。

リソース7: CloudWatchメトリック単位

  • CloudWatchメトリックの単位です。

  • 今回は"Count"とします。

パラメータの指定

作業に必要なパラメータを変数に格納をします。

0.1. スクリプト用ディレクトリの指定

変数の設定:

DIR_CODE_SCRIPT="${HOME}/environment/conf-handson-cli-cloudwatch-custom"

0.2. スクリプトファイル名の指定

スクリプトの名称を指定します。

変数の設定:

CODE_SCRIPT_NAME='cloudwatch-sample-app.sh'

変数の設定:

FILE_CODE_SCRIPT="${DIR_CODE_SCRIPT}/${CODE_SCRIPT_NAME}" \
  && echo ${FILE_CODE_SCRIPT}

結果(例):

${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh

0.3. CloudWatch名前空間の指定

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

変数の設定:

CLOUDWATCH_NAMESPACE="HandsonCliApplication"

0.4. CloudWatchメトリック名の指定 (実行数)

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

変数の設定:

CLOUDWATCH_METRIC_NAME_INVOCATIONS="Invocations"

0.5. CloudWatchメトリック名の指定 (エラー数)

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

変数の設定:

CLOUDWATCH_METRIC_NAME_ERRORS="Errors"

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

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

変数の設定:

CLOUDWATCH_DIMENSION_NAME="HandsonCliFunction"

0.7. CloudWatchユニット名の指定

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

変数の設定:

CLOUDWATCH_METRIC_UNIT="Count"

パラメータの保存

設定されている変数の保存先となるファイル名を指定します。

変数の設定:

DIR_PARAMETER="${HOME}/tmp/parameter-handson-cli-cloudwatch-custom"
FILE_PARAMETER="${DIR_PARAMETER}/$(date +%Y-%m-%d)-code_script-cloudwatch_custom_metrics-create.env" \
  && echo ${FILE_PARAMETER}

結果(例):

${HOME}/tmp/parameter-handson-cli-cloudwatch-custom/2020-03-02-code_script-cloudwatch_custom_metrics-create.env

各変数に正しいパラメータ値が格納されていることを確認しながら保存します。

変数の確認:

cat << EOF > ${FILE_PARAMETER}

  # 0.1. DIR_CODE_SCRIPT:"${HOME}/environment/conf-handson-cli-cloudwatch-custom"
         DIR_CODE_SCRIPT="${DIR_CODE_SCRIPT}"
  # 0.2. FILE_CODE_SCRIPT:"${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh"
         FILE_CODE_SCRIPT="${FILE_CODE_SCRIPT}"
  # 0.3. CLOUDWATCH_NAMESPACE:"HandsonCliApplication'
         CLOUDWATCH_NAMESPACE='${CLOUDWATCH_NAMESPACE}'
  # 0.4. CLOUDWATCH_METRIC_NAME_INVOCATIONS:"Invocations'
         CLOUDWATCH_METRIC_NAME_INVOCATIONS='${CLOUDWATCH_METRIC_NAME_INVOCATIONS}'
  # 0.5. CLOUDWATCH_METRIC_NAME_ERRORS:"Errors'
         CLOUDWATCH_METRIC_NAME_ERRORS='${CLOUDWATCH_METRIC_NAME_ERRORS}'
  # 0.6. CLOUDWATCH_DIMENSION_NAME:"HandsonCliFunction'
         CLOUDWATCH_DIMENSION_NAME='${CLOUDWATCH_DIMENSION_NAME}'
  # 0.7. CLOUDWATCH_METRIC_UNIT:"Count'
         CLOUDWATCH_METRIC_UNIT='${CLOUDWATCH_METRIC_UNIT}'

EOF

cat ${FILE_PARAMETER}

下段の変数が入っていない、もしくは上段と同等の値が入っていない場合は、それぞれの手順番号に戻って変数の設定を行います。

タスクの実施

課題

(未検証)

タスク標準時間

6分

1. 前処理

処理対象の状態確認

主処理の実施は、以下の状態であることを前提とします。

前提と異なることが判明した場合、直ちに処理を中止します。

事前条件1: スクリプト用ディレクトリ"${HOME}/environment/conf-handson-cli-cloudwatch-custom"が存在する。

「スクリプト用ディレクトリ"${HOME}/environment/conf-handson-cli-cloudwatch-custom"が存在する。」ことを確認します。

コマンド:

ls -d ${DIR_CODE_SCRIPT}

結果(例):

${HOME}/environment/conf-handson-cli-cloudwatch-custom

事前条件2: スクリプトファイル名"${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh"が存在しない。

「スクリプトファイル名"${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh"が存在しない。」ことを確認します。

コマンド:

! ls ${FILE_CODE_SCRIPT}

結果(例):

ls: cannot access ${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh: No such file or directory

2. 主処理

スクリプトファイルの作成

変数の確認:

cat << ETX

   # FILE_CODE_SCRIPT="${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh"
     FILE_CODE_SCRIPT="${FILE_CODE_SCRIPT}"
   # CLOUDWATCH_NAMESPACE:"HandsonCliApplication"
     CLOUDWATCH_NAMESPACE="${CLOUDWATCH_NAMESPACE}"
   # CLOUDWATCH_METRIC_NAME_INVOCATIONS:"Invocations"
     CLOUDWATCH_METRIC_NAME_INVOCATIONS="${CLOUDWATCH_METRIC_NAME_INVOCATIONS}"
   # CLOUDWATCH_METRIC_NAME_ERRORS:"Errors"
     CLOUDWATCH_METRIC_NAME_ERRORS="${CLOUDWATCH_METRIC_NAME_ERRORS}"
   # CLOUDWATCH_DIMENSION_NAME:"HandsonCliFunction"
     CLOUDWATCH_DIMENSION_NAME="${CLOUDWATCH_DIMENSION_NAME}"
   # CLOUDWATCH_METRIC_UNIT:"Count"
     CLOUDWATCH_METRIC_UNIT="${CLOUDWATCH_METRIC_UNIT}"

ETX

コマンド:

cat << EOF > ${FILE_CODE_SCRIPT}
#!/bin/sh

# 実行の前提: CloudWatch:PutMetricDataアクション権限のある
#             インスタンスプロファイルが付与されているEC2インスタンス

if [ ! "\$1" ]; then
  echo "Usage: \$0 csv_file"
  exit
fi

set -u

readonly FILE_DATA="\$1"
readonly export AWS_DEFAULT_REGION='ap-northeast-1'
readonly CLOUDWATCH_NAMESPACE='${CLOUDWATCH_NAMESPACE}'
readonly CLOUDWATCH_METRIC_NAME_INVOCATIONS='${CLOUDWATCH_METRIC_NAME_INVOCATIONS}'
readonly CLOUDWATCH_METRIC_NAME_ERRORS='${CLOUDWATCH_METRIC_NAME_ERRORS}'
readonly CLOUDWATCH_DIMENSION_NAME='${CLOUDWATCH_DIMENSION_NAME}'
readonly CLOUDWATCH_METRIC_UNIT='${CLOUDWATCH_METRIC_UNIT}'

while read line; do
  timestamp=\$(echo \$line | cut -d "," -f 1)
  invocations=\$(echo \$line | cut -d "," -f 2)
  errors=\$(echo \$line | cut -d "," -f 3)

  aws cloudwatch put-metric-data \\
    --namespace \${CLOUDWATCH_NAMESPACE} \\
    --metric-name \${CLOUDWATCH_METRIC_NAME_INVOCATIONS} \\
    --dimensions FunctionName=\${CLOUDWATCH_DIMENSION_NAME} \\
    --value \${invocations} \\
    --unit \${CLOUDWATCH_METRIC_UNIT} \\
    --timestamp \${timestamp}

  aws cloudwatch put-metric-data \\
    --namespace \${CLOUDWATCH_NAMESPACE} \\
    --metric-name \${CLOUDWATCH_METRIC_NAME_ERRORS} \\
    --dimensions FunctionName=\${CLOUDWATCH_DIMENSION_NAME} \\
    --value \${errors} \\
    --unit \${CLOUDWATCH_METRIC_UNIT} \\
    --timestamp \${timestamp}

done < \${FILE_DATA}
EOF

cat ${FILE_CODE_SCRIPT}

結果(例):

#!/bin/sh

# 実行の前提: CloudWatch:PutMetricDataアクション権限のある
#             インスタンスプロファイルが付与されているEC2インスタンス

if [ ! "$1" ]; then
  echo "Usage: $0 csv_file"
  exit
fi

set -u

readonly FILE_DATA="$1"
readonly export AWS_DEFAULT_REGION='ap-northeast-1'
readonly CLOUDWATCH_NAMESPACE='HandsonCliApplication'
readonly CLOUDWATCH_METRIC_NAME_INVOCATIONS='Invocations'
readonly CLOUDWATCH_METRIC_NAME_ERRORS='Errors'
readonly CLOUDWATCH_DIMENSION_NAME='HandsonCliFunction'
readonly CLOUDWATCH_METRIC_UNIT='Count'

while read line; do
  timestamp=$(echo $line | cut -d "," -f 1)
  invocations=$(echo $line | cut -d "," -f 2)
  errors=$(echo $line | cut -d "," -f 3)

  echo "aws cloudwatch put-metric-data \
    --namespace ${CLOUDWATCH_NAMESPACE} \
    --metric-name ${CLOUDWATCH_METRIC_NAME_INVOCATIONS} \
    --dimensions FunctionName=${CLOUDWATCH_DIMENSION_NAME} \
    --value ${invocations} \
    --unit ${CLOUDWATCH_METRIC_UNIT} \
    --timestamp ${timestamp}"

  echo "aws cloudwatch put-metric-data \
    --namespace ${CLOUDWATCH_NAMESPACE} \
    --metric-name ${CLOUDWATCH_METRIC_NAME_ERRORS} \
    --dimensions FunctionName=${CLOUDWATCH_DIMENSION_NAME} \
    --value ${errors} \
    --unit ${CLOUDWATCH_METRIC_UNIT} \
    --timestamp ${timestamp}"

done < ${FILE_DATA}

3. 後処理

完了条件の確認

主処理は、以下を満たしたときに成功したものとします。

完了条件1: スクリプトファイル名"${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh"が存在する。

「スクリプトファイル名"${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh"が存在する。」ことを確認します。

コマンド:

ls ${FILE_CODE_SCRIPT}

結果(例):

${HOME}/environment/conf-handson-cli-cloudwatch-custom/cloudwatch-sample-app.sh

完了