この記事について

あけましておめでとうございます!本年もiret.mediaをよろしくお願いします!
またまたNew Relicについての記事です!

ところでみなさまAPMをご存知でしょうか!?
APMとはApplication Performance Monitoringの略称です。アプリケーションの異常/レイテンシーなどをいち早く把握し顧客体験を向上させるために、アプリケーションのパフォーマンス状況を可視化させる一連のプロセスを指します。(すごいざっくり言っています)

New RelicにはAPMを実現するために様々なツールが用意されています!
その中にPHP Agentがあります。PHPでできたアプリケーションにこのエージェントを組み込むだけで、アプリケーションのパフォーマンス状況を取得し、New Relic上で可視化することができるようになります!

この前、Laravel/PHPのWebアプリケーションをECS Fargate上で実装する機会がありました。
その際、PHP Agentを導入しました。

本記事ではPHP Agentの導入手順について記載します。
あくまで導入手順までなので、導入後のパフォーマンス状況の確認などについては記載しません。
(また違う機会に別の記事で書ければと思います。)

公式手順

2024年1月時点において、New Relicの公式ドキュメントにはECS環境へのPHP Agentの導入手順は記載されていません。

今回はDocker and other container environments: Install PHP agentの手順を参考にして、ECSにPHP Agentを導入していきます!

PHP Agentを導入した際のECSタスクの構成

PHP AgentとNew Relicの間には、daemonがプロキシとして機能しています。
アプリケーションからメトリクスなどのデータを取得したPHP Agentはdaemonを経由して、New Relicに送信します。

このdaemonはアプリケーションコンテナと異なるコンテナとして配置することも、アプリケーションコンテナに同梱することも可能です。
本記事は異なるコンテナとして配置する手順を記載します。

元々ECSタスク内には2つのコンテナがあります。Laravelをインストールしたコンテナ(ベースイメージはPHP-FPMコンテナ)とNGINXコンテナがあります。

PHP Agentとdaemonを導入した最終的なタスクの構成は以下のようになります。

LaravelコンテナにPHP Agentをインストールします。そしてタスク内にサイドカーコンテナとしてdaemonコンテナを追加します。
LaravelコンテナのPHP Agentとdaemonコンテナがタスク内でTCP通信して、daemonコンテナがNew RelicとHTTPS通信します。

実装手順

やらなくてはいけないことは

  • LaravelコンテナへPHP Agentのインストール
  • daemonコンテナをECSタスクに追加

この2つです。

この2つを行えば、New Relicのコンソール上からWebアプリケーションのパフォーマンスを確認することができるようになります!
ではやっていきましょう!

LaravelコンテナへPHP Agentのインストール

LaravelコンテナのDockerfileの末尾に以下を追記します。

# New Relic PHP Agent
ARG NEW_RELIC_AGENT_VERSION
ARG NEW_RELIC_LICENSE_KEY
ARG NEW_RELIC_APPNAME

RUN if [ -n "$NEW_RELIC_AGENT_VERSION" ] && [ -n "$NEW_RELIC_LICENSE_KEY" ] && [ -n "$NEW_RELIC_APPNAME" ]; then \
    curl -k -L https://download.newrelic.com/php_agent/archive/${NEW_RELIC_AGENT_VERSION}/newrelic-php5-${NEW_RELIC_AGENT_VERSION}-linux.tar.gz | tar -C /var -zx \
    && export NR_INSTALL_USE_CP_NOT_LN=1 \
    && export NR_INSTALL_SILENT=1 \
    && /var/newrelic-php5-${NEW_RELIC_AGENT_VERSION}-linux/newrelic-install install \
    && rm -rf /var/newrelic-php5-* /var/nrinstall* ;\
    else \
    echo "no download newrelic php agent" ;\
    fi

RUN if [ -n "$NEW_RELIC_AGENT_VERSION" ] && [ -n "$NEW_RELIC_LICENSE_KEY" ] && [ -n "$NEW_RELIC_APPNAME" ]; then \
    find /usr/local/etc -type f -name newrelic.ini | xargs sed -i \
    -e "s/REPLACE_WITH_REAL_KEY/${NEW_RELIC_LICENSE_KEY}/" \
    -e "s/newrelic.appname[[:space:]]=[[:space:]].*/newrelic.appname = \"${NEW_RELIC_APPNAME}\"/" \
    -e 's/;newrelic.daemon.loglevel = "info"/newrelic.daemon.loglevel = "debug"/'  \
    -e 's/;newrelic.loglevel = "info"/newrelic.loglevel = "verbosedebug"/'  \    
    -e '$anewrelic.daemon.address="localhost:31339"';\
    else \
    echo "no install newrelic php agent" ;\
    fi

このDockerfileからコンテナイメージをビルドしましょう。
なお、build-argsとして以下を渡す必要があります。

引数 備考
NEW_RELIC_AGENT_VERSION 10.12.0.1 PHP Agentのバージョンです。インストールする時点で最新のものでいいとは思います。参考
NEW_RELIC_LICENSE_KEY New Relic API Keyの値 「INGEST – LICENSE」のAPI Keyです。自分の環境のものを指定してください。
NEW_RELIC_APPNAME 任意の文字列 ここで指定した文字列がNew Relicのコンソール上に表示されます。アプリケーションで一意であればなんでも良いかと。

ビルドしたコンテナイメージはECRにPushして、タスク定義で指定するイメージもPHP Agentを組み込んだものに変更しておきます。

daemonコンテナをECSタスクに追加

次はdaemonコンテナをECSタスクに追加します。

daemonコンテナはこちらのイメージを利用します。

タスク定義のcontainerDefinitionsに以下を追加します。

{
    "name": "newrelic-php-daemon",
    "image": "newrelic/php-daemon:10.13.0",
    "cpu": 0,
    "essential": true,
    "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
            "awslogs-create-group": "true",
            "awslogs-group": "/newrelic-php-daemon",
            "awslogs-region": "ap-northeast-1"
        }
    }
}

またLaravelコンテナが起動する前に、daemonコンテナが起動している必要があります。
そのため、Laravelコンテナの前にdaemonコンテナが起動するように、タスク定義のLaravelコンテナのところに以下を追記します。

"dependsOn": [
    {
        "containerName": "newrelic-php-daemon",
        "condition": "START"
    }
]

これらが反映された新しいタスク定義を利用してタスクを起動します。

New Relicのコンソールにログインして、「APM & Services」に移動します。

NEW_RELIC_APPNAMEで指定した文字列のアプリケーションが表示されているはずです。

ここからアプリーションのパフォーマンス状況などを閲覧することができます。
以上で、PHP Agentの導入手順は終了です。

最後に

ECS環境へのPHP Agentの導入手順について共有させていただきました!
ご理解いただけましたでしょうか?

仮想マシンにインストールする場合は、インストールスクリプトを実行するだけなので、それに比べたら少し複雑な手順かもしれません。
しかし、構成を理解して、やることが整理できていればそこまで難しくはないのかなと思います。

ご参考にして頂けたら幸いです!
では!