AWS: CloudWatch unified agent – сбор метрик и логов с EC2 и Ansible роль для него

By | 06/07/2018
 

В дополнение к посту AWS: CloudWatch logs – сбор и мониторинг логов, где сбор логов выполнялся старым агентом – пример использования нового агента, который собирать и метрики инстанса, и логи.

Для работы агента – ЕС2 требуется подключенная роль CloudWatchAgentServerPolicy, создание описано тут>>>.

Пост кратенький, просто пример установки и запуска.

Установка CloudWatch unified агента

Устанавливаем unzip:

root@ip-172-31-45-128:/home/admin# apt install unzip

Загружаем архив с агентом:

root@ip-172-31-45-128:/home/admin# wget https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip

Распаковываем:

root@ip-172-31-45-128:/home/admin# unzip AmazonCloudWatchAgent.zip
Archive:  AmazonCloudWatchAgent.zip
inflating: amazon-cloudwatch-agent.deb
inflating: detect-system.sh
inflating: uninstall.sh
inflating: manifest.json
inflating: install.sh
inflating: amazon-cloudwatch-agent.rpm

Устанавливаем:

root@ip-172-31-45-128:/home/admin# bash install.sh
Selecting previously unselected package amazon-cloudwatch-agent.
(Reading database ... 33701 files and directories currently installed.)
Preparing to unpack ./amazon-cloudwatch-agent.deb ...
Unpacking amazon-cloudwatch-agent (1.200763.0-1) ...
Setting up amazon-cloudwatch-agent (1.200763.0-1) ...

Настройка агента

После установки агент создаёт дефолтный файл настроек:

root@ip-172-31-45-128:/home/admin# ls -l /opt/aws/amazon-cloudwatch-agent/etc
total 4
-rw-r--r-- 1 root root 825 May 12 02:40 common-config.toml

Он будет использоваться и SSM агентом, если он используется, и CloudWatch агентом для определения данных доступа к AWS (не требуются, если используется IAM роль для EC2) и настроек прокси, если таковой есть.

Генерируем файл настроек /opt/aws/amazon-cloudwatch-agent/bin/config.json для CloudWatch агента (в Ansible он будет копироваться из файлов роли):

root@ip-172-31-45-128:/home/admin# /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:
1
Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
3
Current config as follows:
{
"metrics": {
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
...
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
Log file path:
/var/log/syslog
Log group name:
default choice: [syslog]
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/syslog",
"log_group_name": "syslog"
}
]
}
}
},
"metrics": {
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
...
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
2
Program exits now.

Запускаем агент (в Ansible он запускается systemd):

root@ip-172-31-45-128:/home/admin# /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-file /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --download-source file:/opt/aws/amazon-cloudwatch-agent/bin/config.json --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
Valid Json input schema.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
Created symlink /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service → /etc/systemd/system/amazon-cloudwatch-agent.service.

Проверяем статус:

root@bm-backed-app-dev:/home/admin# /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
"status": "running",
"starttime": "2018-06-06T08:35:36+00:00",
"version": "1.201116.0"
}

Проверяем метрики:

Логи:

systemd

Файл сервиса создаётся автоматом при установке агента:

root@ip-172-31-45-128:/etc/systemd/system# cat /etc/systemd/system/amazon-cloudwatch-agent.service
Copyright 2017 Amazon.com, Inc. and its affiliates. All Rights Reserved.
Licensed under the Amazon Software License (the "License").
You may not use this file except in compliance with the License.
A copy of the License is located at
http://aws.amazon.com/asl/
or in the "license" file accompanying this file. This file is distributed
on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the specific language governing
permissions and limitations under the License.
Location: /etc/systemd/system/amazon-cloudwatch-agent.service
systemctl enable amazon-cloudwatch-agent
systemctl start amazon-cloudwatch-agent
systemctl | grep amazon-cloudwatch-agent
https://www.freedesktop.org/software/systemd/man/systemd.unit.html
[Unit]
Description=Amazon CloudWatch Agent
After=network.target
[Service]
ExecStart=/opt/aws/amazon-cloudwatch-agent/bin/start-amazon-cloudwatch-agent
Restart=always
[Install]
WantedBy=multi-user.target

И добавлен в автозапуск:

root@ip-172-31-45-128:/etc/systemd/system# systemctl list-unit-files | grep enabled
amazon-cloudwatch-agent.service        enabled
...

Ansible роль

Создаём роль:

mkdir -p roles/cloudwatch/{tasks,templates,defaults}

Создаём roles/cloudwatchtasks/main.yml, описываем установку:

- name: Download CloudWatch archive
  unarchive:
    src: "{{ cw_agent_s3_url }}"
    dest: /tmp
    remote_src: yes

- name: Install CloudWatch agent
  command: /bin/bash /tmp/install.sh
  args:
    chdir: /tmp

- name: Copy config file
  copy:
    src: templates/amazon-cloudwatch-agent-config.json
    dest: "{{ cw_config_path }}"

- name: Restart CloudWatch agent
  systemd:
    state: restarted
    name: amazon-cloudwatch-agent

Создаём roles/cloudwatch/templates/amazon-cloudwatch-agent-config.json:

{
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/syslog",
                                                "log_group_name": "syslog"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle",
                                        "cpu_usage_iowait",
                                        "cpu_usage_user",
                                        "cpu_usage_system"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ],
                                "totalcpu": false
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent",
                                        "inodes_free"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "io_time",
                                        "write_bytes",
                                        "read_bytes",
                                        "writes",
                                        "reads"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "netstat": {
                                "measurement": [
                                        "tcp_established",
                                        "tcp_time_wait"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}

Полный список метрик для EC2 – тут>>>.

Описание файла настроек CloduWatch агента – тут>>>.

Создаём roles/cloudwatch/defaults/main.yml:

cw_agent_s3_url: https://s3.amazonaws.com/amazoncloudwatch-agent/linux/amd64/latest/AmazonCloudWatchAgent.zip
cw_config_path: /opt/aws/amazon-cloudwatch-agent/bin/config.json

Запускаем (тут у меня свой скрипт для запуска Ansible):

./ansible_exec.sh -a -S
Tags: app
Env: backend-dev
Vault: /home/setevoy/.ssh/mobilebackend_aws_credentials.yml
RSA: /home/setevoy/Work/aws-credentials/bm-backend-dev.pem
Are you sure to proceed? [y/n] y
Installing dependencies...
[WARNING]: - manala.logrotate (1.0.1) is already installed - use --force to change version to unspecified
[WARNING]: - jnv.unattended-upgrades (v1.6.0) is already installed - use --force to change version to unspecified
Done.
Executing syntax-check...
playbook: backend.yml
Syntax check passed.
Skipping dry-run.
Applying roles...
PLAY [all] ****
TASK [Gathering Facts] ****
ok: [bm-mb-dev-ssh.domain.world]
TASK [cloudwatch : Download CloudWatch archive] ****
changed: [bm-mb-dev-ssh.domain.world]
TASK [cloudwatch : Install CloudWatch agent] ****
changed: [bm-mb-dev-ssh.domain.world]
TASK [cloudwatch : Copy config file] ****
changed: [bm-mb-dev-ssh.domain.world]
TASK [cloudwatch : Start CloudWatch agent] ****
changed: [bm-mb-dev-ssh.domain.world]
PLAY RECAP ****
bm-mb-dev-ssh.domain.world : ok=5    changed=4    unreachable=0    failed=0
Provisioning done.

Проверяем:

root@bm-backed-app-dev:~# ps aux | grep aws
root     30165  0.7  1.1 151696 23548 ?        Ssl  17:56   0:00 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -pidfile /opt/aws/amazon-cloudwatch-agent/var/amazon-cloudwatch-agent.pid -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml

Удаление агента

Для удаления агента – используем dpkg:

dpkg -r amazon-cloudwatch-agent

При необходимости – так же удаляем каталог /opt/aws/amazon-cloudwatch-agent/.

Готово.

UPD В процессе окончательной настройки использовались:

Amazon CloudWatch Concepts

Metrics Collected by the CloudWatch Agent

Manually Create or Edit the CloudWatch Agent Configuration File

Common Scenarios with CloudWatch Agent