yet-another-cloudwatch-exporterでCloudWatchのコストを削減する


PrometheusでCloudWatchメトリックを取得したときのコスト問題

久しぶりの投稿です。

CloudWatch用のPrometheus Exporterとして Officialなcloudwatch_exportergolang実装のcloudwatch_exporter がありますが、それとは別の yet-another-cloudwatch-exporter について書こうかと思います。

弊社でも当初はgolang版でRDSやAuroraのメトリックを取得していたらCloudWatchの料金が高額になってしまいました。。。

Amazon CloudWatch の料金
CloudWatch APIの課金体系はAPIリクエスト数によるものなので、AWS RDSのメトリック全部(25個ぐらい)を5分おきに取得した場合、1つのInstanceで月額2USD程度なので微々たるものです。
が、台数が増えたりCloudFrontなども取得するようにした場合にメトリックの数だけ課金が増えていきます(この時点で気づけばよかった・・・)。
案の定、翌月に請求額でビビった次第です。

CloudWatchでメトリックを取得するAPIには GetMetricStatisticsGetMetricData があり、GetMetricStatisticsは1度に1つのメトリックしか取得できませんが、GetMetricDataは1度に最大500コのメトリックを取得できます。
で、前述の cloudwatch_exporter は GetMetricStatistics を使用しているため、取得するメトリック・対象Instanceが増えるとCloudWatch API数も増えていきます(当然ですが・・・)。

yes-another-cloudwatch-exporterについて

前述が長くなりましたが、そこで弊社では yet-another-cloudwatch-exporter(後述YACE) へ置き換えることでコストを削減させています。

ivx/yet-another-cloudwatch-exporter
Improving the Prometheus exporter for Amazon CloudWatch

YACEの良い点

  • GetMetricData で複数のメトリックを1度のAPIコールで取得してくれる

  • exporter内でDimensionを取得してGetMetricDataを実行してくれるので設定ファイルがシンプル

discovery:
  exportedTagsOnMetrics:
    ec2:
      - Name
    ebs:
      - VolumeId
  jobs:
  - type: es
    regions:
      - eu-west-1
    searchTags:
      - Key: type
        Value: ^(easteregg|k8s)$
    metrics:
      - name: FreeStorageSpace
        statistics:
        - Sum
        period: 600
        length: 60
  • Prometheusからのscrapeによりメトリックを取得するのではなくProxyとして動作するため、Prometheus側で30秒おきとしても直近に取得(デフォルトでは5分おきにYACEがメトリックを取得する)したものを返す

  • クロスアカウントに対応しており、1つのNamespaceに対して複数のアカウント分の設定ができる

  jobs:
    - type: ecs-svc
      regions:
        - eu-north-1
      roleArns:
        - "arn:aws:iam::111111111111:role/prometheus" # newspaper
        - "arn:aws:iam:2222222222222:role/prometheus" # radio
        - "arn:aws:iam:3333333333333:role/prometheus" # television
      metrics:
        - name: MemoryReservation
          statistics:
            - Average
            - Minimum
            - Maximum
          period: 600
          length: 600

YACEのおかげでAPI数が大幅に減らすことができ、コストも半分以下にまで下げることができました。

おわりに

現時点ではNamespaceに制限があるため、すべてのサービスのメトリックが取得できないようです。
また、GetMetricDataを使用しているのは Auto-discovery のJobだけで Static のJobではGetMetricStatisticsが使用されるので注意が必要です。
CloudWatchのコスト増・APIスロットリングでお悩みの場合に選択肢の1つとしてアリかと思います。