ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

ECS+NLBでexporterを動かしてみる

おはこんばんちは。ユニファのインフラ担当すずきです。

今年一本目のブログなんですが…
途中で間違えてブログ消してしまって2回目書いてつらいです…

気を取り直して本題いきます!!

弊社ではサーバ等々の監視にprometheusを利用しようとしています。
prometheusでは多くの情報を取得するためにいろいろなexporterを利用するのですが、それら1個ずつ起動したり、起動確認するのは面倒だなと考えていました。
そこでECS+NLBを利用して各exporterの設定毎にDockerコンテナとして起動してしまえば楽じゃないかな?と思ったので今回はそのチャレンジしたことを記事にしています。

ECSクラスターとタスクを設定

とりあえずはじめにECSクラスターを作成します。

ECSコンソールに入ってもらって、簡単なECSクラスターを作成します。
リポジトリは不要なので一つ目の項目だけチェックします。

f:id:mominosin:20180122084126p:plain

(これはECSクラスターを1つも持ってない時に使える画面のはずなのですでに利用してる方はいい感じに…)

しばらくするといろいろ作成され、ECSコンソールを見ると「default」クラスターが作成されます。

f:id:mominosin:20180125102909p:plain

中を覗くと「sample-webapp」サービスや「console-sample-app-static」タスクなどが登録されていることが確認できると思います。

続いてタスク定義を登録します。

今回タスク定義として登録するexporterはprometheus公式のblackbox_exporterにします。 DockerHubにイメージもあったのでタスク定義にはそれを利用します。

タスク定義はECSコンソールのタスク定義から設定します。

f:id:mominosin:20180122085402p:plain

タスク定義は設定する内容は最低限の下記の項目だけにします。

  • タスク定義名: blackbox
  • コンテナ定義[コンテナの追加]
    • コンテナ名: blackbox
    • イメージ: prom/blackbox-exporter
    • メモリ制限(MB): ハード制限/256
    • ポートマッピング: 9115/9115/tcp

入力が完了したらタスクを作成してください。

タスク定義に「blackbox」という項目が追加されます。
ためにし項目名をクリックし「blackbox」の画面に行っていただき、「タスクの実行」をしてみます。

f:id:mominosin:20180122090232p:plain

実行したあとは、「default」クラスターのタスクタブを覗いてもらうと起動できてることが確認できるかと思います。(ステータスがRUNNINGになっていると正常起動できています。)

f:id:mominosin:20180125090118p:plain

お試しでcurlで情報を取ってみると以下のような結果が返ってきます。

'->$ curl "54.238.196.81:9115/probe?target=google.com&module=http_2xx"                                                                                                                              08:59:24
# HELP content_length Length of http content response
# TYPE content_length gauge
content_length 0
~~~~~~~~~~~~
だらだらとでます。

接続先情報を確認するには、先程確認した稼働しているタスクリストの「タスク」の項目(44513329-... ってなってる部分)をクリックしてもらい、 タスクの詳細画面を出し、画面下部のコンテナの情報を参照してもらうと表示されています。

f:id:mominosin:20180125090521p:plain

IPとかはサンプルでつくっただけなので既に存在していないのでお気になさらず。

確認等できたら画面開いたついでに画面右上の停止を押して、テスト起動していたタスクを終了させます。

NLBの作成

クラスターとタスクは作成したのでNLBを作成します。

EC2コンソールのロードバランサーの項目から作成します。
作成対象としては中央の「Network Load balancer」を選択します。

f:id:mominosin:20180122091344p:plain

  • LB名: sample (適当…
  • リスナーのTCPのポート: 9115
  • アベイラビリティゾーン: 10.0.0.0/16? (作成したECSクラスターのvpcを選択してくださいデフォルトだとこの値のはず)

f:id:mominosin:20180125100551p:plain

設定できたら次に進んでもらいターゲットグループの設定

  • 名前: blackbox (画像はsampleとなってますが、後々作り直してblackboxになってます、でも名前はなんでもいいです)
  • ポート: 9115 これらだけ設定し後はデフォルトで良いです。
    (NLBで受け付けるサービスなどを増やす場合はこのリスナーポートも合わせて増やしていく必要があります。)

f:id:mominosin:20180125101233p:plain

設定したら次へ次へとしてもらいNLBを作成してください。

サービスの登録

つづいてサービスの登録をしていきます。

先程作成したクラスタに「sample-webapp」というサービスがあったかと思いますが、それと同じように「blackbox」タスク定義もサービス化します。
サービス化することで、ECSクラスターに何個タスクを実行しておくか、起動したタスクがLBに紐づくかなどなど起動させるタスクの状態を設定しておけます。

サービスの登録はECSコンソールから行います。 最初に作成した「default」クラスターにサービスを登録するので、「default」クラスターの画面に入りサービスの「作成」から登録していきます。

f:id:mominosin:20180125091807p:plain

サービスの登録画面では、どのサービスにどのタスク定義をどれだけ動かすかなど設定します。
今回は「default」クラスターの「blackbox:1」(:1はタスク定義のリビジョン番号なので今回は:1のはず)のタスク定義、そして実行するタスクの数を「1」としています。

f:id:mominosin:20180125091941p:plain

入力できたら次に進んでいただきLBの設定をします。 先程NLBをつくったので「Network Load Balancer」を選択します。

f:id:mominosin:20180125092253p:plain

NLBの利用を選ぶと項目が追加で現れますが、今回は自動で入力された項目を利用します。

f:id:mominosin:20180125092409p:plain

負荷分散用のコンテナ欄の「ELBの追加」をクリックすると更に項目が増えます。
リスナーポートの部分でNLBで作成したターゲットグループ名+リスナーポートである「blackbox:9115」を選んでください。 f:id:mominosin:20180125101745p:plain

以上で必要な設定は完了です。

確認

「default」クラスターのサービスを確認すると以下のように登録され、タスクも起動していることが確認できます。

f:id:mominosin:20180125092857p:plain

サービスの詳細を見ると設定したNLBのターゲットグループ名が見えます。

f:id:mominosin:20180125102056p:plain

クリックするとターゲットグループへ飛びECSクラスターのインスタンスがターゲットグループに登録されていることが確認できます。 f:id:mominosin:20180125102250p:plain

ターゲットグループにインスタンスが登録されていない時は、LBのリスナーポートの設定などポート周りの設定が食い違ってる可能性が高いので一度確認して見てください。

今度はNLBに向かってリクエストを投げてみて、期待通りの結果が返ってくることを確認します。

'->$ curl "sample-6cb4d355b40b1d80.elb.ap-northeast-1.amazonaws.com:9115/probe?target=google.com&module=http_2xx"
# HELP content_length Length of http content response
# TYPE content_length gauge
content_length 0
~~~~~~~~~~~~
だらだらとでます

以上で、ECS+NLBの設定の完了です。
最初NLBを適当につくりすぎてリスナーポートの事をすっかり忘れており、 ターゲットグループにインスタンス登録されないーって詰まってましたが一から作り治すとあっさり解決しました。
思った動作しなかったらはじめから作り直しなどしてもらったらと思います。

以上、コメント等あればお気軽にお願いします。

すずき