アプリケーションメトリクスを Amazon Managed Service for Prometheus にエクスポートする - Amazon Elastic Container Service

アプリケーションメトリクスを Amazon Managed Service for Prometheus にエクスポートする

Amazon ECS は、タスクレベル CPU、メモリ、ネットワーク、ストレージメトリクス、カスタムアプリケーションメトリクスを Amazon Managed Service for Prometheus へエクスポートすることをサポートしています。これは、OpenTelemetry サイドカーコンテナ用 AWS Distro をタスク定義に追加することによって実行します。Amazon ECS コンソールでは、新しいタスク定義の作成時に [メトリクス収集の使用] オプションを追加することでこのプロセスが簡素化されます。詳細については、「コンソールを使用した Amazon ECS タスク定義の作成」を参照してください。

メトリクスは Amazon Managed Service for Prometheus にエクスポートされ、Amazon Managed Grafana ダッシュボードを使用して閲覧できます。アプリケーションは、Prometheus ライブラリまたは OpenTelemetry SDK のいずれかとインストルメント化する必要があります。OpenTelemetry SDK を使用したアプリケーションの計測の詳細については、AWS Distro for OpenTelemetry ドキュメントの「AWS Distro for OpenTelemetry の概要」を参照してください。

Prometheus ライブラリを使用する場合は、アプリケーションがメトリクスデータのスクレイプに使用する /metrics のエンドポイントを公開する必要があります。Prometheus ライブラリを使用してアプリケーションを計測する詳細については、「Prometheus ドキュメント」の「Prometheus クライアントライブラリ」を参照してください。

考慮事項

AWS Distro for OpenTelemetry での Fargate 統合で Amazon ECS を使用し、 Amazon Managed Service for Prometheus にアプリケーションメトリクスを送信する場合には、次のことを考慮する必要があります。

  • AWS Distro for OpenTelemetry の統合は、Fargate でホストされている Amazon ECS ワークロード、および、Amazon EC2 インスタンスでホストされている Amazon ECS ワークロード用としてサポートされています。現在、外部インスタンスはサポートされていません。

  • デフォルトの OpenElementry 用 AWS Distro には、Amazon Managed Service for Prometheus へエクスポートするとき、アプリケーションメトリクス用にタスクレベルのディメンションがすべて含まれています。アプリケーションをインストルメント化して、ディメンションを追加することもできます。詳細については、「AWS Distro for OpenTelemetry ドキュメント」の「Amazon Managed Service for Prometheus のリモート書き込みの使用開始」を参照してください。

OpenTelemetry 用 AWS Distro と Amazon Managed Service for Prometheus の統合に必要な IAM 許可

OpenTelemetry サイドカー用 AWS Distro を使用して Amazon ECS と Amazon Managed Service for Prometheus の統合には、タスク IAM ロールを作成してタスク定義でロールを指定する必要があります。このタスク用の IAM ロールは、タスク定義を登録する前に、次の手順を使用して手動で作成する必要があります。

OpenTelemetry サイドカー用 AWS Distro サイドカーを、CloudWatch ログに対するルートコンテナログにも構成することをお勧めします。これには、タスク実行 IAM ロールを作成して、タスク定義でも指定する必要があります。Amazon ECS コンソールは、ユーザーに代わってタスク実行 IAM ロールを処理しますが、タスク IAM ロールは手動で作成する必要があります。タスク実行用の IAM ロールを作成する方法の詳細については、「Amazon ECS タスク実行IAM ロール」を参照してください。

重要

OpenTelemetry 用 AWS Distro 統合を使用してアプリケーションのトレースデータも収集する場合、タスク IAM ロールもその統合に必要な許可が含まれていることを確認します。詳細については、「アプリケーショントレースデータを使用して Amazon ECS 最適化の機会を特定する」を参照してください。

Elastic Container Service のサービスロールを作成するには (IAM コンソール)
  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. IAM コンソールのナビゲーションペインで、[ロール]、[ロールを作成] を選択します。

  3. 信頼できるエンティティタイプ で、AWS のサービス を選択します。

  4. [サービスまたはユースケース][エラスティックコンテナサービス] を選択し、次に [エラスティックコンテナのサービスタスク] を選択します。

  5. [Next] を選択します。

  6. [アクセス許可の追加] セクションで [AmazonPrometheusRemoteWriteAccess] を検索し、そのポリシーを選択します。

  7. (オプション) アクセス許可の境界を設定します。このアドバンスド機能は、サービスロールで使用できますが、サービスにリンクされたロールではありません。

    1. [アクセス許可の境界の設定] セクションを開き、[アクセス許可の境界を使用してロールのアクセス許可の上限を設定する] を選択します。

      IAM には、アカウント内の AWS 管理ポリシーとカスタマー管理ポリシーのリストがあります。

    2. アクセス許可の境界として使用するポリシーを選択します。

  8. [Next] を選択します。

  9. このロールの目的を識別しやすいロール名またはロール名サフィックスを入力します。

    重要

    ロールに名前を付けるときは、次のことに注意してください。

    • ロール名は AWS アカウント内で一意である必要があります。ただし、大文字と小文字は区別されません。

      例えば、PRODROLEprodrole の両方の名前でロールを作成することはできません。ロール名がポリシーまたは ARN の一部として使用される場合、ロール名は大文字と小文字が区別されます。ただし、サインインプロセスなど、コンソールにロール名がユーザーに表示される場合、ロール名は大文字と小文字が区別されません。

    • 他のエンティティがロールを参照する可能性があるため、ロールを作成した後にロール名を編集することはできません。

  10. (オプション) [説明] にロールの説明を入力します。

  11. (オプション) ロールのユースケースとアクセス許可を編集するには、[ステップ 1: 信頼されたエンティティを選択] または [ステップ 2: アクセス権限を追加] のセクションで [編集] を選択します。

  12. (オプション) ロールの識別、整理、検索を簡単にするには、キーと値のペアとしてタグを追加します。IAM でのタグの使用に関する詳細については、『IAM ユーザーガイド』の「IAM リソースにタグを付ける」を参照してください。

  13. ロールを確認したら、[Create role] (ロールを作成) を選択します。

タスク定義の OpenTelemetry サイドカー用 AWS Distro を指定

Amazon ECS コンソールでは、[メトリクス収集の使用] オプションを使用することで、OpenTelemetry サイドカーコンテナ用の AWS Distro を作成するエクスペリエンスが簡素化されます。詳細については、「コンソールを使用した Amazon ECS タスク定義の作成」を参照してください。

Amazon ECS コンソールを使用していない場合、OpenTelemetry サイドカーコンテナ用 AWS Distro を手動でタスク定義に追加できます。次のタスク定義の例は、Amazon Managed Service for Prometheus 統合向けに OpenTelemetry サイドカー用 AWS Distro を追加するためのコンテナの定義を示しています。

{ "family": "otel-using-cloudwatch", "taskRoleArn": "arn:aws:iam::111122223333:role/AmazonECS_OpenTelemetryCloudWatchRole", "executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole", "containerDefinitions": [{ "name": "aws-otel-emitter", "image": "application-image", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/aws-otel-emitter", "awslogs-region": "aws-region", "awslogs-stream-prefix": "ecs" } }, "dependsOn": [{ "containerName": "aws-otel-collector", "condition": "START" }] }, { "name": "aws-otel-collector", "image": "public.ecr.aws/aws-observability/aws-otel-collector:v0.30.0", "essential": true, "command": [ "--config=/etc/ecs/ecs-amp.yaml" ], "environment": [{ "name": "AWS_PROMETHEUS_ENDPOINT", "value": "https://aps-workspaces.aws-region.amazonaws.com/workspaces/ws-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111/api/v1/remote_write" }], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "True", "awslogs-group": "/ecs/ecs-aws-otel-sidecar-collector", "awslogs-region": "aws-region", "awslogs-stream-prefix": "ecs" } } } ], "networkMode": "awsvpc", "requiresCompatibilities": [ "FARGATE" ], "cpu": "1024", "memory": "3072" }