Edited at

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