これは何か
公式手順のこれでビルドしたDockerコンテナをECS FargateにデプロイしてAPMを動かす検証手順の備忘録。
あくまで導入までの手順のため、APMのチューニングやアプリの分析などは含んでいない。
注意事項
仕組み上、任意の環境でコンテナイメージをビルドしなければならない。
NewRelic APM PHPエージェントは、PHPそのものののバージョンとPHPエージェントのバージョンの組み合わせによって対応可能なCPUアーキテクチャが異なる。
今回の検証ではPHP7.xを使用しローカル環境(M1 Mac: arm64)でビルドを試みたが、環境固有と思われるエラーによって失敗したため、Cloud9をビルド環境として用意しそこでビルドした。
実業務でPHPエージェントを導入する場合、下記の参考リンクを参照し、導入先環境に応じて対応すること。
参考リンク
手順
1. NewRelic認証情報の用意
ビルド時にNewRelicのライセンスキーが必要になる。
NewRelic UI サイドメニュー > 自身のユーザー名 > API Keys から API Keys画面に遷移し、「Create a Key」ボタンからキーを作成する。
「Key type」は「Ingest – License」を指定し、その他は任意で良い。
対象Key行「・・・」から「Copy key」を選択し、値をメモしておく。
2. コンテナレジストリの用意
ECS Fargateにデプロイする都合上、任意のコンテナレジストリにコンテナイメージを格納しなければならない。
今回はECSと統合され扱いやすいECRを使用する。
AWSマネジメントコンソール > ECR > Private registry > Repositories からプライベートリポジトリ画面に遷移し、「リポジトリを作成」ボタンからリポジトリを作成する。
リポジトリ名は任意で入力し、残りはデフォルトのままで良い。
プライベートリポジトリ画面に戻り、作成したリポジトリ名を選択する。
リポジトリ詳細画面で「プッシュコマンドの表示」ボタンを押下しコマンド一覧を表示させる。
後続作業で使用するためブラウザの別タブなどで開いたままにしておく。
3. コンテナイメージのビルド・プッシュ
注意事項に書いた通りビルド環境にはCloud9を使用する。
AWSマネジメントコンソール > Cloud9 から環境画面に遷移し、「環境を作成」ボタンからビルド環境を作成する。
名前は任意でその他は基本的にデフォルトのままで良いが、デフォルトVPC以外を使用したい場合は「ネットワーク設定」でデプロイ先VPCとサブネットを選択する。
パブリックサブネットにデプロイする場合はそのサブネットの「パブリック IPv4 アドレスを自動割り当て」が「はい」になっていることを確認する。(でないとCloud9環境にパブリックIPが付与されず、セットアップのためのSSMとの通信できなくなり、長々と待たされた挙句作成に失敗する)
プライベートサブネットにデプロイする場合はNATかSSMへのインターフェイスVPCエンドポイントがあれば良い。
作成が完了したら環境画面から対象の環境を選択し「開く」あるいは「Cloud9 で開く」で開く。
環境を開いたら、検証で最低限必要な動作確認用の「index.php」とイメージビルド用の「Dockerfile」の2ファイルを以下のように作成する。(DockefileのRUN部分は前述の公式手順リンク参照)
Dockerfileで使用するベースイメージは検証目的で扱いやすいphp*-apacheを採用した。
index.php
<?php echo "<h1>Hello from PHP.</h1>";
Dockerfile
FROM php:7.2-apache COPY index.php /var/www/html/ RUN \ curl -L PHP_AGENT_URL | tar -C /tmp -zx && \ export NR_INSTALL_USE_CP_NOT_LN=1 && \ export NR_INSTALL_SILENT=1 && \ /tmp/newrelic-php5-*/newrelic-install install && \ rm -rf /tmp/newrelic-php5-* /tmp/nrinstall* && \ sed -i \ -e 's/"REPLACE_WITH_REAL_KEY"/"YOUR_LICENSE_KEY"/' \ -e 's/newrelic.appname = "PHP Application"/newrelic.appname = "YOUR_APPLICATION_NAME"/' \ -e 's/;newrelic.daemon.app_connect_timeout =.*/newrelic.daemon.app_connect_timeout=15s/' \ -e 's/;newrelic.daemon.start_timeout =.*/newrelic.daemon.start_timeout=5s/' \ /usr/local/etc/php/conf.d/newrelic.ini
Dockerfile内のPHP_AGENT_URLは公式ダウンロードサイトでURLを確認しそれをセットする。
ファイル名に「-musl」があるものとないものが存在するが、ない方で良い。
記事作成時点では以下になる。
https://download.newrelic.com/php_agent/release/newrelic-php5-10.14.0.3-linux.tar.gz
YOUR_LICENSE_KEYは手順1でメモした値で置換する。
YOUR_APPLICATION_NAMEはNewRelic UI上で判別しやすい任意のアプリケーション名で置換する。
ここまで終わったら、Cloud9環境のターミナルで両ファイルが存在するディレクトリにて手順2で開いたプッシュコマンド1〜4を実行する。
正常に各コマンドが完了するとECRのリポジトリ画面に「latest」タグが付与されたイメージが追加されていることが確認できる。
4. ECS Fargateへのデプロイ
まずはタスク定義を作成する。
AWSマネジメントコンソール > Elastic Container Service からクラスター画面を開き、サイドメニューのタスク定義を選択する。
タスク定義画面から「新しいタスク定義の作成 > 新しいタスク定義の作成」ボタンを押下し、タスク定義を作成する。
タスク定義ファミリー名は任意の値を入力する。
「コンテナ – 1」欄の「コンテナの詳細」は名前は任意の値を入力し、イメージURIはECRリポジトリ詳細画面でイメージタグ「latest」を選択しイメージタグ詳細画面に遷移すると確認できる。この「URI」の値をセットする。
その他はデフォルトのままで良い。(CPU, メモリの割り当てやログ収集の使用はお好みで)
次に「クラスターの作成」ボタンからクラスターを作成する。
クラスター名は任意の値を入力し、その他はデフォルトのままで良い。(インフラストラクチャはFargateがデフォルトになっている)
次はクラスター内にサービスを作成する。
クラスター画面から作成したクラスター名のリンク選択し、クラスター詳細画面へ遷移する。
「サービス」タブ内の「作成」ボタンを押下しサービスを作成する。
コンピューティング設定 ((アドバンスト)) > コンピューティングオプション は検証目的なので「起動タイプ」で良い。
デプロイ設定 > タスク定義 > ファミリー は本手順の最初に作成したタスク定義ファミリー名を選択する。サービス名は任意で良い。
ネットワーキング > VPC, サブネット はデフォルトVPC, サブネットか任意のVPC, サブネットを選択する。今回は検証目的なのでパブリックサブネットのみにした方が都合が良いためそのように設定した。セキュリティグループはHTTP: 80の許可を自身のグローバルIP指定などで入れておけば良い。
その他はデフォルトで良い。
作成完了後、デプロイが完了すると「<サービス名>が正常にデプロイされました。」というモーダルがでる。
その後、クラスター詳細画面のサービスタブ内から作成したサービス名を選択しサービス詳細画面へ遷移する。
サービス詳細画面でタスクタブを選択しタスク列のリンクを選択しタスク詳細画面に遷移する。
「設定」欄にパブリックIPがあるのでそれをコピーする。(デフォルト設定によりパブリックIPが付与されている)
ブラウザで http://コピーしたパブリックIP
で表示し以下のような画面が出ていればOK。
5. NewRelic UI でのAPM確認
ここまで出来ていれば直前に画面を開いた際のデータがNewRelicで測定されているのでNewRelic UI で確認する。
NewRelic UI トップ画面の「Services – APM」欄に手順3で置換したYOUR_APPLICATION_NAMEがあるのでそれを選択する。
Web transaction time などにデータが表示されていればOK。APMの導入は完了している。
クリーンアップ
特別必要なければ今回作成した以下のリソースを削除する。
- ECRリポジトリ
- ECSタスク, サービス, クラスター
- Cloud9環境
終わり