はじめに
本記事は「AWS EC2 × Zabbix監視基盤構築シリーズ」の第4回です。
以下の続きとなります。
- 第1回:『【構築ログ①】AWS EC2 × Zabbix監視基盤|IAMユーザーでEC2構築~SSH接続まで』
https://qiita.com/AWS_show/items/827c25c17d1b99da08e0 - 第2回:【構築ログ②】AWS EC2 × Zabbix監視基盤|Zabbix 6.0 をEC2に構築|ハマりポイントまとめ
https://qiita.com/AWS_show/items/1d57f767a9a66835b398 - 第3回:【構築ログ③】AWS EC2 × Zabbix監視基盤|トリガー発火~復旧までの監視検証
https://qiita.com/AWS_show/items/fe7474a1a0f96c64a7f2
第4回では、EC2 上に構築した Zabbix のログを CloudWatch Logs に集約し、S3 にエクスポートして長期保管する構成 の構築および検証手順をまとめています。
構成の再確認
本シリーズでは、単一のEC2インスタンス上に
Zabbix Server / Agent を構築し、
監視データを CloudWatch Logs 経由で S3 に集約する構成を採用しています。
本記事では、セキュリティ面も考慮し、
以下の方針で構成しています。
- EC2 には IAM ロールを使用(アクセスキー未使用)
- CloudWatch Logs → S3 はサービスプリンシパルで制御
- バケットポリシーで最小限の権限付与
という構成としています。
検証環境
本記事の検証は、以下の環境で実施しています。
| 項目 | 内容 |
|---|---|
| クラウド | AWS |
| サービス | EC2 |
| OS | Ubuntu Server 22.04 LTS |
| Zabbix | 6.0 LTS |
| Webサーバ | Apache |
| DB | MariaDB |
| PHP | Ubuntu標準(Apache連携) |
| リージョン | ap-northeast-1(東京) |
IAMロールの作成権限を与える
本検証では、管理者権限は IAM ユーザーに直接付与せず、
管理者権限を持つ IAM グループを作成し、
対象ユーザーをそのグループに所属させる構成としました。
これにより、ユーザー単位で権限を管理するのではなく、
グループ単位で権限管理を行うことができ、
運用性およびセキュリティの向上が期待できます。
なお、本検証では作業効率を考慮し、
AdministratorAccess を付与したグループを使用しています。
実運用では、最小権限の IAM ポリシーを設計する必要があります。
IAMロールを作る(EC2用)
信頼されたエンティティ:AWS のサービス
ユースケース:EC2

許可ポリシーで CloudWatchAgentServerPolicy 付与

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

※EC2ロール(CloudWatchAgentServerPolicy)は「EC2→CloudWatch Logsへ送る」ための権限です。
CloudWatch Logs→S3エクスポートは CloudWatch Logs サービスが実行するため、S3側のバケットポリシーで許可します。
EC2にロールをアタッチ
IAMロールが利用できているか確認(STS)
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
# CloudWatch Agent をダウンロード
sudo dpkg -i amazon-cloudwatch-agent.deb
# パッケージをインストール
インストールされているか確認
ls /opt/aws/amazon-cloudwatch-agent/
# CloudWatch Agent がインストールされたディレクトリの中身を表示
CloudWatch Agent は /opt/aws/amazon-cloudwatch-agent/ に
インストールされます。
主に確認するディレクトリは以下です。
- bin:実行ファイル
- etc:設定ファイル
- logs:エージェントログ
特に logs ディレクトリは、
トラブルシューティング時に重要となります。
CloudWatch Agent を使用する理由
EC2 の標準 CloudWatch メトリクスでは、
CPU やネットワークなどの基本情報のみ取得可能です。
CloudWatch Agent を使用することで、
メモリ・ディスク使用率や OS / アプリケーションログを
CloudWatch Logs / Metrics に送信できます。
本構成では、Zabbix ログを CloudWatch Logs に集約し、
S3 に長期保管するために導入しています。
設定ファイルを作成
Zabbixのログのパスを確認
ls /var/log/zabbix/
zabbix_agentd.log zabbix_server.log
zabbix_agentd.log と zabbix_server.logを CloudWatch Logs に集約します。
CloudWatch Agent の設定用 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",
"retention_in_days": 30
},
{
"file_path": "/var/log/zabbix/zabbix_agentd.log",
"log_group_name": "/zabbix/agent",
"log_stream_name": "{instance_id}",
"timezone": "Local",
"retention_in_days": 30
}
]
}
}
}
}
設定項目の補足
■ retention(ログ保持期間)を設定する理由
CloudWatch Logs のログ保持期間は、デフォルトでは無期限に保存されます。
無期限保存のまま運用すると、ログが蓄積され続け、ストレージコストが増加する可能性があります。
そのため、本構成では retention_in_days を設定し、
一定期間経過後にログが自動削除されるようにしています。
例:
- 7日:短期検証環境
- 30日:一般的な運用ログ
- 90日以上:監査用途
■ timezone を Local に設定する理由
CloudWatch Logs は基本的に UTC でログを扱います。
一方で、EC2 上のアプリケーションログ(今回の場合は Zabbix ログ)は
OS のローカルタイム(JST)で出力されることが多くあります。
そのため timezone を Local に設定することで、
CloudWatch Logs 上でも OS と同じ時刻基準でログを確認でき、
障害調査やログ解析が容易になります。
■ log_stream_name に instance_id を使用する理由
本構成では log_stream_name に {instance_id} を使用しています。
これにより、EC2 インスタンスごとにログストリームが自動的に分離されます。
この設定を行うことで:
・複数インスタンス運用時のログ分離が容易
・Auto Scaling 環境でも自動的にログを識別可能
・障害発生時に対象インスタンスを特定しやすい
といったメリットがあります。
設定反映&起動
CloudWatch Agent に設定ファイルを読み込ませ、サービスを起動します。
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
| オプション | 役割 |
|---|---|
| -a fetch-config | 設定読み込み |
| -m ec2 | 実行環境指定 |
| -c file: | 設定ファイル指定 |
| -s | Agent起動 |
実行後に行われる処理
・設定ファイルの読み込み
・CloudWatch Logs への送信設定の反映
・CloudWatch Agent サービスの起動
CloudWatch Agent がログを送れているか確認
CloudWatch Agentが動いているか確認します。
sudo systemctl status amazon-cloudwatch-agent
CloudWatch → ログ → Log Management

ロググループに /zabbix/agent と /zabbix/server が表示されているので、ログが送られています。
S3バケットを作成
S3 → バケットを作成
バケット名: your-bucket-name (例)

バケットポリシーの設定
S3 → バケット → 作成したバケット → アクセス許可 → バケットポリシー
本記事では例として以下の値を使用しています。
- バケット名:zabbix-log-archive(例)
実際に設定する際は、以下を自分の環境の値に置き換えてください。
- バケット名
- AWSアカウントID
- CloudWatch Logs の ARN
バケットポリシー内の "Resource" には、対象となる S3 バケット名を指定します。
また、本構成ではセキュリティ向上のため、以下の条件を付与しています。
-
aws:SourceAccount
→ 指定した AWS アカウントからのアクセスのみ許可 -
aws:SourceArn
→ 指定した CloudWatch Logs(ロググループ)からのアクセスのみ許可
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudWatchLogsGetBucketAcl",
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::your-bucket-name",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/zabbix/*"
}
}
},
{
"Sid": "AllowCloudWatchLogsPutObject",
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::your-bucket-name/*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/zabbix/*"
}
}
}
]
}
バケットポリシー欄に貼り付けて 保存 をクリック
各設定項目の解説
| 項目 | 設定値例 | 役割 | 解説 |
|---|---|---|---|
| Version | 2012-10-17 | ポリシーバージョン | IAMポリシーの構文バージョン。現在は基本これ固定。 |
| Statement | 配列 | ポリシールール本体 | 複数ルールをまとめて定義する。 |
| Sid | AllowCloudWatchLogsGetBucketAcl | ルール識別子 | 任意。運用時の可読性向上のために付ける。 |
| Effect | Allow | 許可 or 拒否 | Allow = 許可 / Deny = 拒否 |
| Principal | logs.ap-northeast-1.amazonaws.com | 誰に許可するか | CloudWatch Logs サービスに許可を与えている。 |
| Action | s3:GetBucketAcl | 許可する操作 | CloudWatch Logs が S3 に書き込めるか確認するために必要。 |
| Action | s3:PutObject | 許可する操作 | CloudWatch Logs が S3 にログファイルを書き込むために必要。 |
| Resource | arn:aws:s3:::bucket-name | 対象バケット | バケット本体。ACL確認時に使用。 |
| Resource | arn:aws:s3:::bucket-name/* | 対象オブジェクト | バケット内のファイル書き込み対象。 |
| Condition | 制限条件 | セキュリティ強化 | 特定の条件を満たした場合のみ許可する。 |
| aws:SourceAccount | AWSアカウントID | アカウント制限 | 指定アカウントからのアクセスのみ許可。 |
| aws:SourceArn | CloudWatch Logs ARN | リソース制限 | 指定ロググループからのアクセスのみ許可。 |
CloudWatch Logs から S3 にログをエクスポートする
CloudWatch → ログ → Log Management → ロググループを選択
/zabbix/server を選択しました。

バケット名: <先ほど作ったバケット名>
エクスポートをクリック

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

ダウンロードして解凍を行います
メモ帳で開くと、ログファイルであることが確認できました
最後に
今回の検証を通して、 CloudWatch Logs と S3 を組み合わせたログ保管構成の基本的な流れを理解することができました。
本構成により、EC2 上で動作する Zabbix のログを CloudWatch Logs に集約し、
S3 へ長期保管できるログ基盤を構築できました。
これにより、以下を実現できます。
- ログの一元管理
- 長期保管による監査対応
- EC2 ローカルディスク容量の圧迫回避
- CloudWatch Logs による検索・分析の容易化
本記事ではログ基盤の構築を主目的とし、
CloudWatch Logs から S3 へのエクスポートは手動または都度実行を前提としています。
なお、ログエクスポートの自動化(EventBridge + Lambda + ExportTask)については、
オプション構成として別記事で検証予定です。
今回の検証で重要だと感じたポイント
- CloudWatch Logs → S3 エクスポート時には
s3:GetBucketAcl権限が必要 - Export は「イベント発生時刻」を基準に抽出される
- CloudWatch Logs と S3 は同一リージョン構成が必要
- IAM ロールによりアクセスキー不要で安全に API 利用が可能
- CloudWatch Logs(検索・可視化)と S3(低コスト長期保管)を組み合わせることで、実務でも利用されるログ基盤を構築できる
本検証を通じて、
実務でも採用される「CloudWatch Logs × S3」のログ基盤を、
設計意図を含めて理解できた点は大きな収穫でした。
【補足】Zabbix と CloudWatch の役割分担
| Zabbix | CloudWatch |
|---|---|
| 監視・アラート | ログ保管 |
| リアルタイム検知 | 長期保存 |
| 運用監視 | 監査・分析 |






