はじめに
『 ECS(AWSのコンテナマネジメントサービス)で起動したコンテナ上のアプリケーションをNew Relicで監視する 』をゴールとして、実施手順について解説したいと思います。ECSとALBの連携により、コンテナ起動に伴う各AWSサービスへの諸々の設定(サーバプールへの追加、ポートの払い出しetc..)を自動で行えるよう設定していきます。また、コンテナそれぞれにNew Relic Agentを手動でインストールするのは手間なので、起動時に自動でインストール実行できるよう、Dockerに仕込みたいと思います。New Relicアカウントをお持ちでない方はこちらよりどうぞ。
1. コンテナの作成
①. Dockerfileの作成
はじめにDockerfileを作成します。今回用意したDockerfileでは、起動時に下記2点を実行します。
- HTTPサービスの起動及び監視対象PHPファイルの追加
- New Relic APM Agentをインストールまで行う
### CentOS Imageのダウンロード
FROM centos:centos6
### httpdのインストール、監視対象PHPファイルのアップロード##
RUN yum -y install httpd php
ADD phpinfo.php /var/www/html
### New Relic APM Agentのインストールおよびライセンスキーの設定
RUN rpm -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
RUN yum -y install newrelic-php5
RUN newrelic-install install
RUN sed -E -i 's/REPLACE_WITH_REAL_KEY/"Your New Relic APM License Key"/' /etc/php.d/newrelic.ini
### httpdの起動
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
②. コンテナイメージのビルド
次にコンテナイメージをビルドします。
# docker build -t nr-test-rp1 .
# docker images
コンテナを起動し、ビルドしたイメージが正常に動作することを確認します。
# docker run -d -p 8080:80 nr-test-rp1
# docker exec -it nr-test-rp1 bash
2. ALBの設定
AWS側でALBの設定を行います。
ALBと3で解説するECSの連携により、Auto Port Mapping機能が使用できます。
同機能により、ALB及びECSに対する下記設定を動的に行うことができます。
- EC2ホストインスタンスの空きポートを動的にコンテナポートにマッピング
- ECSが起動したコンテナをALBの負荷分散ターゲットとしてグルーピング
- ALBに対してヘルスチェック/リスナー/ターゲットグループを自動設定
ALBの構成要素は下記のとおりです。それぞれ設定していきます。
- リスナー
- ターゲットグループ
- ヘルスチェック
サービス > EC2 > ロードバランサーを選択し、『ロードバランサーの作成』を押下します。
Application Load Balancerのラジオボタンを選択し、『次へ』を押下します。
ステップ1: ロードバランサーの設定にて、下記の項目を設定します。
- 名前
- スキーマ
- IPアドレスタイプ
- リスナー
- アベイラビリティゾーン
ステップ2: セキュリティ設定の構成ではそのままページ下部の『次の手順』を押下します。
ステップ3: セキュリティグループの設定を行います。同ステップでは、ALB用のセキュリティグループを作成するため、HTTPの使用ポートである80番ポートを送信元:any(0.0.0.0/0)として設定します。(送信元については、今回テスト用としてany設定しておりますが、環境に適した任意の送信元を指定ください。)設定後、ページ下部の『次の手順』を押下します。
ステップ4: ルーティングの設定を行います。ターゲットグループ及びヘルスチェックの設定を行います。設定後、ページ下部の『次の手順』を押下します。
ステップ5: ターゲットの登録ではターゲットインスタンスの登録を行わなず、そのままページ下部の『次の手順』を押下します。
ステップ6: 確認で設定内容を確認し、問題なければページ下部の『作成』を押下します。
これでALBの作成は完了です。
3. ECSの設定
ECSの構成要素は下記のとおりです。
- ECRリポジトリ...コンテナイメージをアップロードするリポジトリ
- クラスタ...コンテナのホストEC2インスタンスの指定&クラスタリング設定を行う
- タスク定義...クラスタ上で起動するコンテナ=タスクに対して、リソース分配や使用ポートなどの起動設定を行う定義
- サービス...サービス単位でコンテナを複数台起動することが可能、ALB/AutoScalingの設定が可能
①. リポジトリの設定 & Docker Imageのアップロード
はじめに、ローカルで作成したコンテナイメージをAWS上にアップロードするため、ECSリポジトリを作成します。
サービス > EC2 Container Service > リポジトリ を選択し、『リポジトリの作成』を押下します。
ステップ1: リポジトリの設定にて、リポジトリ名を設定し、ページ下部の『次のステップ』を押下します。
ステップ2: Docker イメージの構築、タグ付け、プッシュにて、ローカルから作成したECRリポジトリへのログイン、コンテナイメージのプッシュに関するコマンドが表示されるので、同表示に従い、コマンドを実行します。
コマンド実行後、レポジトリにイメージが追加されていることを確認します。
②. クラスタの設定
コンテナを搭載するホストEC2インスタンスの指定&クラスタリング設定を行います。
サービス > ECS > クラスターを選択し、『クラスターの作成』を押下します。
クラスターの作成にて、下記の項目を設定し、『作成』を押下します。
-
クラスター名
-
EC2インスタンスタイプ
-
インスタンス数
-
リスナー
-
キーペア(ホストEC2にSSHアクセスしたい場合に設定)
-
VPC(ALBに設定したものと同じVPCを指定)
-
サブネット(同上)
-
セキュリティグループ(新規)
-
セキュリティグループのインバウンドルール(CIDR:0.0.0.0/0 , ポート:80)
-
IAMロール(ecsInstaceRoleポリシーが付与された既存のロール or 新しいロールの作成を選択。新しいロールの作成を選択した場合、ロールが自動作成される)
作成後、下記の通りクラスタが追加されていることを確認します。
動的ポートマッピング使用時には、ALB間の通信において、EC2ホストに割当られるポートレンジを全て許可しておく必要があるため、クラスタ配下のEC2ホストに設定されたセキュリティグループを編集します。
サービス > EC2 > インスタンスにて当該EC2ホストを選択、『説明』タブのセキュリティグループのリンクをクリックします。
当該セキュリティグループの『インバウンド』タブにある『編集』を押下し、ソースを2で設定したALBのセキュリティグループとした全ポート許可のルールを追加します。
②. タスク定義の作成
コンテナの起動設定を定義するため、タスク定義を作成します。
サービス > ECS > タスク定義を選択し、『新しいタスクの定義』を押下します。
タスク定義名を入力し、『コンテナの追加』を押下します。
コンテナの追加画面にて、下記の項目を設定し、『追加』を押下します。
- コンテナ名
- イメージ
- メモリ制限 (割り当てるメモリ量)
- ポートマッピング (Auto Port Mapping利用時はホストのポート番号を0に設定)
コンテナの追加後、『作成』を押下します。
③. サービスの作成
はじめにECSサービス用のIAMロールを作成します。
サービス > IAM > ロールを選択し、『新しいロールの作成』を押下します。
ロールタイプでAmazon EC2 Container Service Roleを選択します。
ポリシーもそのままAmazonEC2ContainerServiceRoleをアタッチします。
ロール名を入力し、『ロールの作成』を押下します。
次にECSにてサービスを作成していきます。
サービス > ECS > クラスターを選択し、『サービス』タブの『作成』を押下します。
サービスの作成画面にて、下記の項目を設定し、『追加』を押下します。
- タスク定義(3-②で作成したタスク定義を指定)
- サービス名
- タスクの数(起動するコンテナ数を指定)
次に画面下部に移動し、『ELBの設定』を押下します。
下記項目を設定します。
- ELBタイプ(Application Load Balancerを選択)
- サービス用のIAMロール(作成したECSサービス用のIAMロールを指定)
- ELB名(2で作成したALBを指定)
負荷分散用のコンテナという項目では、3-②で作成したコンテナを選択し、『ELBの追加』を押下します。
下記項目を設定し、『保存』を押下します。
- リスナーポート(80:HTTPを指定)
- ターゲットグループ(2で作成したターゲットグループを指定)
作成したサービス画面でタスクが3台『Running』ステータスで起動していることを確認します。
4. 挙動確認
①. アクセス確認
***サービス > EC2 > ロードバランサ―***の『説明』タブにてALBのDNSを確認します。
ブラウザにhttp://"ALBのDNS"/phpinfo.phpを入力し、アクセスできることを確認します。
②. New Relicからの監視確認
NewRelicのAPM画面でコンテナ上で起動するアプリケーションが追加されたことを確認します。
当該アプリケーションを選択し、『Overview』画面下部に3台ホストが表示されることを確認します。