本文の内容は、2020年6月9日にDavid de Torres Huertaが投稿したブログ(https://sysdig.com/blog/monitor-aws-fargate-prometheus/)を元に日本語に翻訳・再構成した内容となっております。
この記事では、Sysdig Monitorを使用してAWS Fargateを簡単に監視する方法を示します。Sysdigでの既存のPrometheusの取り込みを活用することで、単一のペインオブグラスのアプローチでサーバーレスサービスを監視できるようになり、これらのサービスを本番環境で実行する自信が生まれます。
サーバーレスの台頭
現在、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はより効率的で信頼できるように、このエクスポーターにコントリビュートしました。
このユースケースでは、CloudWatchエクスポーターをKubernetesクラスターにデプロイし、AWSのFargateクラスターのメトリクスを収集するように設定します。このエクスポーターにはPrometheusタグでアノテーションが付けられるため、PrometheusサーバーとSysdigエージェントの両方がそれをスクレイプすることができます。次の図では、システムの全体図を示しています。
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へのスロットルシナリオを防ぐために重要です。
以下に注意してください。
- 追加の指標を追加する場合は、AWS ECS Insightsのメトリクスをよく読んで、正しい統計を使用してください。
- CloudWatchはさまざまなディメンションで集計を提供するため、必要なものを指定し、FargateのAWSドキュメントでサポートされていることを確認することを忘れないでください。不正なディメンションを要求すると、CloudWatchはデータを返しません。
- 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を監視し、少ない労力でカスタムメトリクスを取得する方法の単純化したプレゼンテーションでした。
いくつかの警告と制限がまだ残っています:
- 多数のタスクがあるクラスターでは、CloudWatchによって提供される多数のメトリクスも存在する場合があります。これは、CloudWatchの使用量が予想外に増える可能性があります。これを回避するために、提示したCloudWatchエクスポーターは、タグでメトリクスを要求するリソースをフィルターするように設定ができます。たとえば、開発環境からではなく、本番環境のメトリクスに関心がある場合があります。
- この例では、粒度が300秒のメトリクスを要求するようにエクスポーターを設定しました。これは、エクスポーターに、デフォルトで300秒ごとにCloudWatchへの呼び出しをプロキシできる機能があるためです。ただし、これは異なる値に変更および調整できます。タグでサービスをフィルタリングすると、5分では不十分な重要なタスクのデータを60秒の粒度とプロキシリフレッシュで設定し、その他の重要度の低いサービスでは1時間の粒度を設定できます。このようにして、CloudWatchアカウントの請求を最適化できます。
- この例では、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
主な項目は次のとおりです。
- Prometheusメトリクスの収集をオンにします。
- Prometheusスクレーパーのプロセスフィルターを指定します。スクレイプ、パス、ポートのPrometheusアノテーションは、エクスポーターを起動したコマンドでも定義されていることに注意してください。
設定が保存されると、エージェントはそれを自動的に取得します。
数分以内に、メトリクスが少しずつ流れ始め、Sysdigモニターインターフェイスに表示されます。
ダッシュボードとアラートによるAWS Fargateのモニタリング
Sysdig MonitorでFargateメトリクスを取得したら、ダッシュボードを使用してそれらを視覚化できます。そのために、Sysdigは一般的なThe Cluster Overview Dashboardを提供しています。The Cluster Overview Dashboardは、クラスタ内のタスクの全体的な動作の概要を把握でき、簡単に潜在的な問題を特定することができます。
Sysdigモニター- AWS Fargate Cluster Overview Dashboard
the Service Detail Dashboardでは、変数を使用して、詳細に検査するクラスターとサービスの両方を選択できます。
Sysdigモニター- AWS Fargate Service Detail Dashboard
まとめ
CloudWatchメトリクスをSysdig Monitorに統合することで、AWS Fargateを監視するのが本当に簡単であることを実証しました。これは、Prometheusメトリクスをネイティブに取り込み、この記事で紹介したCloudWatchエクスポーターなどの既存のエクスポーターを活用するための標準化されたインターフェイスを持つことで可能になります。
この統合を試してみたい場合は、無料トライアルにサインアップしてください。
また、PromCat.ioでAWS Fargateを監視するためのエクスポーターとすぐに使用できる設定をインストールする方法の説明を見つけることもできます。そこでは、私たちがGrafanaとSysdigの両方の形式で提示したダッシュボードや、サービスのアラートの例も見つかります。