ブログ

PrometheusとSysdigを使用したAWS Fargateのモニタリング

Google Cloudとコンテナの継続的なセキュリティ

本文の内容は、2020年6月9日にDavid de Torres Huertaが投稿したブログ(https://sysdig.com/blog/monitor-aws-fargate-prometheus/)を元に日本語に翻訳・再構成した内容となっております。

この記事では、Sysdig Monitorを使用してAWS Fargateを簡単に監視する方法を示します。Sysdigでの既存のPrometheusの取り込みを活用することで、単一のペインオブグラスのアプローチでサーバーレスサービスを監視できるようになり、これらのサービスを本番環境で実行する自信が生まれます。

20200610-1.png

サーバーレスの台頭

現在、AWS Fargateなどのサーバーレスコンピューティングの台頭を目撃しています。このサービスは、開発者がクラウドプロバイダーに任せることで、コンテナインフラストラクチャーを管理する必要性を軽減します。AWS Fargateを利用してコンピューティングインフラストラクチャーを自動管理することにより、開発者はコードの開発とデプロイの速度を向上させることができます。開発者はしばらくの間ECSでAWS Fargateを使用できましたが、最近、EKS用にFargate もリリースされました。Kubernetes環境のサポートにより、開発者は、標準化されたKubernetes APIを含む、Fargateサービスをデプロイするためのより多くのオプションを利用できます。

これらのサービスがビジネスの一部になると、健全性とパフォーマンスを確保するために、他の本番ワークロードと同じように監視する必要があります。ただし、Fargateにデプロイされたポッドにはいくつかの制限があります。それらの1つは、Fargateが特権ポッドを許可しないことです。では、Sysdigエージェントをインストールできない場合、AWS Fargateおよびその他のサーバーレスサービスをどのように監視できますか?AmazonのモニタリングサービスであるAWS CloudWatchのような仲介する手段に依存する必要があります。

AWS FargateとPrometheus

AWS Fargate はサーバーレスサービスであり、ユーザーが指定した計算能力でコンテナを実行できます。このようにして、必要な量のリソースのみを利用できます。CloudWatchは、Fargateおよびその他のAWSサービスを監視するためのメトリクスを提供するツールです。AWS CloudWatchサービスは、Fargate を使用して、特定のクラスターで有効になっている場合、FargateコンテナがネームスペースECS/ContainerInsightsの下で生成するメトリクスを収集できます。

Prometheusは、エクスポーターを作成することで統合を簡単に作成する手段を提供する、業界をリードするオープンソースモニタリングソリューションです。Prometheusを使用すると、単一のペインオブグラスアプローチに従って、複数のクラウドプロバイダーに分散している可能性があるインフラストラクチャー全体からメトリクスを収集できます。

Prometheusエクスポーターは、サービスからメトリクスを収集し、PrometheusサーバーとSysdigエージェントの両方がネイティブにスクレイピングできる標準化された形式で公開します。AWS CloudWatchからメトリクスを取得するために、これらのエクスポーターの1つ、すなわちyet-another-cloudwatch-exporterを使用します。Sysdigはより効率的で信頼できるように、このエクスポーターにコントリビュートしました。

20200610-2.png

このユースケースでは、CloudWatchエクスポーターをKubernetesクラスターにデプロイし、AWSのFargateクラスターのメトリクスを収集するように設定します。このエクスポーターにはPrometheusタグでアノテーションが付けられるため、PrometheusサーバーとSysdigエージェントの両方がそれをスクレイプすることができます。次の図では、システムの全体図を示しています。

20200610-3.png

Prometheus CloudWatchエクスポーターのインストールと設定

エクスポーターはAWS CloudWatch APIに接続してメトリクスを要求しますが、正しい答えを取得するには、いくつかのアクセス許可の設定が必要です。このセクションでは、この接続を可能にするアクセス許可と認証情報を使用してAWSアカウントを設定する手順について説明します。

CloudWatchメトリクスにアクセスするためのアクセス許可を設定する

最初に、次のアクセス許可を含むAWS IAMポリシーを作成する必要があります。

AWS IAMポリシーの設定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CloudWatchExporterPolicy",
            "Effect": "Allow",
            "Action": [
                "tag:GetResources",
                "cloudwatch:ListTagsForResource",
                "cloudwatch:GetMetricData",
                "cloudwatch:ListMetrics"
            ],
            "Resource": "*"
        }
    ]
}

また、AWS IAMアカウントの認証情報をCloudWatchエクスポーターに提供する必要があります。これは、$HOME/.aws/credentialsファイルを介して標準的な方法で行うことができます。

$HOME/.aws/credentials file.

# CREDENTIALS FOR AWS ACCOUNT
aws_region = us-east-1
aws_access_key_id = AKIAQ33BWUG3BLXXXXX
aws_secret_access_key = bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

IAMポリシーをIAMアカウントに直接割り当てるか、roleに割り当てて、エクスポーターに権限を付与できます。

最後に、監視するFargateタスクをデプロイするクラスタでContainer Insightsを必ず有効にしてください。AWS ECSまたはAWS EKSとKubernetesでContainer Insightsを設定する方法に関するドキュメントを確認できます。

エクスポーターの設定

我々は、Goで記述され、デプロイ可能なステーブルバージョンのイメージが含まれている、yet-another-cloudwatch-exporter(YACE)を選択しました。私たちは最近、このエクスポーターをより効率的で信頼できるものにするためにコントリビュートしました。

このエクスポーターはAWS CloudWatchからメトリクスをフェッチし、標準のPrometheusメトリクス形式で公開します。次に、Sysdigエージェントのprometheus取り込みコンポーネントまたはPrometheusサーバーによって、それらをスクレイプすることができます。

YACEエクスポーターは、任意のCloudWatchネームスペースからメトリクスを収集できます。したがって、AWS Fargateを監視するには、正しいネームスペースとメトリクスを定義して、スクレイピングするFargateメトリクスを選択するだけです。

そのためには、最初にエクスポーター用の設定ファイルを作成する必要があります。この設定では、エクスポーターがスクレイピングするメトリクス、およびどのリージョンから、どのディメンションからCloudWatchに集約を作成するよう要求するかを定義します。

たとえば、この場合、リージョンus-east-1を使用し、CloudWatchにディメンションServiceNameを使用してメトリクスを集計するように依頼します。

次にconfig.yml設定ファイルの例を示します。

CloudWatch exporterのサンプルconfig.yml ファイル

discovery:
  jobs:
  - region: us-east-1
    type: ecs-containerinsights
    enableMetricData: true
    metrics:
      - name: ContainerInstanceCount
        statistics:
        - Average
        period: 300
        length: 3600
      - name: ServiceCount
        statistics:
        - Average
        period: 300
        length: 3600
  - region: us-east-1
    type: ecs-containerinsights
    enableMetricData: true
    awsDimensions:
      - ServiceName
    metrics:
      - name: CpuReserved
        statistics:
        - Average
        period: 300
        length: 3600
      - name: CpuUtilized
        statistics:
        - Average
        period: 300
        length: 3600
      - name: MemoryReserved
        statistics:
        - Average
        period: 300
        length: 3600
      - name: MemoryUtilized
        statistics:
        - Average
        period: 300
        length: 3600
      - name: StorageReadBytes
        statistics:
        - Average
        period: 300
        length: 3600
      - name: StorageWriteBytes
        statistics:
        - Average
        period: 300
        length: 3600
      - name: NetworkRxBytes
        statistics:
        - Average
        period: 300
        length: 3600
      - name: NetworkTxBytes
        statistics:
        - Average
        period: 300
        length: 3600
      - name: DesiredTaskCount
        statistics:
        - Average
        period: 300
        length: 3600
      - name: TaskCount
        statistics:
        - Average
        period: 300
        length: 3600
      - name: PendingTaskCount
        statistics:
        - Average
        period: 300
        length: 3600
      - name: RunningTaskCount
        statistics:
        - Average
        period: 300
        length: 3600
      - name: DeploymentCount
        statistics:
        - Average
        period: 300
        length: 3600
      - name: TaskSetCount
        statistics:
        - Average
        period: 300
        length: 3600

設定ファイルでは、パラメーターenableMetricDataがtrueに設定されていることに注意してください。これは、このAPI関数により、エクスポーターが1回の呼び出しで複数のメトリクスを取得できるためです。これは、AWS APIサービスをブロックする可能性があるCloudWatch APIへのスロットルシナリオを防ぐために重要です。

以下に注意してください。

  1. 追加の指標を追加する場合は、AWS ECS Insightsのメトリクスをよく読んで、正しい統計を使用してください。
  2. CloudWatchはさまざまなディメンションで集計を提供するため、必要なものを指定し、FargateのAWSドキュメントでサポートされていることを確認することを忘れないでください。不正なディメンションを要求すると、CloudWatchはデータを返しません。
  3. CloudWatchメトリクスを収集すると、AWSの請求に一定の費用がかかる場合があります。CloudWatchサービスのクォータ制限に関するAWSドキュメントを確認してください。

IAMアカウントの認証情報と設定ファイルの準備ができたら、次のようにKubernetesファイルを作成できます。

apiVersion: v1
kind: Namespace
metadata:
  name: yace
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: yace-fargate
  namespace: yace    
spec:
  selector:
    matchLabels:
      app: yace-fargate
  replicas: 1
  template:
    metadata:
      labels:
        app: yace-fargate
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "5000"
    spec:
      containers:
      - name: yace
        image: quay.io/invisionag/yet-another-cloudwatch-exporter:v0.16.0-alpha
        ports:
        - containerPort: 5000
        volumeMounts:
          - name: yace-fargate-config
            mountPath: /tmp/config.yml
            subPath: config.yml
          - name: yace-fargate-credentials
            mountPath: /exporter/.aws/credentials
            subPath: credentials
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
      volumes:
        - configMap:
            defaultMode: 420
            name: yace-fargate-config
          name: yace-fargate-config
        - secret:
            defaultMode: 420
            secretName: yace-fargate-credentials
          name: yace-fargate-credentials
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: yace-fargate-config
  namespace: yace
data:
  config.yml: |
    discovery:
      jobs:
      - region: us-east-1
        type: ecs-containerinsights
        enableMetricData: true
        metrics: 
          - name: ContainerInstanceCount
            statistics:
            - Average
            period: 300
            length: 3600
          - name: ServiceCount
            statistics:
            - Average
            period: 300
            length: 3600
      - region: us-east-1
        type: ecs-containerinsights
        enableMetricData: true
        awsDimensions: 
          - ServiceName
        metrics: 
          - name: CpuReserved
            statistics: 
            - Average
            period: 300
            length: 3600
          - name: CpuUtilized
            statistics:
            - Average
            period: 300
            length: 3600
          - name: MemoryReserved
            statistics:
            - Average
            period: 300
            length: 3600
          - name: MemoryUtilized
            statistics:
            - Average
            period: 300
            length: 3600
          - name: StorageReadBytes
            statistics:
            - Average
            period: 300
            length: 3600
          - name: StorageWriteBytes
            statistics:
            - Average
            period: 300
            length: 3600
          - name: NetworkRxBytes
            statistics:
            - Average
            period: 300
            length: 3600
          - name: NetworkTxBytes
            statistics:
            - Average
            period: 300
            length: 3600
          - name: DesiredTaskCount
            statistics:
            - Average
            period: 300
            length: 3600
          - name: TaskCount
            statistics:
            - Average
            period: 300
            length: 3600
          - name: PendingTaskCount
            statistics:
            - Average
            period: 300
            length: 3600
          - name: RunningTaskCount
            statistics:
            - Average
            period: 300
            length: 3600
          - name: DeploymentCount
            statistics:
            - Average
            period: 300
            length: 3600
          - name: TaskSetCount
            statistics:
            - Average
            period: 300
            length: 3600
---
apiVersion: v1
kind: Secret
metadata:
  name: yace-fargate-credentials
  namespace: yace
data:
  # Add in credentials the result of: 
  # cat ~/.aws/credentials | base64
  credentials: |
    XXXXX

このファイルでは、以下を見つけることができます。

  • Namespace 'yace'
  • エクスポーターによるデプロイメント。このデプロイメントには2つのボリュームがあり、1つには設定ファイルがあり、もう1つには資格情報があります。デプロイメントには、スクレイピング用のPrometheusタグとポートのスクレイピングのアノテーションが付けられていることに注意してください。
  • エクスポーターの設定用のConfigMap。
  • IAMアカウントの認証情報のシークレット。

簡単なテストとして、ポッドのポート5000を転送してCloudWatchエクスポーターを確認し、yace-fargateのURLでページを閲覧できます。

http://<our machine>:5000/metrics

すべて問題なければ、次のようなメトリクスのWebページが表示されるはずです(サイズが原因で出力が切り捨てられます)。

# HELP aws_ecs_containerinsights_cpu_reserved_average Help is not implemented yet.
# TYPE aws_ecs_containerinsights_cpu_reserved_average gauge
aws_ecs_containerinsights_cpu_reserved_average{dimension_ClusterName="damir-test-cloudwatch",dimension_ServiceName="nginx",name="arn:aws:ecs:us-east-1:XXXXXXXXXX:cluster/ECS-Nirav",region="us-east-1"} 256
aws_ecs_containerinsights_cpu_reserved_average{dimension_ClusterName="damir-test-cloudwatch",dimension_ServiceName="nginx",name="arn:aws:ecs:us-east-1:XXXXXXXXXX:cluster/damir-test-cloudwatch",region="us-east-1"} 256
aws_ecs_containerinsights_cpu_reserved_average{dimension_ClusterName="damir-test-cloudwatch",dimension_ServiceName="nginx",name="arn:aws:ecs:us-east-1:XXXXXXXXXX:cluster/garrick-tam-ECS-case4154-repro",region="us-east-1"} 256
# HELP aws_ecs_containerinsights_cpu_utilized_average Help is not implemented yet.
# TYPE aws_ecs_containerinsights_cpu_utilized_average gauge
aws_ecs_containerinsights_cpu_utilized_average{dimension_ClusterName="damir-test-cloudwatch",dimension_ServiceName="nginx",name="arn:aws:ecs:us-east-1:XXXXXXXXXX:cluster/ECS-Nirav",region="us-east-1"} 0.03375506236035767
aws_ecs_containerinsights_cpu_utilized_average{dimension_ClusterName="damir-test-cloudwatch",dimension_ServiceName="nginx",name="arn:aws:ecs:us-east-1:XXXXXXXXXX:cluster/damir-test-cloudwatch",region="us-east-1"} 0.03375506236035767
aws_ecs_containerinsights_cpu_utilized_average{dimension_ClusterName="damir-test-cloudwatch",dimension_ServiceName="nginx",name="arn:aws:ecs:us-east-1:XXXXXXXXXX:cluster/garrick-tam-ECS-case4154-repro",region="us-east-1"} 0.03375506236035767

AWS Fargateタスクのモニタリング:何を見るべきですか?

さまざまな状態のタスクの数:これらのメトリクスは、サービスの正健全性とクラスター内のリソースの使用率に対処するのに特に役立ちます。CloudWatchは、実行状態、保留状態、および必要なタスクのFargateタスクの数を監視するメトリクスを提供します。さまざまな状態のタスクの数を監視すると、サービスの使用状況をすばやく確認できます。

aws_ecs_containerinsights_pending_task_count_average
aws_ecs_containerinsights_running_task_count_average
aws_ecs_containerinsights_desired_task_count_average

CPUとメモリの使用状況:監視する他の重要なメトリクスは、CPUとメモリの使用状況です。Fargateでは、定義されたタスク用にCPUとメモリの両方を予約することが重要です。これは、タスクが使用するリソースによって計算されるため、サービスの使用量と課金を下げるのに役立ちます。

CPUとメモリの両方の正しい量を設定することが重要です。リソースの予約を必要以上に高く設定すると、支払われるリソースが十分に活用されなくなります。一方、予約が少なすぎると、コンテナでパフォーマンスの問題が発生します。

これに対処するために、CloudWatchは、CPU、メモリ使用量、およびキャパシティに関する次のメトリクスを提供します。

aws_ecs_containerinsights_cpu_utilized_average
aws_ecs_containerinsights_cpu_reserved_average
aws_ecs_containerinsights_memory_utilized_average
aws_ecs_containerinsights_memory_reserved_average

クラスター概要ダッシュボードは、CPUとメモリの使用率の高いタスクを検出するためのパネルを提供します。また、サービス詳細ダッシュボードでは、単一サービスによるリソースの使用状況を調査して、メモリとCPUの予約を適切に調整し、クラスター内のリソースの使用率を最適化できます。

ディスク使用量とネットワークパフォーマンスの監視:最後に、これらのダッシュボードはタスクのディスク使用率に関する情報も提供します。ブリッジネットワークモードを使用するタスクでは、ネットワーク使用率の追加のメトリクスを利用できます。ディスクとネットワークの使用率メトリクスは、パフォーマンスのトラブルシューティングと評価に使用できます。

考えられる問題とそれらを検出するためのアラート

crash loop back off内のタスク::アラームを設定して、一定の期間クラスター内で再発する保留中のタスクを検出し、初期化で繰り返し問題が発生しているタスクを検出できます。次のpromQL文は、特定のサービスの保留中のタスクがある場合に警告します。

aws_ecs_containerinsights_pending_task_count_average > 0

タスク数のプログラムされていない障害またはスパイク:カスタムアラームを設定して、特定のサービスの実行中のタスクの数が特定の値を下回ったり超えたりした場合に警告したり、サービスの障害やタスクの数のプログラムされていないスパイクを検出したりできます。このpromQLは、クラスター内の特定のサービスの実行状態のタスクが5つ未満になると検出します。

aws_ecs_containerinsights_running_task_count_average{dimension_ClusterName='clusterName', dimension_ServiceName='serviceName'} < 5

Out Of Memory (OOM) Kills and CPU throttling:必要よりも少ないCPUを予約すると、タスクでCPUスロットリングが発生し、パフォーマンスに問題が発生します。必要よりも少ないメモリを予約すると、OOM killの問題が発生します。このpromQLは、サービスが予約済みメモリの75%以上を使用していることを検出します。

avg by (dimension_ServiceName)(aws_ecs_containerinsights_memory_utilized_average / aws_ecs_containerinsights_memory_reserved_average) > 0.75 

この2番目のpromQLは、CPU容量の75%が使用されているサービスを検出します。

avg by (dimension_ServiceName)(aws_ecs_containerinsights_cpu_utilized_average / aws_ecs_containerinsights_cpu_reserved_average) > 0.75

警告とさらなる改善

これは、Prometheusエクスポーターを使用してAWS Fargateを監視し、少ない労力でカスタムメトリクスを取得する方法の単純化したプレゼンテーションでした。

いくつかの警告と制限がまだ残っています:

  1. 多数のタスクがあるクラスターでは、CloudWatchによって提供される多数のメトリクスも存在する場合があります。これは、CloudWatchの使用量が予想外に増える可能性があります。これを回避するために、提示したCloudWatchエクスポーターは、タグでメトリクスを要求するリソースをフィルターするように設定ができます。たとえば、開発環境からではなく、本番環境のメトリクスに関心がある場合があります。
  2. この例では、粒度が300秒のメトリクスを要求するようにエクスポーターを設定しました。これは、エクスポーターに、デフォルトで300秒ごとにCloudWatchへの呼び出しをプロキシできる機能があるためです。ただし、これは異なる値に変更および調整できます。タグでサービスをフィルタリングすると、5分では不十分な重要なタスクのデータを60秒の粒度とプロキシリフレッシュで設定し、その他の重要度の低いサービスでは1時間の粒度を設定できます。このようにして、CloudWatchアカウントの請求を最適化できます。
  3. この例では、Fargateで使用できる最も関連性の高いメトリクスを含めました。ただし、設定をカスタマイズして、不要なメトリクスを削除したり、他のメトリクスを含めることができます。

CloudWatchメトリクスをSysdigモニターで取得する

Sysdigエージェントのセットアップ

このセクションでは、これらのメトリクスをSysdigモニターに取り込む方法を示します。これはかなり簡単で、インストールするとSysdigエージェントの最小構成が必要になるため、Prometheusメトリクスをキャプチャーします。

以下は/opt/draios/etc/dragent.yaml、エクスポーターでコンテナーのスクレイピングを実行するファイルに挿入する必要があるいくつかのサンプルコードです。

10s_flush_enable: true
use_promscrape: true
prometheus:
 enabled: true
 histograms: true
 ingest_raw: true
 ingest_calculated: false
 interval: 10
 log_errors: true
 max_metrics: 3000
 max_metrics_per_process: 20000
snaplen: 512
tags: role:cluster

主な項目は次のとおりです。

  1. Prometheusメトリクスの収集をオンにします。
  2. Prometheusスクレーパーのプロセスフィルターを指定します。スクレイプ、パス、ポートのPrometheusアノテーションは、エクスポーターを起動したコマンドでも定義されていることに注意してください。

設定が保存されると、エージェントはそれを自動的に取得します。

数分以内に、メトリクスが少しずつ流れ始め、Sysdigモニターインターフェイスに表示されます。

ダッシュボードとアラートによるAWS Fargateのモニタリング

Sysdig MonitorでFargateメトリクスを取得したら、ダッシュボードを使用してそれらを視覚化できます。そのために、Sysdigは一般的なThe Cluster Overview Dashboardを提供しています。The Cluster Overview Dashboardは、クラスタ内のタスクの全体的な動作の概要を把握でき、簡単に潜在的な問題を特定することができます。

20200610-4.png

Sysdigモニター- AWS Fargate Cluster Overview Dashboard

the Service Detail Dashboardでは、変数を使用して、詳細に検査するクラスターとサービスの両方を選択できます。

20200610-5.png

Sysdigモニター- AWS Fargate Service Detail Dashboard

まとめ

CloudWatchメトリクスをSysdig Monitorに統合することで、AWS Fargateを監視するのが本当に簡単であることを実証しました。これは、Prometheusメトリクスをネイティブに取り込み、この記事で紹介したCloudWatchエクスポーターなどの既存のエクスポーターを活用するための標準化されたインターフェイスを持つことで可能になります。

この統合を試してみたい場合は、無料トライアルにサインアップしてください。

また、PromCat.ioでAWS Fargateを監視するためのエクスポーターとすぐに使用できる設定をインストールする方法の説明を見つけることもできます。そこでは、私たちがGrafanaとSysdigの両方の形式で提示したダッシュボードや、サービスのアラートの例も見つかります。

Prometheusの統合について詳しくは、ドキュメントまたはブログをご覧ください。

Sysdigに関するお問い合わせはこちらから

最近の投稿

カテゴリー

アーカイブ

ご質問・お問い合わせはこちら

top