はじめに
本記事は
「AWS EC2 × Zabbix監視基盤構築シリーズ」
の第4回です。
本記事では、EC2 上に構築した Zabbix のログを CloudWatch Logs に集約し、S3 にエクスポートして長期保管する構成 を検証した手順をまとめています。
本検証では以下の役割分担を意識して構成を組みました。
- Zabbix:監視・検知
- CloudWatch Logs:ログ集約・可視化
- S3:長期保管・アーカイブ
本検証ではセキュリティ面も考慮し、
- EC2 には IAM ロールを使用(アクセスキー未使用)
- CloudWatch Logs → S3 はサービスプリンシパルで制御
- バケットポリシーで最小限の権限付与
という構成としています。
構成図
Zabbixログ
↓
CloudWatch Agent
↓
CloudWatch Logs(ロググループ)
↓
S3(長期保管)
logの存在を確認
ls /var/log/zabbix/
zabbix_agentd.log
zabbix_server.log
IAMロールを作る(EC2用)
IAMユーザーにロールを作る権限を与えていないため、rootでこの作業を行いました。
信頼されたエンティティ:AWS のサービス
ユースケース:EC2

許可ポリシーで CloudWatchAgentServerPolicy 付与

名前を付けて、<ロールを作成>をクリック。
名前: EC2Role-ZabbixCWAgent

EC2にロールをアタッチ
続けて、rootでこの作業を行いました。
ポリシーがアタッチされているか確認
AWS CLI をインストール
sudo apt update
sudo apt install -y awscli
バージョンを確認
aws --version
aws-cli/1.22.34 Python/3.10.12 Linux/6.8.0-1044-aws botocore/1.23.34
ポリシーの確認
aws sts get-caller-identity
EC2には IAMロールをアタッチしており、
AWS CLI はロール経由で一時クレデンシャルを取得してAPI を実行しています。
アクセスキーは使用していません。
CloudWatch Agent をインストール
cd /tmp
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb
インストールされているか確認
ls /opt/aws/amazon-cloudwatch-agent/
LICENSE NOTICE RELEASE_NOTES THIRD-PARTY-LICENSES bin doc etc logs var
# インストール成功
設定ファイルを作成
ログのパスを確認
ls /var/log/zabbix/
zabbix_agentd.log zabbix_server.log
ログのパスに合わせて、jsonファイルを作成
sudo vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/zabbix/zabbix_server.log",
"log_group_name": "/zabbix/server",
"log_stream_name": "{instance_id}",
"timezone": "Local"
},
{
"file_path": "/var/log/zabbix/zabbix_agentd.log",
"log_group_name": "/zabbix/agent",
"log_stream_name": "{instance_id}",
"timezone": "Local"
}
]
}
}
}
}
設定反映&起動
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \
-s
CloudWatch Agent がログを送れているか確認
sudo systemctl status amazon-cloudwatch-agent
コンソール画面では、CloudWatch Logsに反映されています。

S3バケットを作成
S3 → バケットを作成
EC2を作ったリージョンと同じにする(私は間違えてシドニーで作ってしまったため、シドニーです)
バケットポリシーの設定
S3 → バケット → 作成したバケット → アクセス許可 → バケットポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudWatchLogsGetBucketAcl",
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-southeast-2.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::zabbix-log-archive-842675991179"
},
{
"Sid": "AllowCloudWatchLogsPutObject",
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-southeast-2.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::zabbix-log-archive-842675991179/*"
}
]
}
"Resource": はS3の名前を入れる。
CloudWatch Logs を開く
CloudWatch → ログ → Log Management → ロググループを選択
/zabbix/server を選択しました。

2026/02/05のログを送ります。
バケット名の欄で、先ほど作ったバケット名を選択。
エクスポートをクリック。

S3 → バケットから以下のフォルダが作成されるので、潜っていくと

ダウンロードして解凍を行う。ログファイルであることが確認できた。

さいごに
今回の検証を通して、
CloudWatch Logs と S3 を組み合わせたログ保管構成の基本的な流れを理解することができました。
特に以下の点は重要なポイントだと感じました。
- CloudWatch Logs から S3 エクスポート時には s3:GetBucketAcl 権限が必要になる
- CloudWatch Logs Export は「イベント発生時刻」を基準に抽出される
- CloudWatch Logs と S3 は同一リージョンで構成する必要がある
- IAM ロールを利用することでアクセスキーを使用せずに安全に API を利用できる
- CloudWatch Logs は検索・可視化に優れ、S3 は低コストで長期保管に優れているため、
両者を組み合わせることで実務でもよく使われるログ基盤を構築できると理解できました。






