awslogs(Cloudwatch logs)でconfigやproxyを簡単に設定する

AmazonLinuxでcloudwatch logsをインストールしたら、設定ディレクトリ(/etc/awslogs)に `proxy.conf` と configディレクトができていることを同僚に教えてもらいました。

ちょっと調べてみると、今まで `awslogs.conf` に全部書かないと行けなかった**設定をファイル分割して書けるようになった**みたいです。
また、`proxy.conf` にはawslogsのプロキシ設定を書くことができるようになったみたいです！

AmazonLinuxおよび、awslogsのバージョンは以下になります。

```bash
$ cat /etc/system-release
Amazon Linux AMI release 2015.09

$ yum install awslogs
:
$ rpm -qi awslogs
Name        : awslogs
Version     : 1.1.2
Release     : 1.10.amzn1
Architecture: noarch
Install Date: 2016年01月22日 14時24分47秒
Group       : Amazon/Tools
Size        : 11735
License     : Amazon Software License
Signature   : RSA/SHA256, 2016年01月22日 06時52分43秒, Key ID bcb4a85b21c0f39f
Source RPM  : awslogs-1.1.2-1.10.amzn1.src.rpm
Build Date  : 2016年01月22日 06時49分57秒
Build Host  : build-60006.build
Relocations : (not relocatable)
Packager    : Amazon.com, Inc. <http://aws.amazon.com>
Vendor      : Amazon.com
URL         : http://aws.amazon.com/cloudwatch
Summary     : Scripts for CloudWatch Logs Daemon
Description :
Scripts to run Amazon CloudWatch Logs as a daemon.
```

# proxy.conf

`proxy.conf` の中身はこんな感じです。
それぞれの環境変数を設定すればプロキシ経由でlogをpushすることができます。

```
$ cat /etc/awslogs/proxy.conf
# Version: 1.1.2rpm
# Refer to http://docs.aws.amazon.com/cli/latest/userguide/cli-http-proxy.html for details.
HTTP_PROXY=
HTTPS_PROXY=
NO_PROXY=
```

どうやって読み込んでいるかというと、`awslogsd` の中身に書いてありました。
ファイルがあったら読み込むみたいなシンプルな設定方法みたいです。

```
$ sudo cat /usr/sbin/awslogsd
#!/bin/sh
# Version: 1.1.2-rpm
echo -n $$ > /var/run/awslogs.pid
[ -f /etc/awslogs/proxy.conf ] && . /etc/awslogs/proxy.conf
exec /usr/bin/env -i HTTPS_PROXY=$HTTPS_PROXY HTTP_PROXY=$HTTP_PROXY NO_PROXY=$NO_PROXY AWS_CONFIG_FILE=/etc/awslogs/awscli.conf HOME=/root /bin/nice -n 4 /usr/bin/aws logs push --config-file /etc/awslogs/awslogs.conf --additional-configs-dir /etc/awslogs/config >> /var/log/awslogs.log 2>&1
```

この中をみると、**`--additional-configs-dir`オプションでconfigディレクトリを読み込んでいる**ことがわかります。

では、configディレクトリにはどのようにファイルを置けばいいのでしょうか？

# configディレクトリ

初めは、\*.confみたいな設定ファイルを置いてみたのですが、**実装を見る限りファイル名はなんでも良さそう**です。
実際の読み込みは、`/usr/lib/python2.7/dist-packages/cwlogs/push.py` で行われています。

push.pyから一部抜粋。

```python
$ sudo sed -n '236,267p' /usr/lib/python2.7/dist-packages/cwlogs/push.py
    def _get_config(self, config_file, configs_dir):
        validate_file_readable(config_file)
        config = configparser.RawConfigParser(StreamConfig.DEFAULT_DICT)
        config.read(config_file)
        if not configs_dir:
            return config

        if os.path.isdir(configs_dir):
            files = os.listdir(configs_dir)
            for file_name in files:
                file_name = os.path.join(configs_dir, file_name)
                if os.path.isfile(file_name):
                    validate_file_readable(file_name)
                    logger.info("Loading additional configs from " + file_name)
                    subconfig = configparser.RawConfigParser(StreamConfig.DEFAULT_DICT)

                    try:
                        subconfig.read(file_name)
                    except Exception as e:
                        logger.warning("Failed to parse additional config file " + file_name + ": " + str(e))
                        continue

                    for section in subconfig.sections():
                        if config.has_section(section) or section == StreamConfig.GENERAL_SECTION:
                            continue
                        for option in subconfig.options(section):
                            if not config.has_section(section):
                                config.add_section(section)

                            config.set(section, option, subconfig.get(section, option))

        return config
```

ファイル分割した設定が読み込まれているかどうかは、`/var/log/awslogs.log`に出力されるのでわかりやすいですね。

# まとめ

いままでの `awslogs.conf` は設定を1つのファイルにしか書くことができなかったので、**設定の追加や削除がやりにくい**感じがしてました。ですが、今回の対応で**設定をファイル分割して書けるようになったことで、インフラ環境の自動化などもやりやすくなるように感じます**。

また、proxyの設定もいままでは `/usr/sbin/awslogsd` の中身を書き換えたり正直微妙な感じ :disappointed_relieved: で対応していましたが、それが**設定ファイルとして切り出され管理しやすくなりました**。

環境構築する側からすると、こういう地味なアップデートは**大変ありがたいですね** :satisfied: