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

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

詳細：

https://blog.newrelic.co.jp/devops/support-containermetricsforamazonecs/

https://docs.newrelic.com/docs/integrations/elastic-container-service-integration/installation/install-ecs-integration/
##前提条件
- AWS インテグレーションの設定が完了していること。
- AWS インテグレーションで、ECS サービスをモニターする設定にしていること。

参考：

https://docs.newrelic.com/jp/docs/integrations/amazon-integrations/get-started/connect-aws-new-relic-infrastructure-monitoring/

##New Relic ライセンスキーを取得する
New Relic管理画面 > 対象の New Relic Account > API Keys 
![01-fargate-newrelic-sidecar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/58e72f21-4db6-2974-82f2-dd6a1bb375dd.png)

Type が INGEST - LICENSE の key をコピーして、取得します。
![02-fargate-newrelic-sidecar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/8a3e0108-90a5-ff7e-8932-ca162b284f93.png)
参考：

https://docs.newrelic.com/docs/accounts/accounts-billing/account-setup/new-relic-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 エージェントをサイドカーとして設定する

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

タスク定義の例

https://download.newrelic.com/infrastructure_agent/integrations/ecs/newrelic-infra-ecs-fargate-example-latest.json

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

|変更箇所|値|
|:---|:---|
|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）が、サイドカーとして起動していることを確認します。
![03-fargate-newrelic-sidecar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/62e205c5-08c3-c44b-5be3-7eb7d3a27888.png)

##New Relic でコンテナをモニタリングする
New Relic 管理画面 > Exploer > Containers でモニタリングできることを確認します。 
![04-fargate-newrelic-sidecar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283246/dc6129f1-3ba2-dba3-9c0c-35399e7c4e5f.png)

以上です。