adiary on RPi 12

2023/12/14 22:09 OS別::Linuxその他::技術情報
別途 adiary on RaspPi という記事で Raspberry Pi OS に adiary をインストールして、利用するところまで記事にしていますが、バージョンが上がったことでいくつか不都合があったり、仕様に手を入れたりしているので、新しく記事にしてみます。

前提条件

この記事を作るにあたって、以下の読者を想定しています。
  • CUI でのコマンド操作ができる。
  • TCP/IP の基礎知識をもっている。
  • 記事の内容を、自身の環境に読み替えることができる。

環境

筐体

Raspberry Pi 3 Model B を利用します。

Raspberry Pi OS バージョン

Debian 系 OS である、Raspberry Pi OS を利用します。
バージョン等は、以下の通りです。
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 12 (bookworm)"
NAME="Raspbian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

注意点

Debian 系で cgi を動作させる場合、通常は /usr/lib/cgi-bin/ に置くものなのですが、自身の都合で環境設定を変更しています。

環境準備

Raspberry Pi OS インストール

以下の順番で、手順を参照してください。
  1. RPi OS インストール

Raspberry Pi OS 管理外

DNS 設定および HTTPS 設定 (TLS) については、ドメインのレジストリ/レジストラや証明書の発行機関が関わるため、ここでは記載しません。

端末からテスト的に名前解決したい場合は hosts に記載すると良いでしょう。
対象のファイルパスは、以下の通りです。
C:\Windows\System32\drivers\etc
例えば、192.168.10.10 が Raspberry Pi サーバで、example.jp という名前でアクセスしたい場合、上のファイルに次のように記載します。
192.168.10.10 example.jp
この設定を行った端末からは、192.168.10.10 に対して example.jp という名前でアクセスできるようになります。

Raspberry Pi OS 各種設定

以下の順番で、手順を参照してください。
  1. Raspberry Pi OS raspi-config
  2. Raspberry Pi OS 実行環境整備
  3. Raspberry Pi OS IPv4 静的設定
  4. Raspberry Pi OS NTP 設定

前提パッケージのインストール

以下の順番で、手順を参照してください。
  1. apache2 設定
  2. adiary 関連ライブラリ

adiary パッケージインストール(tar ボウル利用)

バージョンごとにしばらくバックアップ環境を残したいので、基本的にはこちらを利用しています。

ログ出力ディレクトリ作成

デフォルトより1段下げてログ出力したいので、専用ディレクトリを作成します。
$ sudo mkdir /var/log/apache2/adiary
ちなみに、apache の環境設定ファイルで $APACHE_LOG_DIR と書きますが、/var/log/apache2/ を指します。

作業準備

作業環境を整備します。
$ grep www /etc/passwd
$ cd /var/
$ ls -ld /var/www
drwxr-xr-x 3 root root 4096  7月  9 17:37 /var/www
$ sudo chown www-data:adm www
$ ls -ld /var/www
drwxr-xr-x 3 www-data www-data 4096  7月  9 17:37 /var/www
$ sudo su -s /bin/bash - www-data
$ pwd
/var/www
$ cp /etc/skel/.bashrc .
$ vi .bashrc
# umask
umask 027
$ diff .bashrc /etc/skel/.bashrc
114,116d113
<
< # umask
< umask 027
$ . .bashrc

ダウンロード(tar ボウル)

https://adiary.org/pub/adiary/image/download/release/ にアクセスして、最新版を取得します。
ここでは、執筆時に最新版であった adiary-3.50h.tar.bz2 を利用します。
$ curl https://adiary.org/pub/adiary/image/download/release/adiary-3.50h.tar.bz2 --output adiary-3.50h.tar.bz2
$ ls -l
合計 4324
-rw-r----- 1 www-data www-data 4421745 12月 12 21:26 adiary-3.50h.tar.bz2
drwxr-xr-x 2 root     root        4096 12月 12 21:32 html
$ sha256sum adiary-3.50h.tar.bz2
fb3beaea3ae1efdd3ed9855cd2f0ea2fe8c11299a9bc8864710591f80842f1a6  adiary-3.50h.tar.bz2
$ tar tvf adiary-3.50h.tar.bz2
$ tar xf adiary-3.50h.tar.bz2
$ ls -l
合計 4328
drwxr-x--- 13 www-data www-data    4096 10月 16 11:28 adiary-3.50h
-rw-r-----  1 www-data www-data 4421745 12月 12 21:26 adiary-3.50h.tar.bz2
drwxr-xr-x  2 root     root        4096 12月 12 21:32 html
$ ln -s adiary-3.50h adiary
$ ls -l
合計 4328
lrwxrwxrwx  1 www-data www-data      12 12月 12 21:34 adiary -> adiary-3.50h
drwxr-x--- 13 www-data www-data    4096 10月 16 11:28 adiary-3.50h
-rw-r-----  1 www-data www-data 4421745 12月 12 21:26 adiary-3.50h.tar.bz2
drwxr-xr-x  2 root     root        4096 12月 12 21:32 html
$ exit

adiary 環境構築

ここからは、初期設定を記述します。

サーバ移行とかシステム復旧のような、データを上書きする場合はここで処理を止めます

Apache2 設定

adiary のインストール後でなければ行えない Web 公開設定を行います。
設定ファイル作成のための事前調査
adiary が制限を入れたいディレクトリは .htaccess ファイルが置かれています。
.htaccess ファイルを無効にし、すべて apache の設定ファイルに記述するようにしているため、ファイルを探しておきます。
$ sudo find /var/www/adiary -name .htaccess
./adiary-3.50h/lib/.htaccess
./adiary-3.50h/skel.local/.htaccess
./adiary-3.50h/info/.htaccess
./adiary-3.50h/plugin/.htaccess
./adiary-3.50h/__cache/.htaccess
./adiary-3.50h/data/.htaccess
./adiary-3.50h/skel/.htaccess
設定ファイルの作成
上記の制限内容を踏まえて、設定ファイルを作成します。
$ cd /etc/apache2/sites-available
$ sudo vi 001-adiary.conf
(Config writing...)
$ sudo cat 001-adiary.conf
<VirtualHost *:80>
    ServerName  ttm.jimba.ddo.jp
    ServerAdmin xxx@jimba.ddo.jp
    DocumentRoot /var/www/adiary

    <Directory /var/www/adiary>
        Options ExecCGI
        AllowOverride None

        # Rewite module
        RewriteEngine   On
        RewriteCond     %{REQUEST_FILENAME}  !-f
        RewriteRule     ^(.*)$               adiary.cgi/$1   [L]

    </Directory>

    <Directory /var/www/adiary/__cache>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/data>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/skel>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/plugin>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/info>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/lib>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/skel.local>
        order allow,deny
        deny from all
    </Directory>

    ## CustomLog
    # Variable setting - IP address
    SetEnvIf Remote_Addr 192.168.  local_network suppres-log

    # Variable setting - Crawler
    SetEnvIf User-Agent "BLEXBot"        crawler suppres-log
    SetEnvIf User-Agent "bingbot"        crawler suppres-log
    SetEnvIf User-Agent "Googlebot"      crawler suppres-log
    SetEnvIf User-Agent "Twitterbot"     crawler suppres-log
    SetEnvIf User-Agent "Applebot"       crawler suppres-log
    SetEnvIf User-Agent "DataForSeoBot"  crawler suppres-log
    SetEnvIf User-Agent "DotBot"         crawler suppres-log
    SetEnvIf User-Agent "Bytespider"     crawler suppres-log
    SetEnvIf User-Agent "GPTBot"         crawler suppres-log
    SetEnvIf User-Agent "LivelapBot"     crawler suppres-log

    # Variable setting - Site (Directory)
    SetEnvIf Request_URI "/coffee"       coffee suppres-log

    ErrorLog ${APACHE_LOG_DIR}/ttm/error.log

    # Log output
    CustomLog ${APACHE_LOG_DIR}/adiary/local-access.log combined env=local_network
    CustomLog ${APACHE_LOG_DIR}/adiary/crawler-access.log combined env=crawler
    CustomLog ${APACHE_LOG_DIR}/adiary/coffee-access.log combined env=coffee
    CustomLog ${APACHE_LOG_DIR}/adiary/access.log combined env=!suppres-log

</VirtualHost>
【参考情報】/var/www/adiary/.htaccess に書きたい内容は、上記主設定ファイル (201-adiary.conf) の <Directory /var/www/adiary> ~ </Directory> の中に書く。

根拠は、apache2 公式サイトより引用した以下の通り。
普通は可能であれば .htaccess ファイルの使用は 避けてください。.htaccess ファイルに書こうと考えるようなすべての設定は、サーバの主設定ファイルの セクションで同じように行なうことができます。
Apache HTTP Server Tutorial: .htaccess files - Apache HTTP Server Version 2.4
ログローテーション設定
デフォルトのディレクトリにログを出力していれば不要なのですが、分かりやすさ優先で階層を作ったので、ログローテーション設定を追加します。
$ sudo cp -p /etc/logrotate.d/apache2 /etc/logrotate.d/adiary
$ vi /etc/logrotate.d/adiary
$ diff /etc/logrotate.d/apache2 /etc/logrotate.d/adiary
1c1
< /var/log/apache2/adiary/*.log {
---
> /var/log/apache2/*.log {
$ sudo systemctl status logrotate
特にサービス再起動とかは不要のよう。
設定ファイル有効化
設定ファイルを有効化する。
$ sudo a2ensite 001-adiary
Enabling site 201-adiary.
To activate the new configuration, you need to run:
  systemctl reload apache2
$ sudo apachectl configtest
$ sudo systemctl reload apache2
不要ファイル削除
また、不要になった設定ファイルは、混乱のもとなので消しておきます。
$ sudo find /var/www/adiary -name ".htaccess" -exec rm {} \;

Web 上での設定

DNS へ登録した URL (本サイトならば http://ttm.jimba.ddo.jp/) へアクセスして、root アカウント登録や、個別アカウントの登録などを行います。
root アカウント登録
案内にしたがって、管理者登録を行います。
http://ttm.jimba.ddo.jp/adiary.cgi?user/add
登録すると、登録した管理者ユーザでログインし直すようアナウンスがあるので、ログインし直します。
個別アカウント登録
ブログを更新するユーザ等、個別にアカウントを作成します。

Web での設定後

初期画面からのリダイレクト設定
初期画面から作成したブログ画面へ移動するため index.html を書き換えます。
$ cd /var/www/adiary
$ cp -p index.html{,_backup_$(date +'%Y%m%d')}
$ cat /dev/null > index.html
$ vi index.html
(書き換え)
$ cat index.html
<html>
  <head>
    <meta http-equiv="Refresh" content="0;URL=adiary.cgi">
  </head>
</html>
$ 
robots.txt
ボットに公開/非公開したい情報を教える設定。

以下はすべてのクロウラを拒絶する例

/var/www/adiary/robots.txt
User-agent: *
Disallow:

Win11 SSH サーバ設定 @22H2

2024/03/23 09:12 OS別::Windowsその他::技術情報
Windows 10 での SSH サーバ設定は、かなりの方に参照いただいているようで、感謝いたします。
基本的には Windows 11 でも同じような設定を行うのですが、手順としては微妙に変わるので、リライトしました。

ssh サーバの説明や接続方法等は Win10 SSH サーバ設定 を参照いただくとして、対象のバージョン、手順、起動方法までを説明範囲とします。

Windows 対象バージョン

設定 選択

スタートメニューを右クリックして「設定」を選択します。
設定
スタートメニューから設定選択

バージョン情報 選択

表示された設定画面をスクロールして、バージョン情報を選択します。
win11 バージョン情報
バージョン情報 選択
バージョン情報が表示されます。

表示されているバージョンが今回の記事で利用しているバージョンです。
この場合、Windows11 Pro のバージョンが 22H2 で、OS ビルドが 22621.1848 になります。
win11 Version
Windows バージョン情報
続けて ssh をインストールするため、この画面のメニューからアプリを選択します。

sshd インストール手順

アプリ

アプリ画面に移動したら、オプション機能を選択します。
オプション機能
オプション機能

アプリ > オプション機能

「オプション機能を追加する」の「機能を表示」を選択します。
機能を表示
機能を表示

オプション機能を追加する

OpenSSH サーバーを選択して、チェックがついたら「次へ」を選択します。
オプション機能を追加する
オプション機能を追加する

インストール

追加する機能を確認されるので、OpenSSH サーバーが表示されていることを確認して「インストール」を選択します。
インストール対象確認
インストール対象確認
OpenSSH サーバーがインストールされるのを待ちます。
win11 OpenSSH サーバー インストール待機
インストール 待機
インストールされると、インストール済みと表示されます。
もしくは、もう一度アプリのオプション機能画面を表示して、OpenSSH サーバーがあればインストールされています。
インストール済み
インストール確認
インストール確認

sshd 利用

サービス起動手順

OpenSSH サーバーは、サービスとして起動しないと SSH ログインできません。

サービス起動するために、まずスタートメニューを右クリックして「コンピューターの管理」を起動します。

win
コンピューターの管理選択画面
ここから「サービスとアプリケーション」→「サービス」へ移動すると「OpenSSH SSH Server」があります。

サービス選択
サービス選択画面

「OpenSSH SSH Server」をダブルクリックして「OpenSSH Server のプロパティ」を開きます。

まず、サービスが停止していることが分かります。

OpenSSH SSH Server のプロパティ
OpenSSH SSH Server のプロパティ画面
「開始」ボタンをクリックして、サービスを実行しておきます*1

また、Windows を起動したらサービスも起動させたい場合は、「全般」タブの「スタートアップの種類」を「手動」から「自動」に変更して「OK」ボタンをクリックします。

スタートアップの種類選択
スタートアップの種類選択画面

ユーザ

普段、私は Windows に xxx@hotmail.co.jp のアカウント(いわゆる Microsoft アカウント)を利用してログインしています。
このアカウントでは、ssh によるリモートアクセスができませんでした。

ということで、ローカルアカウントの作成が必要です。

スタートメニューを右クリックしたときにでる「コンピューターの管理」は、すでに起動しているものと思います。
「コンピューターの管理(ローカル)」→「システムツール」→「ローカル ユーザーとグループ」→「ユーザー」と開いていくと、sshd ユーザが自動で作られているのが確認できました。

この「ユーザー」か、「ユーザー」を選択して出てきた右ペインを右クリックすると「新しいユーザー」が出てくるので、これをクリックして ssh 接続するための新しいユーザーを追加します。

RDP だと、Administrators グループまたはリモートデスクトップユーザーグループに追加しなければなりません。
ここで作成したアカウントは Administrators グループに入れてしまいましたが、OpenSSH でのアクセスの場合はユーザー登録だけで良いようです(未確認)。

sshd_conf

OpenSSH サーバーとして設定は、以下フォルダの設定ファイルで行います。
%SystemRoot%\System32\OpenSSH
管理者権限でテキストエディタを起動したら sshd_config_default を開いて sshd_config という名前で別名保存します。

コマンドプロンプトを管理者権限で起動すると、簡単にコピーできます。

Win キーを押して cmd を入力し、Ctrl + Shift キーを押しつつ Enter すると、管理者権限でコマンドプロンプトを起動できます。
C:\WINDOWS\system32>cd OpenSSH
C:\Windows\System32\OpenSSH>dir
C:\Windows\System32\OpenSSH>copy sshd_config_default sshd_config
C:\Windows\System32\OpenSSH>notepad sshd_config
C:\Windows\System32\OpenSSH>

アンチウィルスソフト

Norton Internet Security をインストールしていますが、LAN 内の Linux サーバからアクセスする場合、特に何の設定も必要なくアクセスできました。

アクセスできない場合、インストールされているアンチウィルスソフトの設定を確認してみてください。

*1 : プロパティ画面ではなく、サービス選択で「OpenSSH SSH Server」を右クリックして「開始」を選択しても SSH 接続を受け付けるようになります。

Windows 11 への SSH 接続

Tera Term でアクセスする場合、通常の UNIX / Linux へアクセスするのと手順は同じです。

そのまま localhost:22 へ ssh アクセスすると、通常のログイン処理でアクセス可能です。

詳細については、Win10 SSH サーバ設定 の SSH 接続方法を参照してみてください

以降、2024.3.2 追記。

質問があり、現時点のバージョンでローカルアカウントを作って、Tera Term でアクセスできることを確認しましたので、簡単に追記します。

[追記] Tera Term ログイン

Windows11 端末に、管理権限のあるユーザでログインしていることをユーザー作成の前提条件とします。

バージョン情報

記事に投稿当時より Windows のバージョンが上がっているので、現時点のバージョン情報を記載します。
Win11 Version

sshd サービス確認

Ctrl + Shift + Esc 等でタスクマネージャーを起動し、サービスを選択します。
sshd サービス起動
ここで、状態が「停止」であれば、右クリックして開始をクリックし、実行中にさせます。

上記画像の通り、sshd の「状態」欄が「実行中」になっていれば大丈夫です。

ローカルアカウント追加

ユーザー作成ですが、開いているタスクマネージャーのメニューからユーザーを選択して、そのままユーザーアカウントの管理をクリックします。
ユーザアカウントの管理

ユーザーアカウントの画面がでたら、別のアカウントの管理を選択します。
別のアカウントの管理

「PC 設定で新しいユーザーを追加」をクリックします。
PC 設定で新しいユーザーを追加

「アカウントの追加」をクリックします。
アカウントの追加

Microsoft アカウント画面が表示されたら「このユーザーのサインイン情報がありません」を選択します。
Microsoft アカウント 1

続いて「Microsoft アカウントを持たないユーザーを追加する」を選択します。
Microsoft アカウント 2

やっとローカルアカウントを作成する画面が表示されるので、必要事項を入力します。
Microsoft アカウント 3

ここでは、サンプルとして test ユーザーを作成します。
まず、ユーザー名とパスワードを入力します。
Microsoft アカウント 情報入力 1

下へスクロールして、パスワードを忘れた場合の質問に回答します。
ここでは、すぐに削除するので x で埋めていますが、忘れた際に必要になります。
Microsoft アカウント 情報入力 2

すべて入力して「次へ」をクリックすると、以下の「ほかのユーザー」画面に戻りますので、ユーザーが作られたことを確認します。

ここで作られたユーザーの「アカウントの種類」は「標準ユーザー」です。
アカウント確認画面

リモートアクセスするユーザーに管理者権限が必要な場合は、別途管理者権限を付与してください。

レビュービルド26052以降であれば、Linux の sudo コマンドと同じコマンドが実装されるとのこと。

Windows11 へ SSH アクセス

Tera Term で Windows 11 に対してアクセスし、先ほど設定したユーザー名およびパスワードを入力すると、Windows 11 のターミナル(ここではデフォルトの cmd.exe を利用)にログインできます。
Tera Term から SSH ログイン
ここでは Raspberry Pi からアクセスしていますが、ローカル (localhost)でもアクセス可能です。


流れを見てもらえれば分かる通り、SSHd が動作していれば、Windows 端末の「標準ユーザー」で Tera Term から SSH アクセスが可能です。

祝日を返すマクロ [Excel VBA]

2024/03/26 05:56 OS別::Windowsその他::技術情報
Excel VBA で、毎年祝祭日リストを更新しなくても祝日を自動計算して返すマクロができないか見ていたら、なんとできそうでした。

使うためには、fnWeekday 関数(Public 関数)を Excel のセルに記述して利用してください。
少なくとも、2023年~2025年は問題なさそうです。
(2023.6.25 2025年の「敬老の日」が祝日にならない問題を修正)
(2024.3.2 Date 関数の戻り値が日付型と判定できない問題を修正)

最終的に挙動を確認した Excel バージョンは、次の通りです。
Microsoft® Excel® for Microsoft 365 MSO (バージョン 2401 ビルド 16.0.17231.20236) 64 ビット

仕様

モジュール

モジュール内の関数を Excel のセルで利用します。
主に利用する関数は fnWeekday です。

セルには =fnWeekday(シリアル値) を指定することで戻り値を得ることができます。

fnWeekday 実行サンプル
fnWeekday 実行サンプル

また、=fnWeekday(シリアル値, 1) のように第2引数に 1 を指定すると、平日と休日、祝日の名称のいずれかを得ることができます。
これが 2 の場合は「祝日の趣旨」(画像における D 列)を得ます。

fnWeekday オプションを指定時の実行サンプル
fnWeekday オプションを指定時の実行サンプル

出力利用例
セル内の記述例出力例備考
=fnWeekday(DATE(2024,5,5))8祝日を示す 8 を表示する
=fnWeekday(DATE(2024,5,5),1)こどもの日平日/休日/(祝日の名称)の、いずれかを表示する
=fnWeekday(DATE(2024,5,5),2)こどもの人格を重んじ、こどもの幸福をはかるとともに、母に感謝する。祝日の趣旨を表示する
fnWeekday 以外の関数は、内部で細かい計算をするために使われます。
(もちろん、セル内で利用することも可能です)

戻り値

戻り値は、第2引数の指定で変化します。
上述したように、デフォルトで weekday 関数とほぼ同じ*1ですが、追加で 8=祝日としています。

以下、第2引数を明記した場合の挙動を記載します。
0の場合:数値(デフォルト)
第2引数に 0 を指定した(もしくは指定しない)場合に出力される番号です。
デフォルト
番号内部変数意味備考
1vbSunday日曜日
2vbMonday月曜日
3vbTuesday火曜日
4vbWednesday水曜日
5vbThursday木曜日
6vbFriday金曜日
7vbSaturday土曜日
8-祝日
1 の場合:名称
第2引数に 1 を指定した場合に出力される文字列です。
名称を返す
文字列意味備考
休日土日どちらか
平日土日祝以外の平日(実際は月~金曜日)
(各祝日名)祝日
祝日の名称は、国民の祝日に関する法律に準拠しています。
2 の場合:趣旨
第2引数に 2 を指定した場合に出力される文字列です。
趣旨を返す
趣旨意味備考
(Nothing)平日/休日であり、祝日ではない日
(各祝日の趣旨)法律などで定義される趣旨
(Nothing) については、表示しないように(Null 表示に)するかもしれません。

*1 : weekday 関数のデフォルトの戻り値は 1=日, 2=月, 3=火, 4=水, 5=木, 6=金, 7=土になっています。

関数

作成したモジュールは、つぎの五つの関数から成り立っています。

fnWeekday(Serial, [Switch])

このモジュールの本丸で、公式の weekday 関数のように使います。
戻り値として曜日(vbMonday から vbSaturday)だけでなく、追加で Holiday を意味する 8 も返します。

オプションには、シリアル値が必要です。
戻り値の内容を変えるために、Switch 番号も指定可能です。

第2引数を指定した際に、セルに表示される内容は、次の通りです。
Switch意味備考
0曜日と祝日を意味する 1~8 の数字を返すSwitch を省略した場合のデフォルト
1平日/休日/祝日の名称を返す
2祝日の趣旨を返す

fnDate(Year, Month, Day)

Excel 関数 date コマンドを模したものです。
オプションには、年・月・日の、三つが必要です。

Excel VBA の場合、DateValue コマンドを使えばいいのですが、年月日を文字列で指定しなければならないため、コードがかなり読みにくくなっていました。
可読性を目的に関数化しています。

fnHappyMonday(Year, Month, Weeks)

ハッピーマンデー制度でシリアル値を取得するのに必要な、x年x月の第x月曜日、という指定でシリアル値を取得するための関数です。
オプションには、年・月・第x週の、三つが必要です。

考え方としては、月の1日が何曜日なのかを見て、そこから月曜日が何日なのかを割り出します。
あとは、7日に第x週のx-1 を掛けたものを足してあげれば、シリアル値を取得できます。

fnVernalEquinox(Year)

春分の日を割り出し、シリアル値を取得するための関数です。
オプションには、年の指定が必要です。

1行しかない、かなり短いコードですが関数化しています。
計算で出力した日付ではない場合、ここで出力情報を調整する予定です。

fnAutumnalEquinox(Year)

秋分の日を割り出し、シリアル値を取得するための関数です。
オプションには、年の指定が必要です。

1行しかない、かなり短いコードですが関数化しています。
計算で出力した日付ではない場合、ここで出力情報を調整する予定です。

ソースコード

Option Explicit

Public Function fnWeekday(Serial As Date, Optional Switch As Byte = 0)
' #########################################################################
' #
' # 呼び出されると、引数の Serial から曜日/祝日情報を返すマクロ
' # デフォルトの戻り値は、以下の通り
' #
' # 戻り値の定義
' #  0 = 平日(月曜~金曜)
' #  1 = 日曜日(vbSunday)
' #  2 = 曜日月(vbMonday)
' #  3 = 火曜日(vbTuesday)
' #  4 = 水曜日(vbWednesday)
' #  5 = 木曜日(vbThursday)
' #  6 = 金曜日(vbFriday)
' #  7 = 土曜日(vbSaturday)
' #  8 = 祝日
' #
' #########################################################################

' ### 変数定義 #########################

Dim DEFpDayName     As String
Dim DEFpDayMeaning  As String
Dim pDayName        As String
Dim pDayMeaning     As String
Dim pRV             As Byte
Dim pYYYY           As Integer
Dim fSubstitute     As Boolean

' ### 変数設定 #########################

DEFpDayName = "平日"
DEFpDayMeaning = "(Nothing)"

pDayName = DEFpDayName
pDayMeaning = DEFpDayMeaning

pYYYY = Year(Serial)

' ### メイン処理 #######################

' serial に指定された年月日と、該当する年の祝日に相当するシリアル値を比較する。
' 該当の祝日であれば、第2引数通りに変数を設定する。
' もし該当の祝日名があれば、戻り値 8 を指定する。

Select Case Serial
    ' 日付が固定されているもの
    Case fnDate(pYYYY, 1, 1)
        pDayName = "元旦"
        pDayMeaning = "年のはじめを祝う。"
    Case fnDate(pYYYY, 1, 15)
        If pYYYY <= 1999 Then
            pDayName = "成人の日"
            pDayMeaning = "おとなになったことを自覚し、みずから生き抜こうとする青年を祝い、励ます。"
        End If
    Case fnDate(pYYYY, 2, 11)
        pDayName = "建国記念の日"
        pDayMeaning = "建国をしのび、国を愛する心を養う。"
    Case fnDate(pYYYY, 2, 23)
        If 2019 < pYYYY Then
            pDayName = "天皇誕生日"
            pDayMeaning = "天皇の誕生日を祝う。"
        End If
    Case fnDate(pYYYY, 4, 29)
        If 2007 <= pYYYY Then
            pDayName = "昭和の日"
            pDayMeaning = "激動の日々を経て、復興を遂げた昭和の時代を顧み、国の将来に思いをいたす。"
        ElseIf 1989 <= pYYYY Then
            pDayName = "みどりの日"
            pDayMeaning = "自然の恩恵に感謝する"
        ElseIf 1948 <= pYYYY Then
            pDayName = "天皇誕生日"
            pDayMeaning = "天皇の誕生を祝う(昭和天皇)"
        ElseIf 1927 <= pYYYY Then
            pDayName = "天長節"
            pDayMeaning = "天地が永久であるように天皇の治世も続くように"
        End If
    Case fnDate(pYYYY, 5, 3)
        pDayName = "憲法記念日"
        pDayMeaning = "日本国憲法の施行を記念し、国の成長を期する。"
    Case fnDate(pYYYY, 5, 4)
        If 2007 <= pYYYY Then
            pDayName = "みどりの日"
            pDayMeaning = "自然に親しむとともにその恩恵に感謝し、豊かな心をはぐくむ。"
        End If
    Case fnDate(pYYYY, 5, 5)
        pDayName = "こどもの日"
        pDayMeaning = "こどもの人格を重んじ、こどもの幸福をはかるとともに、母に感謝する。"
    Case fnDate(pYYYY, 7, 20)
        If pYYYY <= 2002 Then
            pDayName = "海の日"
            pDayMeaning = "海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。"
        End If
    Case fnDate(pYYYY, 8, 11)
        ' 2014年制定、2016年より施工
        If 2016 <= pYYYY Then
            pDayName = "山の日"
            pDayMeaning = "山に親しむ機会を得て、山の恩恵に感謝する。"
        End If
    Case fnDate(pYYYY, 9, 15)
        If pYYYY <= 2002 Then
            pDayName = "敬老の日"
            pDayMeaning = "多年にわたり社会につくしてきた老人を敬愛し、長寿を祝う。"
        End If
    Case fnDate(pYYYY, 11, 3)
        pDayName = "文化の日"
        pDayMeaning = "自由と平和を愛し、文化をすすめる。"
    Case fnDate(pYYYY, 11, 23)
        pDayName = "勤労感謝の日"
        pDayMeaning = "勤労をたっとび、生産を祝い、国民たがいに感謝しあう。"
    Case fnDate(pYYYY, 12, 23)
        If pYYYY < 2019 Then
            ' 以降、上皇陛下
            pDayName = "天皇誕生日"
            pDayMeaning = "天皇の誕生日を祝う。"
        End If
End Select

Select Case Serial
    ' ハッピーマンデー
    Case fnHappyMonday(pYYYY, 1, 2)
        ' 2000 年より適用
        If 2000 <= pYYYY Then
            pDayName = "成人の日"
            pDayMeaning = "おとなになったことを自覚し、みずから生き抜こうとする青年を祝いはげます。"
        End If
    Case fnHappyMonday(pYYYY, 7, 3)
        If 2003 <= pYYYY Then
            ' 2003 年より適用
            pDayName = "海の日"
            pDayMeaning = "海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。"
        End If
    Case fnHappyMonday(pYYYY, 9, 3)
        If 2003 <= pYYYY Then
            pDayName = "敬老の日"
            pDayMeaning = "多年にわたり社会につくしてきた老人を敬愛し、長寿を祝う。"
        End If
    Case fnHappyMonday(pYYYY, 10, 2)
        ' 2000 年より適用。2020 年より名称変更
        If 2020 <= pYYYY Then
            pDayName = "スポーツの日"
            pDayMeaning = "スポーツを楽しみ、他者を尊重する精神を培うとともに、健康で活力ある社会の実現を願う。"
        ElseIf 2000 <= pYYYY Then
            pDayName = "体育の日"
            pDayMeaning = "スポーツにしたしみ、健康な心身をつちかう日"
        End If

    ' 春分/秋分の日
    Case fnVernalEquinox(pYYYY)
        pDayName = "春分の日"
        pDayMeaning = "自然をたたえ、生物をいつくしむ。"
    Case fnAutumnalEquinox(pYYYY)
        pDayName = "秋分の日"
        pDayMeaning = "祖先をうやまい、なくなった人々をしのぶ。"
End Select

' 天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律
Select Case Serial
    Case fnDate(2019, 5, 1)
        pDayName = "天皇の即位の日"
    Case fnDate(2019, 5, 2)
        pDayName = "国民の休日"
    Case fnDate(2019, 10, 22)
        pDayName = "即位礼正殿の儀の行われる日"
End Select

' 振替休日
Select Case Serial
    Case fnDate(pYYYY, 1, 1) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 2, 11) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 2, 23) + 1
        If 2019 < pYYYY Then
            If Weekday(Serial) = vbMonday Then fSubstitute = True
        End If
    Case fnDate(pYYYY, 4, 29) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 5, 5) + 1
        ' 5月5日が日曜~火曜日だったら、5/6 が振替休日
        If vbSunday <= Weekday(fnDate(pYYYY, 5, 5)) And Weekday(fnDate(pYYYY, 5, 5)) <= vbTuesday Then
            fSubstitute = True
        End If
    Case fnDate(pYYYY, 8, 11) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 11, 3) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 11, 23) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnDate(pYYYY, 12, 23) + 1
        If pYYYY < 2019 Then
            ' 以降、上皇陛下
            If Weekday(Serial) = vbMonday Then fSubstitute = True
        End If
        
    ' ハッピーマンデー
    Case fnHappyMonday(pYYYY, 1, 2) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnHappyMonday(pYYYY, 7, 3) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnHappyMonday(pYYYY, 9, 3) + 1
        ' シルバーウィーク対応
        ' もし、敬老の日の2日後が秋分の日なら、国民の休日にする。
        If fnHappyMonday(pYYYY, 9, 3) + 2 = fnAutumnalEquinox(pYYYY) Then
            pDayName = "国民の休日"
        ElseIf Weekday(Serial) = vbMonday Then
            fSubstitute = True
        End If
        
    Case fnHappyMonday(pYYYY, 10, 2) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True

    ' 春分/秋分の日
    Case fnVernalEquinox(pYYYY) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    Case fnAutumnalEquinox(pYYYY) + 1
        If Weekday(Serial) = vbMonday Then fSubstitute = True
    'Case DateValue("2020/9/22")
    '    DayName = "秋分の日"

End Select

If fSubstitute = True Then pDayName = "振替休日"

' -----------------------------------------------------------
' 令和 2 年(2020年)及び令和 3 年(2021年)に限り、
' 東京オリンピック・パラリンピック競技大会の開催にあわせ、
' 「海の日」、「スポーツの日」及び「山の日」が移動している。
' -----------------------------------------------------------

' 令和2年 (2020) & 令和3年 (2021)
Select Case Serial
    ' 海の日
    Case fnHappyMonday(2020, 7, 3), fnHappyMonday(2021, 7, 3)
        pDayName = DEFpDayName
        pDayMeaning = DEFpDayMeaning
    Case fnDate(2020, 7, 23)
        pDayName = "海の日"
        pDayMeaning = "海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。"
    Case fnDate(2021, 7, 22)
        pDayName = "海の日"
        pDayMeaning = "海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。"

    ' スポーツの日
    Case fnHappyMonday(2020, 10, 2), fnHappyMonday(2021, 10, 2)
        pDayName = DEFpDayName
        pDayMeaning = DEFpDayMeaning
    Case fnDate(2020, 7, 24)
        pDayName = "スポーツの日"
        pDayMeaning = "スポーツを楽しみ、他者を尊重する精神を培うとともに、健康で活力ある社会の実現を願う。"
    Case fnDate(2021, 7, 23)
        pDayName = "スポーツの日"
        pDayMeaning = "スポーツを楽しみ、他者を尊重する精神を培うとともに、健康で活力ある社会の実現を願う。"

    ' 山の日
    Case fnDate(2020, 8, 11), fnDate(2021, 8, 11)
        pDayName = DEFpDayName
        pDayMeaning = DEFpDayMeaning
    Case fnDate(2020, 8, 10)
        pDayName = "山の日"
        pDayMeaning = "山に親しむ機会を得て、山の恩恵に感謝する。"
    Case fnDate(2021, 8, 8)
        pDayName = "山の日"
        pDayMeaning = "山に親しむ機会を得て、山の恩恵に感謝する。"
End Select

' 祝日値判定
If pDayName = DEFpDayName Then
    ' 平日/休日であれば、戻り値を 1~7 で指定する。
    ' ## 曜日選択 #####
    If IsDate(Serial) Then
        Select Case Weekday(Serial)
            Case vbSunday
                pRV = vbSunday
                pDayName = "休日"
            Case vbMonday
                pRV = vbMonday
            Case vbTuesday
                pRV = vbTuesday
            Case vbWednesday
                pRV = vbWednesday
            Case vbThursday
                pRV = vbThursday
            Case vbFriday
                pRV = vbFriday
            Case vbSaturday
                pRV = vbSaturday
                pDayName = "休日"
        End Select
    Else
        ' IsDate の判定内容にエラーがある場合
        fnWeekday = "祝日値判定エラー"
        Exit Function
    End If
Else
    ' 平日でなければ、戻り値を 8 で指定する。
    pRV = 8
End If

' ### 終了処理 #########################

' オプションの内容で、戻り値を変更する。
Select Case Switch
    Case 0
        fnWeekday = pRV
    Case 1
        fnWeekday = pDayName
    Case 2
        fnWeekday = pDayMeaning
End Select

' ######################################

End Function

Public Function fnDate(Year, Month, Day)
' #########################################################################
' #
' # VBA の date 関数は、Excel sheet の date 関数と異なり、文字列を指定する。
' # この関数は、セルで利用する date 関数と同じ使い勝手を実現するもの。
' #
' #########################################################################

fnDate = DateValue(Year & "/" & Month & "/" & Day)

End Function

Public Function fnHappyMonday(Year, Month, Weeks)
' #########################################################################
' #
' # ハッピーマンデー用のシリアル値を返す。
' # 指定された、Year 年 Month 月の第 Weeks 週の月曜日(シリアル値)を返す。
' #
' # 参考資料
' # http://www.relief.jp/itnote/archives/003241.php
' #########################################################################

Dim pMondayDate     As Byte
Dim pFirstMonDay    As Date

' ## 第1週目の月曜日を求める。

' 先に指定月の1日が何曜日なのかを見て、次の月曜日が何日なのかを指定する。
Select Case Weekday(fnDate(Year, Month, 1))
    Case vbSunday       ' 1
        ' x月1日が日曜日なら、月曜日は翌日の 2 日
        pMondayDate = 2
    Case vbMonday       ' 2
        ' x月1日が月曜日なので、そのまま 1 日
        pMondayDate = 1
    Case vbTuesday      ' 3
        ' x月1日が火曜日なので、月曜日は 6 日後の 7 日
        pMondayDate = 7
    Case vbWednesday    ' 4
        ' x月1日が水曜日なので、月曜日は 5 日後の 6 日
        pMondayDate = 6
    Case vbThursday     ' 5
        pMondayDate = 5
    Case vbFriday       ' 6
        pMondayDate = 4
    Case vbSaturday     ' 7
        pMondayDate = 3
End Select

' 第1週目の月曜日から何週間後なのか、必要な日数を足してシリアル値を返す。
fnHappyMonday = fnDate(Year, Month, pMondayDate) + (7 * (Weeks - 1))

End Function

Public Function fnVernalEquinox(Year)
' #########################################################################
' #
' # 呼び出されると、引数の Year から算出した 春分の日 情報を返すマクロ
' #
' # 参考 URL http://www.wanichan.com/pc/excel/2010/5/page07.html
' #########################################################################
fnVernalEquinox = fnDate(Year, 3, Int(20.8431 + 0.242194 * (Year - 1980) - Int((Year - 1980) / 4)))

End Function

Public Function fnAutumnalEquinox(Year)
' #########################################################################
' #
' # 呼び出されると、引数の Year から算出した 秋分の日 情報を返すマクロ
' #
' # 参考 URL http://www.wanichan.com/pc/excel/2010/5/page07.html
' #########################################################################
fnAutumnalEquinox = fnDate(Year, 9, Int(23.2488 + 0.242194 * (Year - 1980) - Int((Year - 1980) / 4)))

End Function

その他

zip ファイル

コピペより、インポート可能なファイルが良いという方向け。
現在バージョン
過去バージョン

更新履歴

  • 2023.3.5 細かい表現と、マクロの微修正を行った。
  • 2023.6.25 敬老の日に関するご指摘をいただき、ハッピーマンデーの扱いを修正*2 した。
  • 2024.3.2 オプションに Date を指定した場合 0 が返ってくる現象についてご指摘をいただき、IsDate 関数で判断する値を CVDate 関数で日付型へ事前に変換*3するようにした。
  • 2024.3.2 IsDate 関数で判断する Serial について、fnWeekday 関数にオプションとして入力する時点で Date 型であることを強制した。

*2 : シリアル値で祝日を判断するフローで、固定されていた敬老の日(2002年以前)を分岐させたあとにハッピーマンデーの分岐が来ており、ハッピーマンデー対象である敬老の日が分岐済みの扱いになってチェックされない流れになっていた。

*3 : VBA の IsDate 関数が、Date 関数で取得した値そのままだと、数値を日付と判断できない。

参考サイト様

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

その他

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