【Prometheus】エージェントレスでオートスケーリングなAWS監視(Centos8)

# はじめに
cloudwatchからprmetheusにmetricsを取得させてオートスケーリングな監視を実現する。
この仕組みはとある現場でたまたまできたものなのだが、とにかく手がかからない。
テスト環境や仮組みのときとかにちょろっと使えそうなので記載しておく。
※本手順はprometheus構築済みの環境を想定しています。

# 設定

### IAM準備
まず以下のようなポリシーでユーザを作成してアクセスキーとシークレットキーを用意しておく。

```ruby:IAMポリシー
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "tag:GetResources",
                "cloudwatch:GetMetricData",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics"
            ],
            "Resource": "*"
        }
    ]
}
```

### awscliインストール
```ruby:awscliインストール
yum install python3-pip
pip3 install awscli
aws configure
AWS Access Key ID [None]: [アクセスキー]
AWS Secret Access Key [None]: [シークレットキー]
Default region name [None]: ap-northeast-1
Default output format [None]:
```

### yaceバイナリ配備
cloudwatchからmetricsを取得するexpoterはいくつかあるが、今回は[yace](https://github.com/ivx/yet-another-cloudwatch-exporter)を使用する

```ruby:yaceバイナリ配備
yum install wget
wget https://github.com/ivx/yet-another-cloudwatch-exporter/releases/download/v0.26.3-alpha/yet-another-cloudwatch-exporter_0.26.3-alpha_Linux_x86_64.tar.gz
tar -zxf yet-another-cloudwatch-exporter_0.26.3-alpha_Linux_x86_64.tar.gz
mv yace /usr/local/
```

### コンフィグ作成
```ruby:/etc/prometheus/yace.conf
discovery:
  exportedTagsOnMetrics:
    ec2:
      - Name
  jobs:
  - type: ec2
    regions:
      - ap-northeast-1
    period: 60
    length: 300
    delay: 60
    nilToZero: true
    searchTags:
      - key: Name
        value: .*
    metrics:
      - name: CPUUtilization
        statistics:
        - Maximum
      - name: DiskReadBytes
        statistics:
        - Maximum
      - name: DiskWriteBytes
        statistics:
        - Maximum
      - name: NetworkIn
        statistics:
        - Sum
      - name: NetworkOut
        statistics:
        - Sum
```

### yaceサービス化
```ruby:/usr/lib/systemd/system/yace.service
[Unit]
Description=yace
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/yace -config.file /etc/prometheus/yace.conf

[Install]
WantedBy=multi-user.target
```

### selinux停止
yaceをサービス化するときにselinuxが騒ぐのであらかじめ停止しておく

```ruby:selinux停止
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
reboot
```

### サービス設定
```ruby:サービス設定
systemctl enable yace
systemctl start yace
```

ここまでで作業完了。
これ以降AWSコンソール側でインスタンスを作成すると自動で監視が開始されようになる。
停止した場合はmackerelのような退役作業は必要なく、自動で監視がとまる。
(私はmackerelさんが大好きですよ！)

# メモリ監視について
cloudwatchはデフォルトではメモリを監視していない。
この為、メモリ監視を行う場合cloudwatachエージェントなどで出力させる必要がある
例えばCloudWatch モニタリングスクリプトでメモリ監視を出力させた場合はyace.confに以下のように設定を追加することでprometheus側で取得させることが可能。
(ただしこれはインスタンス追加の度に設定が必要になる)

```ruby:/etc/prometheus/yace.conf
static:
  - namespace: System/Linux
    name: System/Linux
    regions:
      - ap-northeast-1
    dimensions:
     - name: InstanceId
       value: [インスタンスID]
    metrics:
      - name: MemoryUtilization
        statistics:
        - Maximum
        period: 600
        length: 600
```

なお、CloudWatch モニタリングスクリプトは現在非推奨なので特別な理由がなければ使用しないでください。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-scripts-intro.html
# あとがき
今回スクリーンショットが用意できなかったので地味ですがいい感じにgrafana使っていると結構な便利感あります。
オートスケーリングといってもなんだかんだ手のかかるものの多い中でたまたまこんな仕組みができたので共有したいと思いました。
なお、今回紹介した[yace](https://github.com/ivx/yet-another-cloudwatch-exporter)はEC2以外のサービスにも対応している為、ELBやRDSでもまったく同じことができます。
ひょっとしたらそちらで使用したほうが需要が多いかもしれないです。