みなさんこんにちは。ネコ好きなマネージドサービス部の塩野です。
今回も「【書評】オブザーバビリティ・エンジニアリングを読んでみた」からの連載シリーズで、 Amazon ECS Fargate環境へNew Relicのエージェントを導入する手順についてまとめてみました。
想定読者
- オブザーバビリティに興味がある方
- コンテナ環境でNew Relicのエージェントをどのように設定するのかの概要が知りたい方
この記事で記載する範囲
今回の記事では赤い枠で囲った部分になります。

ECS Fargate環境へのエージェント導入
サイドカーの起動(Amazon ECS Fargate)
Amazon ECSの仕様上、事前に作成されたタスク定義をクラスタ設定から呼び出して実行する流れとなりますので、設定の流れとして、まず監視用コンテナ(New Relic)のタスク定義を作成、その後に本番環境用として作成しているタスク定義にサイドカーとして監視用コンテナ(New Relic)を追加する流れとなります。サイドカーを追加後にタスクを起動することでコンテナの監視を行うことができるようになります。
事前推奨設定
Amazon ECS Fargate (サーバーレス) タイプでコンテナを稼働させる場合、事前にAWS Integrationの設定をおこない、AWS基盤の情報がNew Relic側に送信される状態にしておく必要があります。また、ECS設定画面で、クラスタ設定項目の中にあるモニタリングオプションのContainer Insightsを有効化にすることをオススメします。 なお、Container Insightsを利用する場合は、別途費用がかかりますのでご留意ください。

サンプル用のテストタスク
今回はnginxでhello worldと表示するテスト用のコンテナを使用し、このコンテナのホストOSを監視するシナリオとさせていただきます。
{
"family": "nginx-hello-world",
"containerDefinitions": [
{
"name": "nginx",
"image": "nginx:latest",
"cpu": 0,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"essential": true,
"entryPoint": [
"sh",
"-c",
"echo 'Hello World' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"
],
"environment": [],
"mountPoints": [],
"volumesFrom": [],
"systemControls": []
}
],
"executionRoleArn": "ECSタスク実行用IAMロールのARNを記載",
"networkMode": "awsvpc",
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "1024",
"memory": "3072"
}
サイドカーの設定
サイドカーの設定はNew Relic側の管理画面から直接設定することはできません。 公式ホームページのECSインテグレーションのインストール手順を参考に作業を実施していきます。
※本設定はCloudformationを利用して設定をおこないます。
下記の手順にも記載しておりますが、事前にAWSのマネジメント
コンソールへのログインが必要になりますのでご注意ください
※当記事の途中でAWSのECS画面の操作をおこないますが、
CI/CDなどで制御されている場合は、そちらの設定に従ってください。
存在するAWSアカウントにログインする
2.New Relic公式ページ(ECSインテグレーションのインストール)に
アクセスし、「CloudFormationを使用してインストールする」の項の
「このスタックをデプロイします」のリンクを開く
3.パラメータの中にあるLicenseKeyを入力する
※LicenseKeyはNew Relic管理画面の中の、ログイン名>API Keysから
新規発行することができます。

4.赤枠の部分にチェックを入れて、スタックの作成をクリックする

5.公式サイトからタスク定義の例(下記参照)をダウンロードし、
アプリケーションのタスク定義にサイドカーとして追加する
▼ダウンロード元URL
curl -O https://download.newrelic.com/infrastructure_agent/integrations/ecs/newrelic-infra-ecs-fargate-example-latest.json
▼newrelic-infra-ecs-fargate-example-latest.jsonの中身
{
"executionRoleArn": "<YOUR_TASK_EXECUTION_ROLE>",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"runtimePlatform": {
"cpuArchitecture": "X86_64"
},
"cpu": "256",
"memory": "512",
"containerDefinitions": [
{
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
],
"image": "busybox:latest",
"name": "busybox"
},
{
"environment": [
{
"name": "NRIA_OVERRIDE_HOST_ROOT",
"value": ""
},
{
"name": "NRIA_IS_FORWARD_ONLY",
"value": "true"
},
{
"name": "FARGATE",
"value": "true"
},
{
"name": "NRIA_PASSTHROUGH_ENVIRONMENT",
"value": "ECS_CONTAINER_METADATA_URI,ECS_CONTAINER_METADATA_URI_V4,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/nri-ecs:1.11.5",
"name": "newrelic-infra"
}
],
"family": "BusyBoxWithNewRelicInfraSidecar"
}
5-1.JSONの中の<YOUR_TASK_EXECUTION_ROLE>や<SYSTEM_MANAGER_LICENSE_PARAMETER_NAME>を記載する
▼<YOUR_TASK_EXECUTION_ROLE>値の入手先について
※ARNを書く必要があるため、ロール名と間違えないように
ご注意ください
※IAMの管理画面からロールを開いて、NewRelicなどで検索すると
対象のロールが表示されます

▼<SYSTEM_MANAGER_LICENSE_PARAMETER_NAME>値の入手先について
※Secret Managerを開いて、NewRelicLicenseKeyで検索をすると、対象の
シークレットの名前が表示されますので、その名前を設定します

※複数リージョンにタスク定義を作成する場合で、シークレットの値が保存されているリージョンとは 別リージョンにタスク定義を作成する場合は、シークレットの名前の代わりにシークレットのARNを 使用して設定してください
※Secret Managerのシークレットの名前を設定しても、うまくタスクが動作しなかった場合は、 シークレットの名前の代わりにシークレットのARNを使用して設定してください

※注意:<SYSTEM_MANAGER_LICENSE_PARAMETER_NAME>は、New RelicのJSONに記載の名称から推測すると、 シークレットの名称でもいいような書かれ方をしていますが、シークレットの値が保存されているリージョンと タスク定義が同一リージョンの場合のみ名称の指定が可能となります。詳細は下記のドキュメントを参照ください。
docs.aws.amazon.com
5-2.ECSのタスク定義画面でJSONを使用した新しいリビジョンの
作成を行い、上記で編集したタスク定義を更新する

▼ 更新したタスク定義
{
"family": "nginx-hello-world",
"containerDefinitions": [
{
"name": "nginx",
"image": "nginx:latest",
"cpu": 0,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"essential": true,
"entryPoint": [
"sh",
"-c",
"echo 'Hello World' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"
],
"environment": [],
"mountPoints": [],
"volumesFrom": [],
"systemControls": []
}
,{
"environment": [
{
"name": "NRIA_OVERRIDE_HOST_ROOT",
"value": ""
},
{
"name": "NRIA_IS_FORWARD_ONLY",
"value": "true"
},
{
"name": "FARGATE",
"value": "true"
},
{
"name": "NRIA_PASSTHROUGH_ENVIRONMENT",
"value": "ECS_CONTAINER_METADATA_URI,ECS_CONTAINER_METADATA_URI_V4,FARGATE"
},
{
"name": "NRIA_CUSTOM_ATTRIBUTES",
"value": "{\"nrDeployMethod\":\"downloadPage\"}"
}
],
"secrets": [
{
"valueFrom": "Cloudformationで作成されたシークレットのARNを記載",
"name": "NRIA_LICENSE_KEY"
}
],
"cpu": 256,
"memoryReservation": 512,
"image": "newrelic/nri-ecs:1.11.5",
"name": "newrelic-infra"
}
],
"executionRoleArn": "Cloudformationで作成されたECSタスク実行用IAMロールのARNを記載",
"networkMode": "awsvpc",
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "1024",
"memory": "3072"
}
6.ECSのタスク定義画面で、デプロイからサービスの更新をおこなう
6-1.必用に応じてクラスター名、サービス名を選択する
※当記事ではデプロイオプションなどの設定はすべてデフォルト値とします

6-2.更新をクリックしてタスクを更新する

7.New Relicの管理画面にログインし、All Entitiesを開き、Containerの
項目に、監視対象のタスクやnewrelic-infraのタスクが存在する
ことを確認する

まとめ
Amazon ECS Fargate環境へNew Relicのエージェントを導入してみましたが、 New Relicの公式手順通りにやってみても若干気になる点があったりしましたので、 その点についてはブログ記事の本文で注意を促すような書き方にしています。
コンテナの経験が浅くて、さらにNew Relicの経験も浅いと、初歩的なところで ハマってしまいそうな手順だったのが個人的には少し気になりました。
こちらの記事がどなたかのお役に立てれば幸いです。
宣伝
弊社では、お客様環境のオブザーバビリティを加速するためのNew Relicアカウント開設を含めた伴走型のNew Relic導入支援サービスをご提供しております。 もしご興味をお持ちの方は、こちらのお問合せフォームよりお問合せ頂けましたら幸いでございます。
関連記事
blog.serverworks.co.jp blog.serverworks.co.jp blog.serverworks.co.jp