AWS
Ansible
CloudWatch-Logs

ansibleでCloudWatch Logsを導入する

More than 1 year has passed since last update.

ログをいい感じに管理したいよねーってことでawsのCloudWatch Logsを導入することになったのでまとめました。

ansibleなんぞやって人は、以前に調べたのでこちらをどうぞ
ansibleで疎通確認とplaybookの実行

やろうとしていること

CloudWatch Logsのクイックスタートに記載されている内容をansibleを使って実行できるようにします。

ansibleを使わないでやるとこんな感じですかね。

1. awslogs パッケージをインストール
[ec2-user ~]$ sudo yum install -y awslogs

2. 追跡するログを設定

3. awslogs サービスを開始
[ec2-user ~]$ sudo service awslogs start

4. システム起動時に毎回 awslogs サービスを起動する設定
[ec2-user ~]$ sudo chkconfig awslogs on

ansibleで書いていく

全体的な構成

site.ymlが実行するファイルで、rolesにcloudwatch-logs用ディレクトリを作成して、site.ymlから呼び出します。

.
└── ansible
    ├── roles
    │   └── cloudwatch-logs
    │       ├── tasks
    │       │   └── main.yml
    │       └── templates
    │           ├── awscli.conf.j2
    │           └── awslogs.conf.j2
    │   
    └── site.yml

各ファイル

site.yml

site.ymlが実際に実行をするファイルです。

こちらではcloudwatch-logsをincludeして利用しています。
なんとなく書いていたのですが、becomeはroot権限で実行する場合にyesにします。

/ansible/site.yml
---
- hosts: all
  vars:
  remote_user: ec2-user
  become: yes

  roles:
    - { role: cloudwatch-logs }

main.yml

こちらがcloudwatch-logsのタスクを定義しているメインのファイルです。
冒頭のやろうとしていることに書いたansibleを使わないでやる場合のコマンドの代わりに
こちらを実行するイメージを持ってもらえれば良いと思います。

どのログファイルを管理するかなどの設定は、別ファイルを作成してそれを読み込みます。

start agentの部分で起動させ、enabled=yesを指定することで、再起動させた時に自動で起動させるようにします。

/ansible/roles/cloudwatch-logs/tasks/main.yml
---
- name: install awslogs
  yum: name=awslogs state=latest disable_gpg_check=yes

- name: copy conf files
  template: src={{ item }}.j2 owner=root dest=/etc/awslogs/{{ item }}
  with_items:
        - awscli.conf
        - awslogs.conf

- name: start agent
  service: name=awslogs state=started enabled=yes state=started

awscli.conf.j2

regionは使っているところに合わせてもらえれば良いかと。

/ansible/roles/cloudwatch-logs/tmplates/awscli.conf.j2
[plugins]
cwlogs = cwlogs

[default]
region = ap-northeast-1

awslogs.conf.j2

このファイルでどのファイルをCloudWatch Logs側に送るのか、ログの名前はどうするのかということを指定します。
今回は/var/log/httpdディレクトリにあるアクセスログとエラーログを全てCloudWatch Logsに送ります。
それぞれaccess_logerror_logというロググループを作成して、その中にhostnameごとに管理していきます。

/ansible/roles/cloudwatch-logs/tmplates/awslogs.conf.j2
[general]
state_file = /var/lib/awslogs/agent-state

[/var/log/httpd/access_log]
datetime_format = %b %d %H:%M:%S
buffer_duration = 5000
log_stream_name = {hostname}.access_log
initial_position = start_of_file
file = /var/log/httpd/access_log.*
log_group_name = access_log

[/var/log/httpd/error_log]
datetime_format = %b %d %H:%M:%S
buffer_duration = 5000
log_stream_name = {hostname}.httpd_error_log
initial_position = start_of_file
file = /var/log/httpd/error_log.*
log_group_name = error_log

dry-run

準備ができたのでdry-runで確認します。
1つfailedがありますが、こちらはawslogsをstartさせようとしたけどinstallされてないからできないということですね。
(dry-runなので実際にはinstallが行われていません。)

 $ ansible-playbook site.yml -i hosts -C

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [127.0.0.1]

TASK [cloudwatch-logs : install awslogs] ***************************************
changed: [127.0.0.1]

TASK [cloudwatch-logs : copy conf files] ***************************************
changed: [127.0.0.1] => (item=awscli.conf)
changed: [127.0.0.1] => (item=awslogs.conf)

TASK [cloudwatch-logs : start agent] *******************************************
fatal: [127.0.0.1]: FAILED! => {"changed": false, "failed": true, "msg": "no service or tool found for: awslogs"}
  to retry, use: --limit @/Users/username/workspace/aws/aws/ansible/site.retry

PLAY RECAP *********************************************************************
127.0.0.1              : ok=3    changed=3    unreachable=0    failed=1


ansibleの実行

丁寧にやるならinstall前後の処理で分けて実行すれば、dry-runでOKのtaskだけをサーバに反映できると思います。
が、失敗しても問題はない環境なのでそのまま実行します。できた。

$ ansible-playbook site.yml -i hosts         

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [127.0.0.1]

TASK [cloudwatch-logs : install awslogs] ***************************************
changed: [127.0.0.1]

TASK [cloudwatch-logs : copy conf files] ***************************************
changed: [127.0.0.1] => (item=awscli.conf)
changed: [127.0.0.1] => (item=awslogs.conf)

TASK [cloudwatch-logs : start agent] *******************************************
changed: [127.0.0.1]

TASK [Set hostname.] ***********************************************************
ok: [127.0.0.1]

PLAY RECAP *********************************************************************
127.0.0.1              : ok=5    changed=4    unreachable=0    failed=0

気をつけること

・ログデータをどのように管理するのかを考えて構成を考える
・実際にコンソール画面を見てみる
・権限周りで詰まったらクイックスタート + IAM Policy Simulatorで確認

参考

http://dev.classmethod.jp/cloud/ansible-cloudwatch-logs-play-framework/
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/QuickStartEC2Instance.htm