New Relic の AWS IntegrationとECS integration を有効化し、AWS Fargate のメトリクスを連携してみた

New Relicを触ったことがないので、AWSの各種メトリクスをNew Relicと連携させてみました
2023.04.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

New Relicでは、AWSなどのクラウドサービスのデータを収集・可視化し、パフォーマンスの向上、トラブルシューティングの迅速化、システム運用リソースやコストの最適化を図ることができるサービスです。

New Relic にAWSの各種メトリクスを取り込む手順は、2つありますので、それぞれ行います。

  • AWS Integration の有効化
    • CloudWatch メトリクスのデータを New Relic に連携します
  • ECS Integration の有効化
    • CloudWatch の標準メトリクスでは収集できないタスク・コンテナレベルのメトリクスをNew Relic に連携します

AWS Integration と ECS integrationは、コンテナアプリケーションの オブザーバビリティ実現手順で紹介されている以下の部分に当たります。

事前準備

  • New Relicアカウントの作成

  • Fargateでタスク起動できるコンテナ

    • 何でもよいですが、私は、今回Nginxを利用します
    • パブリックサブネット上で、起動しています

AWS Integration の有効化

下記の記事通り行うと設定できます。

設定後、数分すると、AWSリソースのメトリクスがNew Relic上で見ることができます。

New Relic の[Infrastructure]からExplore your data.をクリックすると、確認できます。

必要なメトリクスのみを送信する

AWSリソースのメトリクスが全て送信されるとコスト的に心配な方は、必要なメトリクスのみを送信する設定を行いましょう。

CloudWatch側で以下の設定をします。

  1. CloudWatchのコンソール画面から[メトリクス]→[ストリーム]に遷移し、New Relic用のメトリクスストリームをクリックします
  2. [編集]から、[名前空間を選択]から必要なサービスを選択します

    • 今回は、ECSECRECS/ContainerInsightsを選択しました
  3. 選択したメトリクスのみがNew Relic上で見ることができました。

ECS Integration の有効化

有効化の方法は、複数ありますが、今回は、CloudFormation を使用してインストールします

手順は、以下のドキュメントにも記載があります。

  1. このスタックをクリックし、デプロイします。
    • パラメータのLicenseKeyは、New RelicのAPI Key のうち、タイプがINGEST - LICENSEの値です。
  2. スタックは、3つ作成されます。作成されたリソースのうち、以下のARNをコピーしておきます。
    • NewRelicECSTaskExecutionRole
    • NewRelicLicenseKeySecret
  3. Nginxコンテナに対して、New Relicへ送信するコンテナをサイドカーとして追加するため、Nginx用のタスク定義を修正します。修正箇所は、3つです
    • executionRoleArn
      • 先程作成したNewRelicECSTaskExecutionRoleのARNに変更します
      • 後述するタスク定義には、3.で作成されたタスク実行ロールのARNと記載しています
    • containerDefinitions
      • サイドカーとして、New Relicへ送信するコンテナを追加します
    • containerDefinitions
      • New Relic のライセンスキーが格納されている Secret の NewRelicLicenseKeySecretを追加します。
      • 後述するタスク定義には、3. で作成されたしたシークレットのARNと記載しています
  4. ECSのコンソールから、Nginx用のタスク定義を選択し、JSON を使用してリビジョンを作成をクリックし、タスク定義を修正します。

    containerDefinitionsの追加する内容 (クリックすると展開します)
    {
      "image": "newrelic/infrastructure-bundle:1.5.0",
      "name": "newrelic-infra",
      "cpu": 256,
      "memoryReservation": 512,
      "secrets": [
        {
          "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:<アカウントID>:secret:NewRelicLicenseKeySecret-cXt38OPRg7Ex-r4KcIv",
          "name": "NRIA_LICENSE_KEY"
        }
      ],
      "environment": [
        {
          "name": "NRIA_OVERRIDE_HOST_ROOT",
          "value": ""
        },
        {
          "name": "NRIA_IS_SECURE_FORWARD_ONLY",
          "value": "true"
        },
        {
          "name": "FARGATE",
          "value": "true"
        },
        {
          "name": "ENABLE_NRI_ECS",
          "value": "true"
        },
        {
          "name": "NRIA_PASSTHROUGH_ENVIRONMENT",
          "value": "ECS_CONTAINER_METADATA_URI,ENABLE_NRI_ECS,FARGATE"
        },
        {
          "name": "NRIA_CUSTOM_ATTRIBUTES",
          "value": "{\"nrDeployMethod\":\"downloadPage\"}"
        }
      ]
    }
    Nginxのタスク定義 (修正前) (クリックすると展開します)
    {
        "family": "nginx",
        "containerDefinitions": [
            {
                "name": "nginx",
                "image": "<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:dev",
                "cpu": 0,
                "portMappings": [
                    {
                        "name": "nginx-80-tcp",
                        "containerPort": 80,
                        "hostPort": 80,
                        "protocol": "tcp",
                        "appProtocol": "http"
                    }
                ],
                "essential": true,
                "environment": [],
                "environmentFiles": [],
                "mountPoints": [],
                "volumesFrom": [],
                "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-create-group": "true",
                        "awslogs-group": "/ecs/nginx",
                        "awslogs-region": "ap-northeast-1",
                        "awslogs-stream-prefix": "ecs"
                    }
                }
            }
        ],
        "executionRoleArn": "arn:aws:iam::<アカウントID>:role/ecsTaskExecutionRole",
        "networkMode": "awsvpc",
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "256",
        "memory": "512",
        "runtimePlatform": {
            "cpuArchitecture": "X86_64",
            "operatingSystemFamily": "LINUX"
        },
        "tags": [
            {
                "key": "ecs:taskDefinition:createdFrom",
                "value": "ecs-console-v2"
            }
        ]
    }
    Nginxのタスク定義 (修正後) (クリックすると展開します)
    {
        "family": "nginx",
        "containerDefinitions": [
            {
                "name": "nginx",
                "image": "<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:dev",
                "cpu": 0,
                "portMappings": [
                    {
                        "name": "nginx-80-tcp",
                        "containerPort": 80,
                        "hostPort": 80,
                        "protocol": "tcp",
                        "appProtocol": "http"
                    }
                ],
                "essential": true,
                "environment": [],
                "mountPoints": [],
                "volumesFrom": [],
                "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-create-group": "true",
                        "awslogs-group": "/ecs/nginx",
                        "awslogs-region": "ap-northeast-1",
                        "awslogs-stream-prefix": "ecs"
                    }
                }
            },
            {
                "name": "newrelic-infra",
                "image": "newrelic/infrastructure-bundle:1.5.0",
                "cpu": 256,
                "memoryReservation": 512,
                "portMappings": [],
                "essential": true,
                "environment": [
                    {
                        "name": "ENABLE_NRI_ECS",
                        "value": "true"
                    },
                    {
                        "name": "NRIA_CUSTOM_ATTRIBUTES",
                        "value": "{\"nrDeployMethod\":\"downloadPage\"}"
                    },
                    {
                        "name": "NRIA_IS_SECURE_FORWARD_ONLY",
                        "value": "true"
                    },
                    {
                        "name": "NRIA_PASSTHROUGH_ENVIRONMENT",
                        "value": "ECS_CONTAINER_METADATA_URI,ENABLE_NRI_ECS,FARGATE"
                    },
                    {
                        "name": "FARGATE",
                        "value": "true"
                    },
                    {
                        "name": "NRIA_OVERRIDE_HOST_ROOT",
                        "value": ""
                    }
                ],
                "mountPoints": [],
                "volumesFrom": [],
                "secrets": [
                    {
                        "name": "NRIA_LICENSE_KEY",
                        "valueFrom": "<3. で作成されたしたシークレットのARN>"
                    }
                ]
            }
        ],
        "executionRoleArn": "<3. で作成されたIAMロールのARN>",
        "networkMode": "awsvpc",
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "256",
        "memory": "512",
        "runtimePlatform": {
            "cpuArchitecture": "X86_64",
            "operatingSystemFamily": "LINUX"
        },
        "tags": [
            {
                "key": "ecs:taskDefinition:createdFrom",
                "value": "ecs-console-v2"
            }
        ]
    }

    Nginxのタスク定義 (修正後)の69行目と74行目は、先程コピーしたARNを貼り付けます

  5. 上記の作成したタスク定義を使い、タスクを起動します。 問題なければ、コンテナのnginxnewrelic-infraがRUNNING になります。
  6. 数分すると、New Relicにメトリクスが送信されます。New Relic の[All Entities]から[ECS clusters]を選択し、対象のコンテナ(nginx)をクリックすると、確認できます。

最後に

New Relicと標準メトリクスや標準メトリクス以外の連携は、比較的簡単連携できました。

今後は、Application LogsなどもNew Relicに導入してみたいと思います。

ぜひ使ってみてください。

参考