SCL テンプレート

2021/08/17 19:10 OS別::Linuxその他::シェル

シェルスクリプトテンプレート

シェルコマンド言語は、インタープリタの性質上、実行速度の面で不利です。
そのため、大規模なアプリとしての実装には向きません。

しかし、ログ出力といった最低限の機能は作るほうが、メンテナンス等で楽になります。
ここでは、シェルコマンド言語を利用する場合のテンプレートを公開しています。いずれもライセンスは 3条項BSDライセンス としていますので、自由に改変してください。
また、日本語を含むため UTF-8 で保存しています。日本語行を削除した場合は、エディタの実装によって ASCII や Shift JIS として処理されます。

テンプレート A (標準構成)

ひとつのファイルですべてを完結する、標準的なテンプレートです。

そのまま利用する場合は /var/log/script ディレクトリを事前に作成してください。
スクリプトの格納場所は指定しません。
利用時には Timing の Anytime か Cron どちらかを消してください。他にも不都合がある部分は修正してください。

ファイルは こちら からダウンロードできます。
template_a_20210807.zip

もしくは、下記をコピペしてください。文字コードを UTF8 にすることをお勧めします。
template_a.sh
#!/bin/bash
######################################################################
#
# Script name : template_a.sh
# Usage       : template_A.sh [-h] [-v]
# Update      : 2021.8.7   / Kazuya Jimba
#               yyyy.mm.dd / Name
# Timing      : Anytime
# Timing      : Cron (* * * * *)
#
#                 オリジナル配布元 http://ttm.jimba.ddo.jp/
#                 改変は自由ですが、改変者の責任に基づくものとします。
######################################################################

### Parameter and Bariable ###########################################
## Directory
pLogDir="/var/log/script"

## File
pLogFile="$(basename $0 .sh).log"

## Path
pLogPath="${pLogDir}/${pLogFile}"

## etc
pVersion="20210807.01"

## Numbers
nReportDay=0
nRV=0

## Flag

# Script log
# 0 - Script log
# 1 - Standard output
# 2 - Standard error output
# 3 - /var/log/messages
fLogOutput=0

### Function #########################################################
fnLog() {
  case ${fLogOutput} in
     0 ) echo "$(date '+%Y/%m/%d %H:%M:%S') $*" >> ${pLogFile};;
     1 ) echo "$*";;
     2 ) echo "$*" >&2;;
     3 ) /usr/bin/logger -t ${0##*/} "$*";;
  esac
}

fnErr() {
  echo "$*" >&2
  fnLog "Error: $*"
}

fnEnd() {
  case ${1} in
     0 ) fnLog "Normal end.";;
    11 ) fnErr "Read permission not exist (${2})";;
    12 ) fnErr "Write permission not exist (${2})";;
    13 ) fnErr "Exec permission not exist (${2})";;
    14 ) fnErr "Directory not exist (${2})";;
    15 ) fnErr "File not exist (${2})";;
     * ) fnErr "Unknown error (${2})";;
  esac
  exit ${1}
}

### Main #############################################################

# Environment check
fnLog "Script start (${0##*/})"
[ -d "${pLogDir}" ] || fnEnd 14 "${pLogDir}"
[ -f "${pLogPath}" ] || fnEnd 15 "${pLogPath}"

# Argument analyse
while getopts vh tOpt; do
  case ${tOpt} in
    h )
      fnLog "Option: Help message."
      echo "${0##*/} [-h] [-v]"
      echo "  [-v]              Version print."
      echo ""
      fnEnd 0
      ;;
    v )
      fnLog "Option: Version print."
      echo "Script version: ${pVersion}"
      echo ""
      fnEnd 0
      ;;
  esac
done

# xxxxx


### End ##############################################################
# report
nReportDay=$(( $(date -u +'%d' --date="@${SECONDS}") - 1 ))
fnLog "Exec Time: ${nReportDay} day $( date -u +'%H:%M:%S' --date=@${SECONDS} )"

# end
fnEnd ${nRV}

######################################################################

テンプレート B (Source あり)

source コマンド . で変数および関数を外部ファイルにした、中規模~大規模向けのテンプレートです。

デフォルトでは、スクリプトの格納場所を /usr/local/script で想定しています。
そのまま利用する場合は /usr/local/ ディレクトリにファイルを置いて、unzip コマンドで解凍してください。
ファイルは、次の構成になっています。
./script/
./script/template_b.sh
./script/conf/
./script/conf/common.cnf
./script/conf/template_b.cnf
./script/log/
./script/tmp/
展開後は、各ディレクトリ、各ファイルの権限を適切に変更してください。

利用時には Timing の Anytime か Cron どちらかを消してください。他にも不都合がある部分は修正してください。

ファイルは こちら からダウンロードできます。
template_b_20210808.zip

もしくは、下記をコピペしてください。文字コードは UTF8 をお勧めします。
template_b.sh
個別に作るスクリプトのテンプレートです。
コピーして使います。
#!/bin/bash
######################################################################
#
# Script name : template_b.sh
# Usage       : template_b.sh [-h] [-v]
# Update      : 2021.8.8   / Kazuya Jimba
#               yyyy.mm.dd / Name
# Timing      : Anytime
# Timing      : Cron (* * * * *)
#
#                 オリジナル配布元 http://ttm.jimba.ddo.jp/
#                 改変は自由ですが、改変者の責任に基づくものとします。
######################################################################

### Parameter and Bariable ###########################################
# common.cnf
if [ -f conf/common.cnf ];then
  . conf/common.cnf
else
  echo "Not exist conf/common.cnf"
  exit 1
fi

# template_b.cnf
[ -f conf/template_b.cnf ] || fnErrEnd 11 "conf/template_b.cnf"
. conf/template_b.cnf

### Main #############################################################

# Environment check
fnLog "Script start (${0##*/})"
[ -d "${pConfDir}" ] || fnErrEnd 14 "${pConfDir}"
[ -d "${pLogDir}" ]  || fnErrEnd 14 "${pLogDir}"
[ -d "${pTmpDir}" ]  || fnErrEnd 14 "${pTmpDir}"

# Argument analyse
while getopts vh tOpt; do
  case ${tOpt} in
    h )
      fnLog "Option: Help message."
      echo "${0##*/} [-h] [-v]"
      echo "  [-v]              Version print."
      echo ""
      fnEnd ${nRV}
      ;;
    v )
      fnLog "Option: Version print."
      echo "Script version: ${pVersion}"
      echo ""
      fnEnd ${nRV}
      ;;
  esac
done

# xxxxx


### End ##############################################################
# report
nReportDay=$(( $(date -u +'%d' --date="@${SECONDS}") - 1 ))
fnLog "Exec Time: ${nReportDay} day $( date -u +'%H:%M:%S' --date=@${SECONDS} )"

# end
fnEnd ${nRV}

######################################################################

common.cnf
スクリプト共通の設定ファイルです。
作成するスクリプトで追加したい共通機能があれば、こちらに追記します。

利用したい環境に応じて、各設定を変更してください。
######################################################################
#
# Script name : common.cnf
# Usage       : . ./common.sh
# Update      : 2021.8.7   / Kazuya Jimba
#               yyyy.mm.dd / Name
# Timing      : Anytime
#
#                 オリジナル配布元 http://ttm.jimba.ddo.jp/
#                 改変は自由ですが、改変者の責任に基づくものとします。
######################################################################

### Parameter and Bariable ###########################################
## Directory
pBaseDir="/usr/local/script"
pConfDir="${pBaseDir}/conf"
pLogDir="${pBaseDir}/log"
pTmpDir="${pBaseDir}/tmp"

## File
pLogFile="$(basename $0 .sh).log"

## Path
pLogPath="${pLogDir}/${pLogFile}"

## etc

## Numbers
nReportDay=0
nRV=0

## Flag

# Log Severity level
# NAME     Lv   Message content
# EMERG     0   System is unusable
# ALERT     1   Should be corrected immediately
# CRIT      2   Critical conditions
# ERR       3   Error conditions
# WARNING   4   May indicate that an error will occur if action is not taken.
# NOTICE    5   Events that are unusual, but not error conditions.
# INFO      6   Normal operational messages that require no action.
# DEBUG     7   Information useful to developers for debugging the application.
pLogNotifyLv=5

# Log output
# 0 - Script log
# 1 - Standard output
# 2 - Standard error output
# 3 - /var/log/messages
fLogOutput=0

# ログ管理 0=通知する
fEnLog=0
fEnLogEmerg=0
fEnLogAlert=0
fEnLogCrit=0
fEnLogErr=0
fEnLogWarn=0
fEnLogNotice=0
fEnLogInfo=0
fEnLogDebug=0

### Function #########################################################
fnLog() {
  case ${fLogOutput} in
     0 ) echo "$(date '+%Y/%m/%d %H:%M:%S') $*" >> ${pLogPath};;
     1 ) echo "$*";;
     2 ) echo "$*" >&2;;
     3 ) /usr/bin/logger -t ${0##*/} "$*";;
  esac
}

fnEmerg() {
  echo "$*" >&2
  [ "${fEnLogEmerg}" -eq "0" ] && fnLog "[Emergency] $*"
}

fnAlert() {
  if [ "${pLogNotifyLv}" -ge "1" ]; then
    echo "$*" >&2
    [ "${fEnLogAlert}" -eq "0" ] && fnLog "[Alert] $*"
  fi
}

fnCrit() {
  if [ "${pLogNotifyLv}" -ge "2" ]; then
    echo "$*" >&2
    [ "${fEnLogCrit}" -eq "0" ] && fnLog "[Critical] $*"
  fi
}

fnErr() {
  if [ "${pLogNotifyLv}" -ge "3" ]; then
    echo "$*" >&2
    [ "${fEnLogErr}" -eq "0" ] && fnLog "[Err] $*"
  fi
}

fnWarn() {
  if [ "${pLogNotifyLv}" -ge "4" ]; then
    [ "${fEnLogWarn}" -eq "0" ] && fnLog "[Warn] $*"
  fi
}

fnNotice() {
  if [ "${pLogNotifyLv}" -ge "5" ]; then
    [ "${fEnLogNotice}" -eq "0" ] && fnLog "[Notice] $*"
  fi
}

fnInfo() {
  if [ "${pLogNotifyLv}" -ge "6" ]; then
    [ "${fEnLogInfo}" -eq "0" ] && fnLog "[Info] $*"
  fi
}

fnDebug() {
  if [ "${pLogNotifyLv}" -ge "7" ]; then
    [ "${fEnLogDebug}" -eq "0" ] && fnLog "[Debug] $*"
  fi
}

fnParam() {
  fnDebug '[Param] $'"$1 = $2"
}

fnErrEnd() {
  # common.cnf を利用するスクリプト共通のエラー番号
  caseValue=$1

  case ${caseValue} in
     0) fnWarn "Normal number input...";;
     1) fnErr "Read Permission error ($2)";;
     2) fnErr "Write Permission error ($2)";;
     3) fnErr "Exec Permission error ($2)";;
    10) fnErr "Directory not exist error ($2)";;
    11) fnErr "File not exist error ($2)";;
     *) fnErr "Unknown error (${caseValue})";;
  esac
  exit ${caseValue}
}

######################################################################

template_b.sh
スクリプト個別の設定ファイルです。
必要の都度、コピーして使います。
######################################################################
#
# Script name : template.cnf
# Usage       : [template.sh] . conf/template.cnf
# Update      : 2021.8.7   / Kazuya Jimba
#               yyyy.mm.dd / Name
# Timing      : Anytime
#
#                 オリジナル配布元 http://ttm.jimba.ddo.jp/
#                 改変は自由ですが、改変者の責任に基づくものとします。
######################################################################

### Parameter and Bariable ###########################################
## Directory

## File

## Path

## etc
pVersion="20210807.01"

## Numbers

## Flag

# Log Severity level
# NAME     Lv   Message content
# EMERG     0   System is unusable
# ALERT     1   Should be corrected immediately
# CRIT      2   Critical conditions
# ERR       3   Error conditions
# WARNING   4   May indicate that an error will occur if action is not taken.
# NOTICE    5   Events that are unusual, but not error conditions.
# INFO      6   Normal operational messages that require no action.
# DEBUG     7   Information useful to developers for debugging the application.
pLogNotifyLv=5

# Log output
# 0 - Script log
# 1 - Standard output
# 2 - Standard error output
# 3 - /var/log/messages
fLogOutput=0

# ログ管理 0=通知する
fEnLog=0
fEnLogEmerg=0
fEnLogAlert=0
fEnLogCrit=0
fEnLogErr=0
fEnLogWarn=0
fEnLogNotice=0
fEnLogInfo=0
fEnLogDebug=0

### Function #########################################################
fnEnd() {
  # template.sh で利用するエラー番号
  case ${1} in
     0 ) fnLog "Normal end.";;
     * ) fnErr "Unknown error (${2})";;
  esac
  fnLog "Script end (${0##*/})"
  exit ${1}
}

######################################################################

コーディング規約案

2021/07/24 09:06 OS別::Linuxその他::シェル

シェルコマンド言語 コーディング規約案

いろいろな考え方があり、それぞれのプロジェクトで最適解が異なります。
規約のたたき台として、まずは作成しました。
参考の一助になれば幸いです。
ここでは、自分が使いやすい規約にしてみました。
臨機応変に変更してください。

Google Shell guide といったものも存在します。
https://google.github.io/styleguide/shellguide.html


プロジェクトにおけるシェルコマンド言語を利用したスクリプトは、視認性やメンテナンス性の向上を目的として、次の規約に則り作成すること。

汎用性の考慮

UNIX として共通の仕様である POSIX に規定された範囲でのコーディングとし、独自拡張は極力利用しないこと。

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

また、必要があって利用する場合は、ヘッダに注意事項として記載すること。
[Tips]
たとえば、Linux の for 文で C 言語のような ( i=0 ; i < x ; i++ ) という形式を利用できます。これは便利なのですが bash の独自実装なので汎用性が下がります。

スクリプト

スクリプトは、次の要件を満たすこと。

ファイル名
ファイル名は、英数字 + 拡張子とする。
拡張子
拡張子は、シェルスクリプト単体で実行するものを .sh とする。
また、変数や関数を別途まとめたファイルについては .src とする。
[Tips]
csh / tcsh / fish / bash / dash といった、シェルを複数利用するようなプロジェクトでは、拡張子をそれぞれに合わせた方が良いと思います。
bash しか利用しないことが分かっている環境で、シバンにも bash 指定のみの場合は .sh でも不都合はないと思います。

.src は、内容として bash なのですが source コマンド (ビルトインでは . コマンド) で呼ぶことを意図しています。
実行権限
実行権限は、システムとして特に指定のない限り 610 とする。
[Tips]
権限を 755 や 700 で運用することは多いのですが、セキュリティを考慮すると、権限は最小限にすべきでしょう。
ここでは本番環境を想定していて、作成するユーザと、実行するユーザが異なることを考慮しています。
所有者は、更新できるが実行できない。前提条件を満たさない、不用意な実行を阻止できる。
グループ(実行者)は、更新できないが実行できる。JP1 のような自動実行ユーザのスクリプト改変を阻止できる。

ファイル内容

構成
スクリプトは、次の構成を基本とする。
段落内容備考
ヘッダシバンやスクリプトの目的などを記載する。
変数宣言スクリプトが利用する変数を宣言もしくは指定する。source (.) での指定も可
関数宣言スクリプトが利用する関数を宣言する。source (.) での指定も可
メイン処理スクリプトが目的とする処理を行う。
終了処理一時利用のために展開していたテンポラリファイルの削除などを行う。

文字コード
文字コードは UTF-8 とする。
また、BOM は付与しないこと。
日本語はコメントに限定する。
[Tips]
コメントに日本語を使わない場合は ASCII を指定してもよいです。
むしろ ASCII として認識されるでしょう。
改行コード
改行コードは LF とする。
[Tips]
Windows でスクリプトを書くと、改行コードは考慮から漏れがちです。
Linux や UNIX 上で書くと気にしなくても良いのですが、プロジェクトの進行状況や管理方法次第で、どうしても Windows 端末での開発を行わなければならない状況もあります。
致命的ではない文字コードやインデントも指定するのですから、致命的エラーとなる改行コードは指定しておきましょう。
インデント
インデントは、半角スペース2つとする。
[Tips]
タブ (半角スペース4つもしくは8つ) だと、横に広がりすぎて視認性が悪くなることがあります。
シバン
シバンは、以下の通り bash とする。
#!/bin/bash
[Tips]
シバンとヘッダは、ひとまとめにしてしまっても良いかもしれません。
もしくは、拡張子の指定でシバンも固定することになるでしょう。
ヘッダ
スクリプトの冒頭には、スクリプトの概要を記載する。
項目内容備考
スクリプト名Script nameファイル名称を記載する。
変更Modify変更日・変更者・変更内容を記録する。

以下は、定義する際のサンプル。
項目内容備考
スクリプト名Script nameファイル名称を記載する。
目的Purposeスクリプトの目的を記載する。
引数Option指定可能なオプションを記載する。
変更Modify作成日を記録する。日付と担当者をひとまとめにしてもよい。
作成者Auther作成者を記載する。
更新日Update更新日を記載する。更新内容も併記するとなおよい。
権限Permission実行者や権限を記載する。
サンプル 1
# Script name: example.sh
サンプル 2
# スクリプト名: example.sh
# 目的: スクリプトサンプル
コメント
適宜コメントを記載すること。
コメント内は日本語で記述する。

サンプル
# システム

パラメータ関係

変数名
変数名は、別途定めるプレフィックス/サフィックスを含め、キャメルケースで指定する。
一部の予約された変数名以外は、単語の組み合わせで指定すること。
[Tips]
私がスネークケースよりキャメルケースのほうが読みやすいと感じるタイプなので、キャメルケースを指定しています。
メリット・デメリットを考慮して、規定するのが良いです。

変数名はスクリプト上部にまとめて宣言しておくので、エディタの画面分割機能でコピペすることが前提としてあります。
画面分割は vim でも可能です。
変数名が短くても、何回も手入力していればタイポする可能性は高いです。
プレフィックス
プレフィックスは、変数の用途に応じて次の文字を使用する。
文字用途備考
p汎用パラメータParameter を意図
n数値用パラメータNumber を意図
f0 を真としたフラグ情報Flag を意図
tループで頻繁に書き換える使い捨てパラメータTemporary を意図
iループ用に予約Integer を意図 (while/until での数値ループに使用)
sループ用に予約String を意図(for での文字列ループに使用)
サフィックス
サフィックスは、特定の用途で次の文字列を使用する。
文字用途備考
Path絶対パスでファイル情報を指定する場合に利用
Dirディレクトリ情報の場合に利用文字列の最後は / で終わること。
Nameファイル情報の場合に利用ディレクトリは含めないこと。
Enableフラグ管理など、0 で有効とする場合に利用
サフィックスとしての Disable は、Enable と併用すると混乱を招くことがあるので禁止する。
利用時の指定方法
変数を利用する場合は、ブラケットで括ること。
Exit Status
終了ステータスは、スクリプトの目的が満たされることを正常とし、正常終了した場合に 0 とする。

関数関係

関数は、
関数名
関数名は、別途定めるプレフィックスを含め、キャメルケースで指定する。
一部の予約された関数名以外は、単語の組み合わせで指定すること。
プレフィックス
プレフィックスは、変数の用途に応じて次の文字を使用する。
文字用途備考
fn関数 (ファンクション) であることを示す
テンプレート関数
fnLog
特定のログファイルに、毎回リダイレクトを記述するのは可視性としても悪くなり、ミスも誘発しやすい。
引数としてメッセージをログファイルへ書き込む関数を用意した。

スクリプトの進捗状況を記述する目的で利用すること。

サンプル
fnLog "Sample message"
fnDebug
開発時に利用したデバッグ用メッセージを、メンテナンス時にも再利用できるよう、フラグに応じて出力指定もできる関数を用意した。

デバッグ情報を記述する目的で利用すること。

サンプル
fnDebug "Debug message"
fnErr
シェルスクリプトが標準エラー出力を行うための関数を用意した。

エラー出力を記述する目的で利用すること。

サンプル
fnErr "Standard Error message"
fnErrEnd
存在しなければ即時で終了するための関数を用意した。

引数として、エラー番号と、対象のファイルまたはディレクトリなどを指定すること。

サンプル
[ -d "/etc" ] || fnErrEnd 14 "/etc"
[ -f "/etc/hosts" ] || fnErrEnd 15 "/etc/hosts"
[ -x "/bin/ps" ] || fnErrEnd 13 "/bin/ps"

メイン

オプション解析
getopts を利用した解析を行う。
[Tips]
    • help といったロングオプションを使いたい場合は、getopts ではなく、引数そのものを case で解析するほうがよいと思います。

備考

テンプレート
シェルスクリプト
サンプル
#!/bin/bash
############################################################
# Script name: example.sh
# Modify     : yyyy.mm.dd 名前 初版作成
############################################################

### Parameter and Variable #################################
pCommon=./src/common.src
if [ -f "${pCommon}" ]; then
  . ${pCommon}
else
  echo "${pCommon} not exist."
  exit 1
fi

### Function ###############################################
fnEnd() {
  # スクリプト内で異常終了する際の Exit Status と、メッセージ内容の定義
  nExitStatus=$1
  case "${nExitStatus}" in
     0 ) fnLog "Script ${0##*/} end.";;
     * ) fnErr "Unknown error ($2)"; nExitStatus=1;;
  esac
  exit ${nExitStatus}
}

### Main ###################################################
fnLog "Script ${0##*/} start."

## オプション解析
while getopts h OPT; do
  case ${OPT} in
    h )
      fnDebug "Option h used."
      echo "Usage ${0##*/} [-h]"
      echo " [-h]    help messages."
      fnEnd 0
      ;;
    * )
      fnDebug "Unknown option used."
      fnErrEnd 10 "${OPT}"
      ;;
  esac
done

# xxx 処理


### End ####################################################
fnEnd 0

############################################################
外部ファイル
サンプル
# 共通ファイル (common.src)

### Parameter and Variable #################################

## ディレクトリ
pLogDir="/var/log/script/"

## ファイル
pLogName=$(basename ${0%.*}.log)

## パス
# ログファイル
pLogPath="${pLogDir}${pLogName}"

# ヌルクリア
i=""
s=""

# Exit Status
nExitStatus=0

## フラグ
fDebugEnable=0

### Function ###############################################

# 目的:ログ出力
fnLog() {
  echo "$(date +'%Y/%m/%d %H:%M:%S') $*" >> ${pLogPath}
}

# 目的:デバッグ出力
fnLog() {
  [ "${fDebugEnable}" -eq "0" ] && fnLog "[Debug] $*"
}

# 目的:エラー出力
fnErr() {
  # ログ出力
  fnLog "$*"
  # 標準エラー出力
  echo "$(date +'%Y/%m/%d %H:%M:%S') $*" >&2
}

# 目的: エラー終了
fnErrEnd() {
  nExitStatus=${1}

  # 引数確認
  if [ -z "${nExitStatus}" ]; then
    fnErr "Not argument."
    exit 1
  fi

  case "${nExitStatus}" in
     0 ) fnErr "Function (fnErrEnd) argument error."; nExitStatus=1;;
    10 ) fnErr "Argument error ($2)";;
    11 ) fnErr "Read permission not exist ($2)";;
    12 ) fnErr "Write permission not exist ($2)";;
    13 ) fnErr "Exec permission not exist ($2)";;
    14 ) fnErr "Directory not exist ($2)";;
    15 ) fnErr "File not exist ($2)";;
     * ) fnErr "Unknown error ($2)";;
  esac
  exit ${nExitStatus}
}
||

Excel VBA

2021/05/22 21:45 OS別::Windowsその他::技術情報

Excel VBA


Excel のバージョン情報

このページを作成する際に使った、Microsoft Excel 情報です。

バージョン 2104 (ビルド 13929.20372)
Excel バージョン情報
Excel バージョン情報

Microsoft 365 のサブスクリプションを契約しており、基本的には最新版*1を利用しています。
メールアドレスなど、アカウント系の情報は消しています。

Excel VBA とは

現在発売されている Microsoft Excel は、標準でマクロ機能が存在します。

いくつか Tera Term と連携するネタがあるので、それを記載したいと思います。
その前に、VBA を利用できる環境にするための設定から。

VBA の有効化

Excel オプションを開く
Excel VBA は、オプションからリボンを有効化することで簡単に利用することができるようになります。

まず、メニューバーから「ファイル」を選択します。

Excel 起動
Excel 起動

左ペインから「オプション」を選択します。

オプション選択
オプション選択
マクロを利用する設定
Excel のオプションが表示されるので、左ペインから「トラスト センター」を選択します。
ここで、右ペインに「トラスト センターの設定」が表示されていることが確認できます。

トラスト センターの設定
トラスト センターの設定

メッセージバー
トラスト センターでは、メッセージ バーが表示されると思います。

「ActiveX コントロールやマクロなどのアクティブ コンテンツがブロックされた場合、すべてのアプリケーションにメッセージ バーを表示する」にチェックが入っていることを確認します。

メッセージ バーの表示
xxxx

何かの拍子にブロックされても分かりませんので、入っていなければいれておきましょう。
マクロの設定
左ペインから「マクロの設定」を選択します。

ここでは、右ペインに出てくるマクロの設定から「すべてのマクロを有効にする(推奨しません。危険なコードが実行される可能性があります)」のチェックボックスを有効にします。

自分がいつ、どのように作った VBA マクロなのかは分かると思いますので、有効にしても問題ないという理屈です。

思い当たらないファイルは、基本的に開かなければ問題になりません。

マクロの設定
マクロの設定

「警告を表示してすべてのマクロを無効にする」を選択しても良いでしょう。
VBA マクロが入っている Excel ファイルを開いたときに、画面上部に薄い黄色で「セキュリティの警告 マクロが無効にされました。[コンテンツの有効化]」がでます。

この場合、そのファイルは「コンテンツの有効化」を押して実行を許可しなければ動きません。
逆に言うとマクロを動かすために許可すればよいので、確認するという観点では推奨できるものと思います。


このページの趣旨からは外れるため解説はしませんが、安全にマクロを利用する場合はデジタル署名を行うことが可能です。
デジタル署名を行うと、誰が VBA マクロを含むファイルを作成したかがシステム的に分かるため、安全になります。


「OK」を選択して、Excel のオプション画面に戻ります。

マクロを開発する設定
Excel のオプションが表示されたら、左ペインから「リボンのユーザー設定」を選択します。
ここで、右ペインに「□開発」が表示されていることが確認できます。

開発 有効化ボタン
開発 有効化ボタン

「開発」にチェックをつけて「OK」を押します。

開発 有効化状態
開発 有効化状態

Excel の通常画面に戻ります。
この時、メニューバーに「開発」が表示されていれば、設定できています。

メニューバーの開発
メニューバーの開発

VBA 標準モジュールの追加

開発メニューを選択すると、リボンが表示されます。
VBA でコードを書きたいときは、ここで「Visual Basic」を選択します。

開発リボンの内容
開発リボンの内容

「VBAProject(Book 1)」でも「Microsoft Excel Object」でも構わないのですが、右クリックして「挿入」→「標準モジュール」と進みます。

標準モジュールの追加
標準モジュールの追加

Excel VBA として、標準モジュールが追加されました。

追加した標準モジュールの内容
追加した標準モジュールの内容
VBA マクロのある Excel ファイルの保存
標準モジュールを追懐したファイルは、拡張子「.xlsm」で保存します。
VBA マクロが有効なファイルはサイバー攻撃に利用されることが多いので、注意する必要があるためです。

VBA 有効ファイルの保存
VBA 有効ファイルの保存

VBA が動作する Excel ファイルは、作成日付といったプロパティや、誰が作ったものなのかといった信頼できる情報をもとに開くようにしましょう。

*1 : 更新タイミングによっては、少し古いバージョンだったりもします。

Zabbix 5.2 on AWS

2021/05/08 17:37 OS別::Linuxその他::技術情報

Zabbix 5.2 on AWS

【注意】まず、このページは個人的な備忘録であり、自分が分かる部分はいろいろとスキップしています。参考にされませぬよう。

例)Zabbix へブラウザでアクセスする方法は、もともと準備していた EC2 インスタンスに SSH でアクセスしてポートフォワードを設定し、xrdp をインストールした EC2 に RDP している。



全体構成

このページでは、Zabbix 5.2 の設定を、公式手順をもとにカスタマイズしています。
https://www.zabbix.com/jp/download

また、フロントエンドとしてのシステム要件は、次のページを参照しています。
https://www.zabbix.com/documentation/current/manual/installation/requirements

公式手順では、サーバを設定 → DB 設定 → Agent 設定という流れになっています。

DB をサーバ上に構築するためにはスマートな流れですが、RDS を利用する場合は DB を先に準備できるので、作業しておきます。

それから、このページでは企業が利用するような手順書としては余計な情報も大量に記載しているので、そのままでは利用できないことに注意してください。
構成概要
以下の構成で、構築します。
Zabbix Server
仕事で AWS クラウドでの構築という手段がとれることを確認するのが目的です。

Zabbix の公式では、Red Hat Enterprise Linux / CentOS / Oracle Linux / Ubuntu / Debian / SUSE Linux Enterprise Server / Raspberry Pi OS / Ubuntu (arm64) に対応しています。

Amazon Linux 2 は、おそらく Cent OS 7 の手順で使えそうに思いましたが、一応 RHEL 8 を選択します。
ハードウェア
クラウド上のインスタンス「AWS EC2 (t2.micro) 」を利用するため、ハードウェアは持ちません。
ソフトウェア
Zabbix 用のサブネットに、次のインスタンスを作ります。
項目内容備考
OSRHEL 8構築時には最新化する
DBMySQLAmazon RDS を利用
アプリZabbix Server 5.2
Zabbix Clientサーバ自身の管理用
PHP 7.3Zabbix フロントエンドで利用
要件として PHP 7.2.5 が求められていますが、RHEL8 はデフォルトで PHP 7.2.4 がインストールされます。
また、PHP 8.0 はサポートされていません。

Zabbix 5.2 のフロントエンドの要件
https://www.zabbix.com/documentation/current/manual/installation/requirements

そのため PHP 7.3 をインストールします。
ネットワーク
Zabbix サーバを置くネットワークのサンプルとして 172.16.10.10 を静的に指定します。

これはプライベートサブネットなので、Web アクセスは外部からインターネット接続で RDP できる EC2 インスタンスから参照します。

実際に確認した方法としては、パブリックサブネットに SSH 通信ができる Linux インスタンスを置いて、ポートフォワードを利用して RDP できるインスタンスからブラウザによって参照しています。

業務として構築する場合は Basic 認証等も検討し、パブリックサブネットに配置しても良いでしょう。
Zabbix Agent
Agent は、以下の構成で構築します。
ハードウェア
  • Amazon Linux 2
サンプルとして、Public subnet に Amazon Linux 2 のインスタンスを作ります。
ソフトウェア
適当なサブネットに、次のインスタンスを作ります。
項目内容備考
OSAmazon Linux 2
アプリZabbix Agent 5.2
Zabbix Clientサーバ自身の管理用
ネットワーク
サンプルとして、パブリックサブネットに構築します。
構成図
このページで作成する Zabbix の構成図を次に示す。
zbx5.2 + rds 構成図
Zabbix 5.2 + RDS (MySQL) 構成図
Zabbix Agent をインストールする Client に ssh で接続する想定です。
また Client には xrdp もインストールして ssh ポートフォワードから RDP しますが、こちらについては目的の動作ではないため割愛します。
作業の流れ
このページは、以下の流れで作業します。
  1. RDS で DB を用意
  2. EC2 で Zabbix Server を用意
  3. Zabbix Server で設定
  4. Zabbix Agent を設定

セキュリティグループの作成

左ペインの「セキュリティ」から「セキュリティグループ」を選択します。

Zabbix Server は 10051 番ポートで Zabbix Agent からのアクセスに応答します。
Zabbix Agent は 10050 番ポートで Zabbix Server からのアクセスに応答します。
RDS 用
基本的な詳細
セキュリティグループの、基本的な詳細を入力します。
項目内容
セキュリティグループ名Zabbix RDS
説明Zabbix DB
VPC(作成した VPN を選択)
説明には、日本語が使えない模様……。
インバウンドルール
RDS は 3306 番ポートで Zabbix Server からのアクセスに応答します。
タイププロトコルポート範囲ソース説明
MYSQL/AuroraTCP3306172.16.10.0/24
アウトバウンドルール
特に制限を設けません。
Zabbix Server 用
基本的な詳細
セキュリティグループの、基本的な詳細を入力します。
項目内容
セキュリティグループ名Zabbix
説明Zabbix Servers Access
VPC(作成した VPN を選択)
説明には、日本語が使えない模様……。

インバウンドルール
Zabbix Server は 10051 番ポートで Zabbix Agent からのアクセスに応答します。
他のサブネットから、Zabbix サーバに Agent の情報を送るための設定します。

タイププロトコルポート範囲ソース説明
カスタム TCPTCP10051172.16.0.0/16Agent による Zabbix サーバへのアクセス
HTTPTCP80172.16.0.0/16Web ブラウザによる Zabbix サーバへのアクセス
HTTPTCP443172.16.0.0/16Web ブラウザによる Zabbix サーバへのアクセス
SSHTCP22172.16.0.0/16SSH による Zabbix サーバへのアクセス

Zabbix Agent 側のセキュリティルールに、TCP/10050 ポートのインバウンドルールを付与してください。
なお、アクセス端末については、パブリックサブネットの Client を想定しています。
アウトバウンドルール
特に制限を設けません。
制限を設ける場合は、次の2点に注意。
Zabbix サーバが Agent に対してアクセスするための TCP/10050
Zabbix サーバが RDS に対してアクセスするための TCP/3306
Zabbix Agent 用
基本的な詳細
セキュリティグループの、基本的な詳細を入力します。
項目内容
セキュリティグループ名Zabbix Agent
説明Zabbix Zagents Access
VPC(作成した VPN を選択)

インバウンドルール
Zabbix Agent は 10050 番ポートで Zabbix Server からのアクセスに応答します。
他のサブネットから、Zabbix サーバに Agent の情報を送るための設定です。

タイププロトコルポート範囲ソース説明
カスタム TCPTCP10050172.16.0.0/16Zabbix Server による Agent へのアクセス
Agent が Linux の場合は TCP/22 を、Windows の場合は TCP/3389 も必要と思われます。
デフォルトでは、セキュリティグループを5つまで同時に適用できるため、分割したほうが良さそうです。
アウトバウンドルール
特に制限を設けません。
制限を設ける場合は、次の2点に注意。
Zabbix サーバが Agent に対してアクセスするための TCP/10050
Zabbix サーバが RDS に対してアクセスするための TCP/3306

ネットワーク構成

VPC の作成
デフォルト VPC を利用する場合は必要ない作業ですが、今回は別途行うものとします。
サンプルとして、上記構成図のとおり 172.16.0.0/16 の VPC を作成します。
サブネットの定義
また、Amazon RDS 用のサブネットを2つ作るものとします。

RDS は、AZ 2つ以上を束ねたマルチ AZ 構成にする必要があります。
なので VPC 作成 → サブネット作成 → サブネットグループに指定 → データベース作成をお行います。

Amazon RDS にて DB を構築したいので、AWS マネジメントコンソールから VPC にアクセスします。
パブリックサブネット
DMZ 用サブネット(Public)
外部と接するサブネットを作成します。
172.16.0.0/24 として話を進めます。

ここには Internet Gateway や NAT Gateway など、インターネット接続を行うためのインスタンスを置くことになります。
Zabbix がインターネットにアクセスする必要があるなら、ここに Zabbix サーバを立てても良いです。

パブリックサブネットの要件となる、Internet Gateway を置きます。
また、プライベートサブネットがインターネットに抜けるために必要な NAT Gateway もここに置きます。
Internet Gateway
省略
NAT Gateway
省略

プライベートサブネットからのインターネット接続を受けて、Internet Gateway でやり取りするものです。
セキュリティグループの設定を忘れず行う必要があります。
プライベートサブネット
RDS 用サブネット A(Private)
VPC で 172.16.1.0/24 のサブネットを作ります。
名前は DB a として進めます。

AZ は a ~ d あるとして、ここでは a を選択します。
RDS 用サブネット B(Private)
VPC で 172.16.2.0/24 のサブネットを作ります。
名前は DB b として進めます。

AZ は a ~ d あるとして、ここでは b を選択します。
Zabbix サブネット(Private)
VPC で 172.16.5.0/24 のサブネット を作ります。
AZ は任意で、名前は Zabbix として進めます。

Zabbix サーバを立てるためのサブネットとしているが、サーバ用に作らなければならないものでは無くて、話を理解しやすくするためのものです。
このサブネット以外に Zabbix サーバを立てても良いです。

RDS

AWS マネジメントコンソールから RDS にアクセスします。
サブネットグループの作成
左ペインのサブネットグループを選択します。

「DB サブネットグループを作成」を押して、作成画面へ。
サブネットグループの詳細
「サブネットグループの詳細」へ入力します。
入力項目サンプル入力内容
名前Zabbix
説明zabbix network subnet
VPC(作成したVPC)
入力イメージを次に示します。
RDS Subnetgroup
サブネットグループの詳細
サブネットを追加
「サブネットを追加」へ入力します。
入力項目サンプル入力内容
アベイラビリティゾーンAZ a と AZ b を選択他にサブネットを作成した AZ があればそれも選択
サブネットRDS 用サブネット「DB a」「DB b」を選択します
入力イメージを次に示します。
Add subnet
サブネットを追加

作成ボタンをクリックして、RDS が利用するサブネットグループを作成します。
データベース
左ペインから「データベース」を選択し、右ペインの「データベースの作成」ボタンをクリックします。
データベース作成方法を選択
標準作成を選択。
標準作成
選択イメージ
エンジンのオプション
MySQL を選択します。
エディションは、MySQL Community のみ。
バージョンは MySQL 8.0.23 で良いです。
MySQL 選択
エンジン選択イメージ
テンプレート
無料利用枠を選択します。
無料利用枠
テンプレートイメージ
設定
項目設定サンプル内容
DBインスタンス識別子zabbix
認証情報の設定
マスターユーザー名任意自動生成してもよい
マスターパスワード任意自動生成してもよい

設定
設定イメージ

Default は狙われやすいのでできれば変更するのが望ましいが、プライベートサブネットで、セキュリティグループでアクセス元を管理する想定、かつサンプルということで admin のまま。

マスターパスワードはブラウザの機能で勝手に入れられているが、本来はブランク……

DB インスタンスサイズ
「db.t2.micro」を選択します。
DB インスタンスサイズ
DB インスタンスサイズイメージ
ストレージ
項目設定サンプル内容
ストレージタイプ汎用(SSD)デフォルトの場合
ストレージ割り当て20 GiBデフォルトの場合
ストレージの自動スケーリング

ストレージ
ストレージイメージ
可用性と耐久性
マルチ AZ 配置
一択です。
可用性と耐久性
可用性と耐久性イメージ
接続
項目内容備考
VPCSample作成した VPC
サブネットグループzabbix作成したサブネットグループ
パブリックサブアクセス可能なしプライベートサブネットに置く想定
VPC セキュリティグループZabbix対応するセキュリティグループは作成済みの想定
既存の VPC セキュリティグループZabbix
アベイラビリティゾーン任意で指定
追加の接続設定
データベースポート3306

接続
接続イメージ

データベース認証
パスワードを選択します。
データベース認証
データベース認証イメージ

追加設定
このタイミングでデータベースを作っておきます。
項目内容備考
データベースの選択肢
最初のデータベース名zabbixZabbix サーバのデフォルト
DB パラメータグループ(変更不可)
オプショングループ(変更不可)
バックアップ
自動バックアップの有効化
モニタリング
拡張モニタリングの有効化
ログのエクスポート
エラーログ
全般ログ
スロークエリログ
メンテナンス
マイナーバージョン自動アップグレードの有効化
メンテナンスウィンドウ〇設定なし
削除保護
削除保護の有効化

追加設定
追加設定イメージ

概算月間コスト
毎月の支払予想額が出ます。
出ないこともあります。
エンドポイント
AWS マネジメントコンソールから RDS にアクセスします。

左ペインから「データベース」を選択して、右ペインに出てくる DB 識別子 zabbix を選択します。

接続とセキュリティにある、エンドポイントをメモしておきます。
これは、Zabbix サーバからアクセスする際に必要です。

Zabbix 5.2 Server

AWS マネジメントコンソールから EC2 にアクセスします。
ユーザーデータ用シェルスクリプトを作成
シェルスクリプトとして、次の内容のテキストファイルを作成します。
ファイル名は zbxsvr.sh として進めます。

なお、改行コードは LF のみとします。
(日本語を含まないので Shift-JIS でも構わない。含める場合は UTF-8 にすること)
#!/bin/bash

# RHEL8 Update
dnf update -y

# Zabbix install
rpm -Uvh https://repo.zabbix.com/zabbix/5.2/rhel/8/x86_64/zabbix-release-5.2-1.el8.noarch.rpm
dnf clean all
dnf install -y mysql zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent zabbix-web-japanese

# php
dnf install -y php
dnf distro-sync
dnf module reset php
dnf module enable php:7.3
dnf distro-sync

# SElinux
setenforce 0

インスタンスの作成
左ペインから「インスタンス」を選択して、右ペインの「インスタンスを起動」をクリックします。
AMI の選択
サーバとして RHEL8 の x86 を選択します。
AMI の選択
AMI の選択イメージ
インスタンスタイプの選択
タイプ t2.micro を選択します。
インスタンスタイプの選択
インスタンスタイプの選択イメージ
インスタンスの設定
インスタンスの設定
項目内容備考
インスタンス数1
購入のオプション□ スポットインスタンスのリクエスト
ネットワークSample作成した VPC
サブネットZabbix作成したサブネット
自動割り当てパブリック IPサブネット設定を使用(無効)
配置グループ□ インスタンスをプレイスメントグループに追加します。
キャパシティーの予約開く
ドメイン結合ディレクトリディレクトリなし
IAM ロールなし
シャットダウン動作停止
停止 - 休止動作□ 停止動作に休止動作を追加します
終了保護の有効化□ 誤った終了を防止します
モニタリング□ CloudWatch 詳細モニタリングを有効化
テナンシー共有 - 共有ハードウェアインスタンスの実行
Elastic Inference□ Elastic Inference アクセラレーターを追加
クレジット仕様□ 無制限
ファイルシステム

インスタンスの設定
インスタンスの設定イメージ
ネットワークインターフェイス
項目内容備考
デバイスeth0デフォルト
ネットワークインターフェイス新しいネットワークインターフェースデフォルト
サブネットデフォルト
プライマリ IP172.16.10.10EIPを使用しないので、静的に指定します
セカンダリ IP アドレス指定なし
IPv6 IP指定なし

ネットワークインターフェイス
ネットワークインターフェイスイメージ
高度な詳細
ここで zbssvr.sh を利用します。
ここで実行コマンドを記述したファイルをアップロードしておくと、サインインした後に手で入力する必要がなくなります。
項目内容備考
Enclave□ 有効
アクセス可能なメタデータ有効
メタデータのバージョンV1 および V2 (トークンはオプション)
メタデータトークンレスポンスのホップ制限1
ユーザーデータ● ファイルとしてzbssvr.sh を指定
高度な詳細
高度な詳細イメージ
なお、上記スクリプトの利用は NAT Gateway が適切に設定され、インターネット接続できることが条件となります。
ストレージの追加
デフォルトで進めます。
ストレージの追加
ストレージの追加イメージ
タグの追加
任意のタグを設定します。
セキュリティグループの設定
Zabbix サーバ用のセキュリティグループを指定します。
インバウンドルール
最低限、以下のポートが利用できること。
タイププロトコルポート範囲ソース説明
MYSQL/AuroraTCP3306172.16.0.0/16
カスタム TCPTCP10051172.16.0.0/16Agent による Zabbix サーバへのアクセス
HTTPTCP80172.16.0.0/16Web ブラウザによる Zabbix サーバへのアクセス
HTTPTCP443172.16.0.0/16Web ブラウザによる Zabbix サーバへのアクセス
SSHTCP22172.16.0.0/16SSH による Zabbix サーバへのアクセス

確認
ブラウザでの設定
ブラウザで Zabbix サーバにアクセスします。

URL は、次の通りです。
http://(IPアドレス)/zabbix
次の画面が表示されます。
言語選択
言語選択
ここでは、日本語に変更します。
(インストール時に zabbix-web-japanese も指定しているので、日本語を選択可能です)
言語選択 日本語
言語選択 日本語
日本語に変更できたら「次のステップ」を選択します。


次に、前提条件のチェックで、環境に問題ないことを確認します。
前提条件のチェック
前提条件のチェック
全部 OK であれば問題ありません。
「次のステップ」を選択します。

データベースホストに、RDSのエンドポイントを指定します。
また、zabbix ユーザのパスワードも指定します。
データベース接続設定
データベース接続設定
項目内容
データベースホストRDS のエンドポイント
パスワードRDS zabbix ユーザのパスワード

データベース接続設定 入力
データベース接続設定 入力イメージ
「次のステップ」を選択します。
Zabbixサーバーの詳細
Zabbixサーバーの詳細
「次のステップ」を選択します。
GUI設定
GUI設定
タイムゾーンは日本に変更します。
(UTC+09:00) Asia/Tokyo を選択します。
GUI設定 日本時間
GUI設定 日本時間
「次のステップ」を選択します。
インストール事前準備概要
インストール事前準備概要
「次のステップ」を選択します。
インストール終了
インストール終了
「終了」を選択します。
サインイン画面
サインイン画面
サインイン
次のデフォルトアカウントでサインインします。
項目内容
ユーザー名Admin
パスワードzabbix
サインインしたら、パスワードは変更しましょう。

Zabbix Agent

以下は、あとで分割してページを作る予定です。
Amazon Linux 2
リポジトリ登録
Amazon Linux 2 は、CentOS をベースに作成されていると考えられます。
そこで、RHEL7 ベースのリポジトリを登録します。
# yum update
# rpm -ivh https://repo.zabbix.com/zabbix/5.2/rhel/7/x86_64/zabbix-release-5.2-1.el7.noarch.rpm
# yum clean all
Zabbix Agent インストール
登録したリポジトリから、Agent をインストールします。
# yum install zabbix-agent
Zabbix Agent 設定
/etc/zabbix/zabbix_agentd.conf を修正します。
# cp -p /etc/zabbix/zabbix_agentd.conf,_$(date +%Y%m%d)
# vi /etc/zabbix/zabbix_agentd.conf
修正内容は、自分自身のホスト名と、情報を送る Zabbix サーバです。


差分の確認を行います。
# diff /etc/zabbix/zabbix_agentd.conf,_$(date +%Y%m%d)
Zabbix Agent 起動
インストールした Agent を起動および自動起動設定を行います。
# systemctl restart zabbix-agent
# systemctl enable zabbix-agent

その他

下記の登録商標・商標をはじめ、当社サイトに記載している会社名、システム名、製品名は一般に各社の登録商標または商標です。