ハンズオン(簡易版): CloudWatch基礎 カスタムメトリクス

1.1. スクリプトの作成 (handson-cli-cloudwatch.sh)

目的

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

パラメータの指定

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

0. リージョンの指定

リージョンを指定します。

環境変数の設定

export AWS_DEFAULT_REGION='ap-northeast-1'

1. スクリプト用ディレクトリ

スクリプト用ディレクトリを指定します。

変数の設定:

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

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

コマンド:

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

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

${HOME}/environment/script-handson-cli-cloudwatch

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

コマンド:

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

2. スクリプトファイル名

スクリプトファイル名を指定します。

変数の設定:

CODE_SCRIPT_NAME='handson-cli-cloudwatch.sh'

変数の設定:

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

結果(例):

${HOME}/environment/script-handson-cli-cloudwatch/handson-cli-cloudwatch.sh

3. CloudWatch名前空間

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

変数の設定:

CLOUDWATCH_NAMESPACE="handson-cli"

4. CloudWatchメトリクス名 (実行数)

CloudWatchメトリクス名(実行数)を指定します。

変数の設定:

CLOUDWATCH_METRIC_NAME_INVOCATIONS="Invocations"

5. CloudWatchメトリクス名 (エラー数)

CloudWatchメトリクス名(実行数)を指定します。

変数の設定:

CLOUDWATCH_METRIC_NAME_ERRORS="Errors"

6. CloudWatchディメンション名

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

変数の設定:

CLOUDWATCH_DIMENSION_NAME="AppName"

7. CloudWatchディメンション値

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

変数の設定:

CLOUDWATCH_DIMENSION_VALUE="handson-cli-cloudwatch"

8. CloudWatchユニット名

CloudWatchユニット名を指定します。

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

変数の設定:

CLOUDWATCH_METRIC_UNIT="Count"

9. データファイル(フルパス)

データファイル(フルパス)を指定します。

変数の設定:

FILE_DATA="${HOME}/environment/data-handson-cli-cloudwatch/handson-cli-cloudwatch.csv"

10. データファイルアーカイブ用ディレクトリのパス

データファイルアーカイブ用ディレクトリのパスを指定します。

変数の設定:

PATH_ARCHIVE="${HOME}/environment/archive-handson-cli-cloudwatch"

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

変数の確認:

cat << END

  # 0. AWS_DEFAULT_REGION:"ap-northeast-1"
       AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"

  # 1. DIR_CODE_SCRIPT:"${HOME}/environment/script-handson-cli-cloudwatch"
       DIR_CODE_SCRIPT="${DIR_CODE_SCRIPT}"
  # 2. FILE_CODE_SCRIPT:"${HOME}/environment/script-handson-cli-cloudwatch/handson-cli-cloudwatch.sh"
       FILE_CODE_SCRIPT="${FILE_CODE_SCRIPT}"
  # 3. CLOUDWATCH_NAMESPACE:"handson-cli'
       CLOUDWATCH_NAMESPACE='${CLOUDWATCH_NAMESPACE}'
  # 4. CLOUDWATCH_METRIC_NAME_INVOCATIONS:"Invocations'
       CLOUDWATCH_METRIC_NAME_INVOCATIONS='${CLOUDWATCH_METRIC_NAME_INVOCATIONS}'
  # 5. CLOUDWATCH_METRIC_NAME_ERRORS:"Errors'
       CLOUDWATCH_METRIC_NAME_ERRORS='${CLOUDWATCH_METRIC_NAME_ERRORS}'
  # 6. CLOUDWATCH_DIMENSION_NAME:"AppName'
       CLOUDWATCH_DIMENSION_NAME='${CLOUDWATCH_DIMENSION_NAME}'
  # 7. CLOUDWATCH_DIMENSION_VALUE:"handson-cli-cloudwatch'
       CLOUDWATCH_DIMENSION_VALUE='${CLOUDWATCH_DIMENSION_VALUE}'
  # 8. CLOUDWATCH_METRIC_UNIT:"Count'
       CLOUDWATCH_METRIC_UNIT='${CLOUDWATCH_METRIC_UNIT}'
  # 9. FILE_DATA="${HOME}/environment/data-handson-cli-cloudwatch/handson-cli-cloudwatch.csv"
       FILE_DATA="${FILE_DATA}"
  # 10. PATH_ARCHIVE="${HOME}/environment/archive-handson-cli-cloudwatch"
        PATH_ARCHIVE="${PATH_ARCHIVE}"

END

手順

スクリプトファイルを作成します。

変数の確認:

cat << ETX

   # AWS_DEFAULT_REGION="ap-northeast-1"
     AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION}"
   # FILE_CODE_SCRIPT="${HOME}/environment/script-handson-cli-cloudwatch/handson-cli-cloudwatch.sh"
     FILE_CODE_SCRIPT="${FILE_CODE_SCRIPT}"
   # FILE_DATA="${HOME}/environment/data-handson-cli-cloudwatch/handson-cli-cloudwatch.csv"
     FILE_DATA="${FILE_DATA}"
   # PATH_ARCHIVE="${HOME}/environment/archive-handson-cli-cloudwatch"
     PATH_ARCHIVE="${PATH_ARCHIVE}"
   # CLOUDWATCH_NAMESPACE:"handson-cli"
     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:"AppName"
     CLOUDWATCH_DIMENSION_NAME="${CLOUDWATCH_DIMENSION_NAME}"
   # CLOUDWATCH_DIMENSION_VALUE:"handson-cli-cloudwatch"
     CLOUDWATCH_DIMENSION_VALUE="${CLOUDWATCH_DIMENSION_VALUE}"
   # CLOUDWATCH_METRIC_UNIT:"Count"
     CLOUDWATCH_METRIC_UNIT="${CLOUDWATCH_METRIC_UNIT}"

ETX

コマンド:

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

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

set -u

readonly FILE_DATA="${FILE_DATA}"
readonly PATH_ARCHIVE="${PATH_ARCHIVE}"

readonly AWS_REGION='${AWS_DEFAULT_REGION}'
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_DIMENSION_VALUE='${CLOUDWATCH_DIMENSION_VALUE}'
readonly CLOUDWATCH_METRIC_UNIT='${CLOUDWATCH_METRIC_UNIT}'

if [ ! -e "\${FILE_DATA}" ]; then
  echo "Error: cannot access \${FILE_DATA}."
  exit
fi

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 \\
    --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 put-metric-data \\
    --region \${AWS_REGION} \\
    --namespace \${CLOUDWATCH_NAMESPACE} \\
    --metric-name \${CLOUDWATCH_METRIC_NAME_ERRORS} \\
    --dimensions \${CLOUDWATCH_DIMENSION_NAME}=\${CLOUDWATCH_DIMENSION_VALUE} \\
    --value \${errors} \\
    --unit \${CLOUDWATCH_METRIC_UNIT} \\
    --timestamp \${timestamp}
done < \${FILE_DATA}

result=\$?

if [ "\${result}x" != '0x' ]; then
  echo "Error: result code is \${result}."
  exit
fi

readonly DIR_ARCHIVE="\${PATH_ARCHIVE}/\$(date +%Y)/\$(date +%m)/\$(date +%d)"
if [ ! -d \${DIR_ARCHIVE} ]; then
  mkdir -p \${DIR_ARCHIVE}
fi

readonly FILE_ARCHIVE="\${DIR_ARCHIVE}/\$(date +%H%M%S).csv"
mv \${FILE_DATA} \${FILE_ARCHIVE}
EOF

cat ${FILE_CODE_SCRIPT}

結果(例):

#!/bin/sh

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

set -u

readonly FILE_DATA='${HOME}/environment/data-handson-cli-cloudwatch/handson-cli-cloudwatch.csv'
readonly PATH_ARCHIVE='${HOME}/environment/archive-handson-cli-cloudwatch'

readonly AWS_REGION='ap-northeast-1'
readonly CLOUDWATCH_NAMESPACE='handson-cli'
readonly CLOUDWATCH_METRIC_NAME_INVOCATIONS='Invocations'
readonly CLOUDWATCH_METRIC_NAME_ERRORS='Errors'
readonly CLOUDWATCH_DIMENSION_NAME='AppName'
readonly CLOUDWATCH_METRIC_UNIT='Count'

if [ ! -e "${FILE_DATA}" ]; then
  echo "Error: cannot access ${FILE_DATA}."
  exit
fi

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 \
    --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 put-metric-data \
    --region ${AWS_REGION} \
    --namespace ${CLOUDWATCH_NAMESPACE} \
    --metric-name ${CLOUDWATCH_METRIC_NAME_ERRORS} \
    --dimensions ${CLOUDWATCH_DIMENSION_NAME}=${CLOUDWATCH_DIMENSION_VALUE} \
    --value ${errors} \
    --unit ${CLOUDWATCH_METRIC_UNIT} \
    --timestamp ${timestamp}
done < ${FILE_DATA}

result=$?

if [ "${result}x" != '0x' ]; then
  echo "Error: result code is ${result}."
  exit
fi

readonly DIR_ARCHIVE="${PATH_ARCHIVE}/$(date +%Y)/$(date +%m)/$(date +%d)"
if [ ! -d ${DIR_ARCHIVE} ]; then
  mkdir -p ${DIR_ARCHIVE}
fi

readonly FILE_ARCHIVE="${DIR_ARCHIVE}/$(date +%H%M%S).csv"
mv ${FILE_DATA} ${FILE_ARCHIVE}

完了確認

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

コマンド:

ls ${FILE_CODE_SCRIPT}

結果(例):

${HOME}/environment/script-handson-cli-cloudwatch/handson-cli-cloudwatch.sh