Fargate 環境のタスクにNew Relic Infrastructure エージェントをサイドカーとして設定する


はじめに

本記事では、稼働中の Fargateの環境に New Relic Infrastructureエージェントをサイドカーに設定し、コンテナをモニタリングできるようにするまでの手順について記載しています。

詳細:

前提条件

  • AWS インテグレーションの設定が完了していること。
  • AWS インテグレーションで、ECS サービスをモニターする設定にしていること。

参考:

New Relic ライセンスキーを取得する

New Relic管理画面 > 対象の New Relic Account > API Keys

Type が INGEST - LICENSE の key をコピーして、取得します。

参考:

New Relic ライセンスキーをSystem Manager の Parameter Store に設定する

下記コマンドで、SSM Parameter Store に New Relic ライセンスキーを設定します。
Name は、任意で構いません。(ここでは、/newrelic-infra/ecs/license-key)

$ aws ssm put-parameter \
    --name "/newrelic-infra/ecs/license-key" \
    --type SecureString \
    --description 'New Relic license key for ECS monitoring' \
    --value [NewRelic ライセンスキー]

New Relic ライセンスキーアクセス用 IAM ポリシーを作成する

下記コマンドで、設定した Parameter Store の ARN を確認します。

$ aws ssm get-parameter \
    --name "/newrelic-infra/ecs/license-key" \
    --query Parameter.ARN

出力結果:
"arn:aws:ssm:ap-northeast-1:[AWS アカウントID]:parameter/newrelic-infra/ecs/license-key"

New Relic Infrastructureエージェントが、SSM Parameter Store にアクセスする為のポリシーファイル(ここでは、read-ssm-nr-licennse.json)を用意します。
Resouce に Parameter Store の ARN を記載します。

read-ssm-nr-licennse.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "ssm:GetParameters",
            "Resource": "[Parameter Store の ARN]",
            "Effect": "Allow"
        }
    ]
}

下記コマンドで、IAM ポリシーを作成します。
policy-name は、任意で構いません。(ここでは、NewRelicSSMLicenseKeyReadAccess)
出力結果の Arn をメモします。

$ aws iam create-policy \
    --policy-name "NewRelicSSMLicenseKeyReadAccess" \
    --policy-document file://read-ssm-nr-licennse.json
出力結果
{
    "Policy": {
        "PolicyName": "NewRelicSSMLicenseKeyReadAccess",
        "PolicyId": "********************",
        "Arn": "arn:aws:iam::[AWS アカウントID]:policy/NewRelicSSMLicenseKeyReadAccess",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2021-06-19T00:12:10Z",
        "UpdateDate": "2021-06-19T00:12:10Z"
    }
}

New Relic ライセンスキーアクセス用 IAM ポリシーをタスク実行ロールにアタッチする

下記コマンドで、現在稼働中のタスクのタスク実行ロールの IAM ポリシーを確認します。(ここでは、 ecsTaskExecutionRole )

$ aws iam list-attached-role-policies --role-name ecsTaskExecutionRole 
出力結果:
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonECSTaskExecutionRolePolicy",
            "PolicyArn": "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
        }
    ]
}

下記コマンドで、タスク実行ロールに作成した SSM Parameter Store にアクセスする為のポリシーをアタッチします。

$ aws iam attach-role-policy \
    --role-name "[タスク実行ロール名]" \
    --policy-arn "[IAM ポリシーARN]"

下記コマンドで、タスク実行ロールにポリシーがアタッチされたことを確認します。

$ aws iam list-attached-role-policies --role-name ecsTaskExecutionRole 
出力結果:
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonECSTaskExecutionRolePolicy",
            "PolicyArn": "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
        },
        {
            "PolicyName": "NewRelicSSMLicenseKeyReadAccess",
            "PolicyArn": "arn:aws:iam::[AWS アカウントID]:policy/NewRelicSSMLicenseKeyReadAccess"
        }
    ]
}

タスク定義に New Relic Infrastructure エージェントをサイドカーとして設定する

下記の公式のサイドカーコンテナを含むタスク定義の例を参考に、サイドカーの設定をします。

タスク定義の例

ここでは、次のようにタスクを定義しました。(下記の箇所は、任意に変更します。)

変更箇所
YOUR_TASK_DEFINITION_NAME タスクの定義名
YOUR_TASK_EXECUTION_ROLE タスク実行ロールのARN
SYSTEM_MANAGER_LICENSE_PARAMETER_NAME SSM Paraneter StoreのARN
fargate-nr-infra-agent-sample.json
{
    "family": "<YOUR_TASK_DEFINITION_NAME>",
    "executionRoleArn": "<YOUR_TASK_EXECUTION_ROLE>",
    "networkMode": "awsvpc",
    "requiresCompatibilities": ["FARGATE"],
    "cpu": "256",
    "memory": "512",
    "containerDefinitions": [
      {
        "portMappings": [
          {
            "hostPort": 80,
            "protocol": "tcp",
            "containerPort": 80
          }
        ],
        "image": "nginx:latest",
        "name": "nginx"
      },
      {
        "environment": [
          {
            "name": "NRIA_OVERRIDE_HOST_ROOT",
            "value": ""
          },
          {
            "name": "NRIA_IS_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\"}"
          }
        ],
        "secrets": [
          {
            "valueFrom": "<SYSTEM_MANAGER_LICENSE_PARAMETER_NAME>",
            "name": "NRIA_LICENSE_KEY"
          }
        ],
        "cpu": 256,
        "memoryReservation": 512,
        "image": "newrelic/infrastructure-bundle:2.4.1",
        "name": "newrelic-infra"
      }
    ]
  }

タスク定義を設定した後、タスクを起動して、New Relic Infrastructure エージェント(newrelic-infra)が、サイドカーとして起動していることを確認します。

New Relic でコンテナをモニタリングする

New Relic 管理画面 > Exploer > Containers でモニタリングできることを確認します。

以上です。