【Prometheus】EC2 環境にprometheusとthanosを構築する(CentOS8)

# はじめに
prometheusの永続化ストレージを提供するthanosだが、ちょくちょくネット上で見かけるもののEC2やオンプレの記事はみたことがないので書いておく。
prometheusやthanosの各要素を個別に詳しく解説している記事は他にあるので、ここでは少なくともこうすればEC2でも動くという手順を簡潔に記載する。
(リンク張っていいのかわからなかったので気になる方は「thanos」で検索してみてください)

# prometheus

### RPMインストール
手順を簡略化する為、[packagecloud](https://packagecloud.io/)のRPMを使用してインストールする。

```ruby:RPMインストール
curl -s https://packagecloud.io/install/repositories/prometheus-rpm/release/script.rpm.sh | sudo bash
yum install prometheus2-2.25.2-1.el8.x86_64
yum install node_exporter-1.1.2-1.el8.x86_64
```

### コンフィグ作成

```ruby:/etc/prometheus/promethus.yml
# my global config
global:
  scrape_interval:     60s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 60s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  external_labels:
    cluster: prometheus

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']

  - job_name: node
    static_configs:
    - targets: ['localhost:9100']
```

### サービス設定

```ruby:サービス設定
systemctl enable node_exporter
systemctl enable prometheus 
systemctl start node_exporter
systemctl start prometheus
```

ここまででprometheusのインストールは完了。
「http://[IPアドレス]:9090」でprometheusの画面が表示できる。
![promethsua.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/4cc306d6-4252-ed87-77c0-694ac761b8b6.png)

# thanos
ここまででprometheusの画面はでたのでthanosをインストールしていく。
引き続きRPMは[packagecloud](https://packagecloud.io/)のものを使用する。

### thanosインストール
```ruby:thanosインストール
yum install thanos-0.18.0-1.el8.x86_64
```

### ストレージ設定
今回はストレージとしてS3を使用する。
特別な設定はないので普通に作成してIAMユーザを作成しておく。

IAMユーザのポリシーは以下

```ruby:ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::[バケット名]/*",
                "arn:aws:s3:::[バケット名]"
            ]
        }
    ]
}
```

作成したS3の情報を基に設定ファイルを作成する。

```ruby:/etc/prometheus/s3.conf
type: S3
config:
  bucket: "[バケット名]"
  endpoint: "s3.amazonaws.com"
  region: "ap-northeast-1"
  access_key: "[アクセスキー]"
  insecure: false
  signature_version2: false
  secret_key: "[シークレットキー]"
  put_user_metadata: {}
  http_config:
    response_header_timeout: 2m
    insecure_skip_verify: false
  trace:
    enable: false
  list_objects_version: ""
  part_size: 67108864
  sse_config:
    type: ""
    kms_key_id: ""
    kms_encryption_context: {}
    encryption_key: ""
```

### thanos側コンフィグ設定
今回はt2.micro一台ですべて賄う設定にしている為、分ける場合はそれぞれURLなど変更する。

```ruby:/etc/default/thanos-sidecar
THANOS_SIDECAR_OPTS='--tsdb.path=/var/lib/prometheus/data --prometheus.url=http://localhost:9090 --objstore.config-file /etc/prometheus/s3.conf'
```
```ruby:/etc/default/thanos-query
THANOS_QUERY_OPTS='--http-address=0.0.0.0:10904 --grpc-address=0.0.0.0:10903 --store=localhost:10901'
```
```ruby:/etc/default/thanos-store
THANOS_STORE_OPTS='--data-dir=/var/lib/thanos/store --http-address=0.0.0.0:10906 --grpc-address=0.0.0.0:10905 --objstore.config-file /etc/prometheus/s3.conf'
```
```ruby:/etc/default/thanos-compact
THANOS_COMPACT_OPTS='--data-dir=/var/lib/thanos/compact --http-address=0.0.0.0:10912 --objstore.config-file /etc/prometheus/s3.conf --wait'
```
thanosの設定は以上だが、このままだと起動してくれないのでprometheus側のtsdb.XXX-block-durationを合わせておく

```ruby:/etc/default/prometheus
PROMETHEUS_OPTS='--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/data --storage.tsdb.min-block-duration=1d --storage.tsdb.max-block-duration=1d'
```

### サービス設定
```ruby:prometheus
systemctl restart prometheus

systemctl enable thanos-sidecar 
systemctl enable thanos-query 
systemctl enable thanos-store 
systemctl enable thanos-compact 
systemctl start thanos-sidecar
systemctl start thanos-query
systemctl start thanos-store
systemctl start thanos-compact
```

これで完了そのうちS3にデータが流れていく。


# あとがき
container全盛の時代だけど全員がkubernetes使える環境にいるわけではないのでどこかの誰かのお役にたてば幸いです。
EC2に入るってことはほかのcloudやオンプレでも使えるという事なので。