New RelicでFargate上のアプリをAPMする

# はじめに
New Relic APMを用いて、Fargate上アプリケーションのパフォーマンスモニタリングを試してみました。

# 背景と目的
Fargate上サービスのモニタリングは、現状だとCloudWatchによるCPU、メモリなどのリソース監視、またはアプリやミドルウェアのログ取得がメインで、トランザクショントレースやエラートレースなど、AWSの監視サービス群ではアプリケーションレイヤのパフォーマンスモニタリングは難しい状況です。

そこで本稿では、Fargate上に起動したアプリケーションをNew Relic APMによってパフォーマンスモニタリングする手順について解説していきたいと思います。なお、今回の監視対象アプリケーションはRailsで構築しています。

# 設定手順
Fargate上のRails AppをNew Relic APMで監視する手順は下記のとおりです。
## 1. ローカル環境でrails appの構築
まずはローカル環境上でRails Appを構築します。手順は[こちら](https://docs.docker.com/compose/rails/)などを参考に構築します。

## 2. New Relic APM Agentの設定
構築したrailsアプリのGemfileに下記を追記します。

```ruby:Gemfile
#下記を追記
gem 'newrelic_rpm'
```

つぎにconfig/配下にnewrelic.ymlを作成し、下記内容を記述します。**license_key**には自身のNew Relicアカウントのライセンスキーを入力します。また、**app_name**にはNew Relic APM画面で表示される際のApplication名を入力します。

```yaml:config/newrelic.yml
common: &default_settings
  # Required license key associated with your New Relic account.
  license_key: "Enter Your License-key"
  app_name: Qiita-Rails-Fargate
  log_level: info

development:
  <<: *default_settings
  app_name: Qiita-Rails-Fargate (Development)

test:
  <<: *default_settings
  # It doesn't make sense to report to New Relic from automated test runs.
  monitor_mode: false

staging:
  <<: *default_settings
  app_name: Qiita-Rails-Fargate (Staging)

production:
  <<: *default_settings
```

Gemfileの修正、設定ファイルの作成後、buildを再度実行します。

```
$ docker-compose build
```

ローカル環境で新たにbuildしたイメージをもとにサービスを立ち上げます。

```
$ docker-compose up
```

立ち上げたサービスにアクセスし、New Relic APMのApplication一覧に表示されるか確認します。

![スクリーンショット 2017-12-27 11.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/150903/a6a08039-2b4f-3604-d9bf-3e5a13e041a8.png)

## 3. ImageをECRにプッシュする
下記コマンドにより、2で作成したDocker ImageをECRにプッシュします。

```
$ ecs-cli push "Repository-Name" --region us-east-1
```

## 4. Fargate上にRails Appを構築
Fargate上にRails Appを構築していきます。なお、構築に必要な環境(VPC、サブネット、セキュリティグループ、RDS、ECSのクラスタ)は構築済みとします。

### ①. タスク定義の作成
AWSマネジメントコンソールのECS設定画面より、『タスク定義』の『新しいタスク定義の作成』を選択します。

![SnapCrab_NoName_2017-12-28_10-15-27_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/b32a6d72-12a7-f4f5-6640-7ac687293b93.png)

『ステップ1: Select launch type compatibility』画面にて、Fargateを選択し、『次のステップ』へを選択します。

![SnapCrab_NoName_2017-12-28_10-17-24_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/c35a948b-4ca3-d7fb-8fea-599d421ada9b.png)

『ステップ2: Configure task and container definitions』画面にて、下図赤枠の項目を入力し、『コンテナの追加』を選択します。

![SnapCrab_NoName_2017-12-28_10-22-11_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/371d22dd-af22-180b-b54b-68ba2f81bf44.png)

『コンテナの追加』画面にて、下記赤枠の情報を入力します。イメージにはECRに追加したRails イメージのレポジトリURIを指定します。入力後、必要に応じて『詳細コンテナ設定』を開きます。今回はRDSでMySQLを起動し、Rails Appと連携させたため、MySQLのpathなどを記載しています。一通り設定後、『追加』を選択します。

![SnapCrab_NoName_2017-12-28_10-26-16_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/8f20f28f-6cfb-4fab-c1b6-67b0f4aa3769.png)

![SnapCrab_NoName_2017-12-28_10-33-0_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/fa151e90-5786-1976-0b10-8b19898c79ac.png)

『ステップ 2: Configure task and container definitions』に戻り、『作成』を選択します。

![SnapCrab_NoName_2017-12-28_10-40-14_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/d691b41b-d78a-3538-c10b-fdabdc93aa9d.png)

### ②. タスクの起動
AWSマネジメントコンソールのECS設定画面より、『クラスター』よりタスクを起動するクラスタを選択します。

![SnapCrab_NoName_2017-12-28_10-43-44_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/6c59c33f-a629-fa82-b4fb-f366711c36ca.png)

『タスク』タブを開き、『新しいタスクの実行』を選択します。

![SnapCrab_NoName_2017-12-28_10-44-46_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/5f813593-9e33-da73-9800-42368b372e7d.png)

『タスクの定義』画面にて、下記赤枠の項目を入力します。『タスク定義』の項目には、前の手順で作成したタスクを指定します。また、『セキュリティグループ』には、HTTP通信アクセスを許可したグループとRDSとの通信が許可されたグループの2つを登録しています。

![SnapCrab_NoName_2017-12-28_10-48-4_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/2fb4f2f3-e1bf-682d-0e63-7e1cccfbf008.png)

『タスク』タブのタスク一覧にて、起動したタスクの『必要なステータス』が『Running』状態になれば、タスク起動は成功です。

![SnapCrab_NoName_2017-12-28_11-0-21_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/a4812143-2a62-b5b2-0d54-973351c91237.png)

起動したタスクを選択し、『詳細』タブからENI IDを選択します。ENI ID画面が開いたら、パブリックIPアドレスを控えます。

![SnapCrab_NoName_2017-12-28_11-5-42_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/c1b8e12f-2480-abb1-00bf-13a3b7884403.png)

ブラウザで、`http://タスクENIのパブリックIP/welcome/index`にアクセスし、下記の画面が表示されれば、Fargate上でのRails Appの構築は完了です。

![SnapCrab_NoName_2017-12-28_11-9-35_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/f9ab7a09-3dbe-9c69-fbd6-332a86250124.png)

## 5. New Relic APMで確認
New Relic APM画面で、Fargate上に起動したRails Appがアプリケーション一覧に表示されていれば成功です。表示名は、config/newrelic.ymlのProductionで指定したアプリケーション名になっているはずです。

![SnapCrab_NoName_2017-12-28_11-11-2_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/dd169c13-d901-56e7-1e3e-d189d0ce4b63.png)

Overview画面では、トランザクショントレースやスループット、エラートレースなどを見ることができます。Overviewの下部では、このアプリケーションが起動しているコンテナの情報も見ることができます。Hostの番号は各コンテナホストのユーザ名と紐づいており、このアプリケーションがどのコンテナで動いているかを把握することができます。

![SnapCrab_NoName_2017-12-28_11-21-40_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/3723e41b-2624-c52f-5c6b-84b90e4b0940.png)

また、ECSのサービスで複数台コンテナを起動した場合も、下記の通りホスト一覧で見ることが可能です。下図の場合はタスク10台で起動した場合の画面になります。

![SnapCrab_NoName_2017-12-28_11-41-40_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/150903/670f1224-42c9-5de5-3638-4c8eebcb4fe6.png)

# さいごに
New RelicのAPMでは、コンテナイメージにAgentを仕込めば、Fargate環境であってもアプリケーションモニタリングを行うことができました。各種トレース情報の取得や、アプリケーションがどのコンテナで起動しているかもホスト一覧や各ホストのリソースメトリクスなども確認することができます。