サイトアイコン 協栄情報ブログ

AnsibleでTD-Agentを使ったログ収集システムの構築

📖 目次

  1. はじめに
  2. システム概要
  3. アーキテクチャ設計
  4. 前提条件・要件
  5. 実装手順
  6. 設定詳細
  7. 監視・運用
  8. セキュリティ対策
  9. トラブルシューティング
  10. 最適化・改善提案
  11. 参考資料

🚀 はじめに

現場のインフラ運用において、ログの収集と監視は重要な要素です。本ガイドでは、AWS環境でAnsibleを使用してTD-Agentを自動構築し、NewRelicへの統合ログ送信システムを実現する包括的な手順を解説します。

🎯 本ブログの目標


📊 システム概要

TD-Agentとは?

TD-Agent(Treasure Data Agent)は、ログ収集ツールFluentdの安定版ディストリビューションで、以下の特徴を持ちます:

🔧 主な特徴

特徴 詳細 ビジネス価値
高い拡張性 500以上のプラグインエコシステム 多様なデータソースに対応
信頼性 バッファリング・リトライ機能 データ損失ゼロを実現
高性能 イベント駆動型アーキテクチャ 低レイテンシ・高スループット
統一性 JSON形式でのログ構造化 分析・検索効率の向上
軽量性 最小限のリソース使用量 コスト効率の最適化

🏗️ アーキテクチャ設計

システム全体構成図

データフロー詳細図

ネットワーク構成詳細

✅ 前提条件・要件

システム要件

📋 ハードウェア要件

コンポーネント 最小要件 推奨要件 大規模環境
CPU 1 vCPU 2 vCPU 4+ vCPU
メモリ 512MB 1GB 2GB+
ディスク 1GB 5GB 20GB+
ネットワーク 1Mbps 10Mbps 100Mbps+

🖥️ 対応OS

OS種別 バージョン サポート状況
Amazon Linux 2 ✅ フルサポート
CentOS 7, 8 ✅ フルサポート
RHEL 7, 8, 9 ✅ フルサポート
Ubuntu 18.04, 20.04, 22.04 ✅ フルサポート
Windows Server 2016, 2019, 2022 ✅ フルサポート

🔧 実装手順

Phase 1: 環境準備

Step 1-1: 作業ディレクトリの準備

# 管理サーバにログイン
ssh ansible.company.com

# プロジェクトディレクトリ作成
sudo mkdir -p /ansible/projects/td-agent-deployment
cd /ansible/projects/td-agent-deployment

# ディレクトリ構造作成
mkdir -p {playbooks,inventories,group_vars,host_vars,roles,files,templates}

# 権限設定
sudo chown -R ops-user:ops-group /ansible/projects/td-agent-deployment
chmod -R 755 /ansible/projects/td-agent-deployment

Step 1-2: Ansibleインベントリ設定

# inventories/production/hosts.ini
[linux_servers]
web-01.internal ansible_host=10.0.2.10 ansible_user=ec2-user
web-02.internal ansible_host=10.0.2.11 ansible_user=ec2-user
app-01.internal ansible_host=10.0.3.10 ansible_user=ec2-user
app-02.internal ansible_host=10.0.3.11 ansible_user=ec2-user
db-01.internal ansible_host=10.0.4.10 ansible_user=ec2-user

[windows_servers]
ad-01.internal ansible_host=10.0.5.10 ansible_user=Administrator
file-01.internal ansible_host=10.0.5.11 ansible_user=Administrator

[linux_servers:vars]
ansible_ssh_private_key_file=/home/ops-user/.ssh/id_rsa
ansible_become=yes
ansible_become_method=sudo

[windows_servers:vars]
ansible_connection=winrm
ansible_winrm_transport=kerberos
ansible_winrm_server_cert_validation=ignore

Phase 2: 実装フロー詳細

実装フロー全体図

Phase 3: Playbook作成

Step 3-1: メインPlaybook作成

# playbooks/td-agent-deployment.yml
---
- name: TD-Agent Installation and Configuration
  hosts: all
  gather_facts: yes
  vars_files:
    - ../group_vars/all.yml
    - ../group_vars/td_agent.yml

  pre_tasks:
    - name: Check system requirements
      include_tasks: tasks/system_check.yml

    - name: Backup existing configurations
      include_tasks: tasks/backup_config.yml
      when: td_agent_backup_enabled | default(true)

  roles:
    - role: td_agent_linux
      when: ansible_os_family in ['RedHat', 'Debian']

    - role: td_agent_windows  
      when: ansible_os_family == 'Windows'

  post_tasks:
    - name: Verify TD-Agent installation
      include_tasks: tasks/verify_installation.yml

    - name: Configure monitoring
      include_tasks: tasks/configure_monitoring.yml

    - name: Send deployment notification
      include_tasks: tasks/send_notification.yml

  handlers:
    - name: restart td-agent
      service:
        name: td-agent
        state: restarted
      when: ansible_os_family != 'Windows'

    - name: restart td-agent windows
      win_service:
        name: td-agent
        state: restarted
      when: ansible_os_family == 'Windows'

Step 3-2: Linux用ロール作成

# roles/td_agent_linux/tasks/main.yml
---
- name: Add TD-Agent repository
  yum_repository:
    name: treasuredata
    description: TreasureData Repository
    baseurl: http://packages.treasuredata.com/4/redhat/$releasever/$basearch
    gpgkey: https://packages.treasuredata.com/GPG-KEY-td-agent
    gpgcheck: yes
    enabled: yes
  when: ansible_os_family == 'RedHat'

- name: Install TD-Agent package
  package:
    name: td-agent
    state: present
  register: td_agent_install

- name: Create TD-Agent directories
  file:
    path: "{{ item }}"
    state: directory
    owner: td-agent
    group: td-agent
    mode: '0755'
  loop:
    - /etc/td-agent/conf.d
    - /var/log/td-agent
    - /var/lib/td-agent/buffer

- name: Install required gems
  gem:
    name: "{{ item }}"
    state: present
    executable: /usr/sbin/td-agent-gem
  loop:
    - fluent-plugin-newrelic
    - fluent-plugin-systemd
    - fluent-plugin-multiprocess
  notify: restart td-agent

- name: Deploy TD-Agent main configuration
  template:
    src: td-agent.conf.j2
    dest: /etc/td-agent/td-agent.conf
    owner: td-agent
    group: td-agent
    mode: '0644'
    backup: yes
  notify: restart td-agent

- name: Start and enable TD-Agent service
  systemd:
    name: td-agent
    state: started
    enabled: yes
    daemon_reload: yes

Step 3-3: Windows用ロール作成

# roles/td_agent_windows/tasks/main.yml
---
- name: Check if TD-Agent is already installed
  win_service:
    name: td-agent
  register: td_agent_service
  ignore_errors: yes

- name: Download TD-Agent installer
  win_get_url:
    url: "{{ td_agent_windows_download_url }}"
    dest: "{{ ansible_env.TEMP }}\\td-agent-installer.msi"
  when: td_agent_service is failed

- name: Install TD-Agent
  win_package:
    path: "{{ ansible_env.TEMP }}\\td-agent-installer.msi"
    state: present
    arguments: "/quiet /norestart"
  when: td_agent_service is failed

- name: Create TD-Agent directories
  win_file:
    path: "{{ item }}"
    state: directory
  loop:
    - "{{ td_agent_windows_home }}\\conf\\conf.d"
    - "{{ td_agent_windows_home }}\\log"
    - "{{ td_agent_windows_home }}\\buffer"

- name: Deploy TD-Agent main configuration
  win_template:
    src: td-agent-windows.conf.j2
    dest: "{{ td_agent_windows_home }}\\conf\\td-agent.conf"
  notify: restart td-agent windows

- name: Configure Windows service
  win_service:
    name: td-agent
    start_mode: auto
    state: started

Phase 4: 設定ファイルテンプレート

Step 4-1: Linux用設定テンプレート

# roles/td_agent_linux/templates/td-agent.conf.j2
# TD-Agent Main Configuration
# Generated by Ansible on {{ ansible_date_time.iso8601 }}

####
## Output descriptions:
##

# NewRelic Output
<match **>
  @type newrelic
  @id newrelic_output

  # NewRelic Configuration
  api_key {{ td_agent_newrelic_api_key }}
  base_uri {{ td_agent_newrelic_base_uri | default('https://log-api.newrelic.com') }}

  # Buffer Configuration
  <buffer>
    @type file
    path /var/lib/td-agent/buffer/newrelic
    flush_mode interval
    flush_interval {{ td_agent_flush_interval | default('10s') }}
    chunk_limit_size {{ td_agent_chunk_limit_size | default('1m') }}
    total_limit_size {{ td_agent_total_limit_size | default('1g') }}
    retry_type {{ td_agent_retry_type | default('exponential_backoff') }}
    retry_wait {{ td_agent_retry_wait | default('1s') }}
    retry_timeout {{ td_agent_retry_timeout | default('72h') }}
  </buffer>
</match>

####
## Source descriptions:
##

# Application Logs
{% for app in td_agent_apps | default([]) %}
<source>
  @type tail
  @id {{ app }}_input
  path {{ td_agent_log_paths[app] | default('/var/log/' + app + '/*.log') }}
  pos_file /var/lib/td-agent/{{ app }}.log.pos
  tag {{ app }}

  <parse>
    @type {{ td_agent_log_formats[app] | default('json') }}
  </parse>
</source>
{% endfor %}

# Monitoring
<source>
  @type monitor_agent
  @id monitor_agent_input
  bind {{ td_agent_monitor_bind | default('0.0.0.0') }}
  port {{ td_agent_monitor_port | default(22222) }}
</source>

####
## Filter descriptions:
##

# Add hostname and environment info
<filter **>
  @type record_transformer
  @id add_metadata

  <record>
    hostname {{ ansible_hostname }}
    environment {{ td_agent_environment | default('production') }}
    datacenter {{ td_agent_datacenter | default('aws-' + ansible_ec2_placement_region) }}
    ansible_managed true
  </record>
</filter>

Step 4-2: 変数定義ファイル

# group_vars/td_agent.yml
---
# NewRelic設定
td_agent_newrelic_api_key: "{{ vault_newrelic_api_key }}"
td_agent_newrelic_base_uri: https://log-api.newrelic.com

# 共通設定
td_agent_environment: production
td_agent_log_level: info
td_agent_monitor_port: 22222

# Linux固有設定
td_agent_linux_home: /var/lib/td-agent
td_agent_linux_config_dir: /etc/td-agent

# Windows固有設定
td_agent_windows_home: "D:\\td-agent"
td_agent_windows_download_url: "https://packages.treasuredata.com/4/windows/td-agent-4.3.2-x64.msi"

# アプリケーション別ログ設定
td_agent_apps:
  - nginx
  - application

td_agent_log_paths:
  nginx: /var/log/nginx/*.log
  application: /var/log/app/*.log

td_agent_log_formats:
  nginx: regexp
  application: json

Phase 5: 実行スクリプト

デプロイメントスクリプト

#!/bin/bash
# scripts/deploy_td_agent.sh
# TD-Agent自動デプロイメントスクリプト

set -euo pipefail

# 設定
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "${SCRIPT_DIR}")"
INVENTORY="${PROJECT_DIR}/inventories/production/hosts.ini"
PLAYBOOK="${PROJECT_DIR}/playbooks/td-agent-deployment.yml"
VAULT_FILE="${PROJECT_DIR}/.vault_pass.txt"

# ログ設定
LOG_DIR="${PROJECT_DIR}/logs"
LOG_FILE="${LOG_DIR}/deployment_$(date +%Y%m%d_%H%M%S).log"
mkdir -p "${LOG_DIR}"

# 関数定義
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
}

# 前提条件チェック
check_prerequisites() {
    log "前提条件をチェック中..."

    if ! command -v ansible-playbook &> /dev/null; then
        error "Ansibleがインストールされていません"
        exit 1
    fi

    if [[ ! -f "${INVENTORY}" ]]; then
        error "インベントリファイルが見つかりません: ${INVENTORY}"
        exit 1
    fi
}

# ドライラン実行
dry_run() {
    log "ドライラン実行中..."

    ansible-playbook "${PLAYBOOK}" \
        -i "${INVENTORY}" \
        --vault-password-file "${VAULT_FILE}" \
        --check \
        --diff \
        -v >> "${LOG_FILE}" 2>&1
}

# 本番実行
production_run() {
    log "本番環境への適用開始..."

    ansible-playbook "${PLAYBOOK}" \
        -i "${INVENTORY}" \
        --vault-password-file "${VAULT_FILE}" \
        --diff \
        -v >> "${LOG_FILE}" 2>&1
}

# メイン処理
main() {
    log "TD-Agent自動デプロイメント開始"

    check_prerequisites

    if [[ "${DRY_RUN:-}" == "true" ]]; then
        dry_run
    else
        dry_run
        production_run
    fi

    log "デプロイメント完了"
}

# オプション処理
while [[ $# -gt 0 ]]; do
    case $1 in
        --dry-run)
            DRY_RUN=true
            shift
            ;;
        --production)
            DRY_RUN=false
            shift
            ;;
        *)
            echo "Usage: $0 [--dry-run|--production]"
            exit 1
            ;;
    esac
done

# デフォルトはドライラン
DRY_RUN="${DRY_RUN:-true}"

# メイン処理実行
main

📊 監視・運用

運用監視体制

監視レベルと対応体制

監視レベル 検知項目 対応時間 エスカレーション
Critical サービス停止、データ損失 15分以内 即座にシニアエンジニアへ
Warning 性能劣化、リソース不足 1時間以内 1時間後にマネージャーへ
Info 設定変更、定期メンテナンス 翌営業日 日次レポートで報告

監視項目一覧

サービス監視

パフォーマンス監視

ログ送信監視

運用手順書

日次運用タスク

  1. サービス稼働確認: 全サーバのTD-Agent稼働状況確認
  2. ログ送信状況確認: NewRelicでのログ受信状況確認
  3. リソース使用量確認: CPU、メモリ、ディスクの使用状況確認
  4. エラーログ確認: 前日発生したエラーの確認と対応

週次運用タスク

  1. パフォーマンストレンド分析: リソース使用量の推移分析
  2. ログボリューム分析: ログ送信量の傾向分析
  3. 設定変更レビュー: 前週行った設定変更の効果確認
  4. バックアップ確認: 設定ファイルとデータのバックアップ状況確認

月次運用タスク

  1. 容量計画見直し: ログボリューム増加に伴う容量計画の見直し
  2. セキュリティ監査: アクセスログとセキュリティ設定の監査
  3. パフォーマンスチューニング: 性能改善施策の検討と実施
  4. 災害復旧テスト: バックアップからの復旧手順テスト

アラート設定方針

アラート階層構造

通知チャネル


🔒 セキュリティ対策

セキュリティ要件

認証・認可

多層認証システム

権限最小化の原則

データ保護

機密情報の取り扱い

ログ保護措置

ネットワークセキュリティ

ファイアウォール設定

インバウンドルール

セキュリティグループ設計

VPCセキュリティ

コンプライアンス対応

監査ログ管理

アクセス追跡

データ保持ポリシー

規制対応


🚨 トラブルシューティング

一般的な問題パターン

サービス起動問題

症状と原因

診断手順

  1. システムログの確認(journalctl -u td-agent)
  2. 設定ファイル構文チェック(td-agent –dry-run)
  3. リソース使用状況確認(top, df, netstat)
  4. 権限設定確認(ls -la, ps aux)

解決策

ログ送信問題

症状と原因

診断手順

  1. ネットワーク接続確認(curl, ping, traceroute)
  2. APIキー有効性確認(NewRelicダッシュボード)
  3. バッファ状況確認(buffer directory内容)
  4. ログファイルアクセス確認(tail, ls -la)

解決策

パフォーマンス問題

症状と原因

診断手順

  1. リソース使用量監視(htop, iotop)
  2. プロセス詳細分析(strace, lsof)
  3. ログ処理量分析(ログファイルサイズ)
  4. 設定パラメータ確認

解決策

エラーコード対応表

エラーコード 症状 原因 対処法
E001 設定ファイル読み込み失敗 構文エラー 設定ファイル修正
E002 NewRelic接続失敗 ネットワーク/API問題 接続設定確認
E003 バッファ書き込み失敗 ディスク容量不足 容量確保
E004 プラグイン読み込み失敗 依存関係問題 gem再インストール
E005 ログファイル読み取り失敗 権限/パス問題 権限設定修正

緊急時対応手順

サービス完全停止時

  1. 影響範囲確認: 停止サーバ数とビジネス影響度評価
  2. エスカレーション: 影響度に応じた関係者への緊急連絡
  3. 暫定対処: 最小限のサービス復旧(手動ログ転送等)
  4. 根本原因調査: ログ分析と原因特定
  5. 恒久対策: 再発防止策の実装

セキュリティインシデント時

  1. インシデント分類: セキュリティ影響度の評価
  2. 初期対応: 影響範囲の隔離と証跡保全
  3. 調査開始: フォレンジック調査と影響範囲特定
  4. 報告: 管理層および関係機関への報告
  5. 復旧: セキュリティ確保後のサービス復旧

⚡ 最適化・改善提案

パフォーマンス最適化

システムレベル最適化

カーネルパラメータ調整

リソース配分最適化

アプリケーションレベル最適化

TD-Agent設定チューニング

ログ処理最適化

運用効率化

自動化拡張

CI/CDパイプライン統合

インフラストラクチャコード化

監視強化

予測的監視の導入

可視化の改善

コスト最適化

リソース使用量最適化

Right Sizing実施

ログ保存戦略

AWS料金最適化

リザーブドインスタンス活用

データ転送費用削減

将来拡張計画

スケーラビリティ向上

水平スケーリング対応

多リージョン展開

技術革新対応

コンテナ化推進

AI/ML統合


📚 参考資料

公式ドキュメント

技術参考資料

コミュニティリソース

関連ツール・プラグイン

学習リソース


📝 まとめ

本ガイドでは、AWS環境におけるTD-Agentの自動構築から運用まで、包括的な手順を解説しました。

実装で得られる効果

継続改善のポイント

AnsibleとTD-Agentを組み合わせることで、スケーラブルで管理しやすいログ収集システムを構築できます。定期的な見直しと改善により、安定したログ収集システムの運用を実現しましょう。

モバイルバージョンを終了