おはこんばんちは。ユニファのインフラ担当すずきです。
今年一本目のブログなんですが…
途中で間違えてブログ消してしまって2回目書いてつらいです…
気を取り直して本題いきます!!
弊社ではサーバ等々の監視にprometheusを利用しようとしています。
prometheusでは多くの情報を取得するためにいろいろなexporterを利用するのですが、それら1個ずつ起動したり、起動確認するのは面倒だなと考えていました。
そこでECS+NLBを利用して各exporterの設定毎にDockerコンテナとして起動してしまえば楽じゃないかな?と思ったので今回はそのチャレンジしたことを記事にしています。
ECSクラスターとタスクを設定
とりあえずはじめにECSクラスターを作成します。
ECSコンソールに入ってもらって、簡単なECSクラスターを作成します。
リポジトリは不要なので一つ目の項目だけチェックします。
(これはECSクラスターを1つも持ってない時に使える画面のはずなのですでに利用してる方はいい感じに…)
しばらくするといろいろ作成され、ECSコンソールを見ると「default」クラスターが作成されます。
中を覗くと「sample-webapp」サービスや「console-sample-app-static」タスクなどが登録されていることが確認できると思います。
続いてタスク定義を登録します。
今回タスク定義として登録するexporterはprometheus公式のblackbox_exporterにします。 DockerHubにイメージもあったのでタスク定義にはそれを利用します。
タスク定義はECSコンソールのタスク定義から設定します。
タスク定義は設定する内容は最低限の下記の項目だけにします。
- タスク定義名: blackbox
- コンテナ定義[コンテナの追加]
- コンテナ名: blackbox
- イメージ: prom/blackbox-exporter
- メモリ制限(MB): ハード制限/256
- ポートマッピング: 9115/9115/tcp
入力が完了したらタスクを作成してください。
タスク定義に「blackbox」という項目が追加されます。
ためにし項目名をクリックし「blackbox」の画面に行っていただき、「タスクの実行」をしてみます。
実行したあとは、「default」クラスターのタスクタブを覗いてもらうと起動できてることが確認できるかと思います。(ステータスがRUNNINGになっていると正常起動できています。)
お試しで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-... ってなってる部分)をクリックしてもらい、 タスクの詳細画面を出し、画面下部のコンテナの情報を参照してもらうと表示されています。
IPとかはサンプルでつくっただけなので既に存在していないのでお気になさらず。
確認等できたら画面開いたついでに画面右上の停止を押して、テスト起動していたタスクを終了させます。
NLBの作成
クラスターとタスクは作成したのでNLBを作成します。
EC2コンソールのロードバランサーの項目から作成します。
作成対象としては中央の「Network Load balancer」を選択します。
- LB名: sample (適当…
- リスナーのTCPのポート: 9115
- アベイラビリティゾーン: 10.0.0.0/16? (作成したECSクラスターのvpcを選択してくださいデフォルトだとこの値のはず)
設定できたら次に進んでもらいターゲットグループの設定
- 名前: blackbox (画像はsampleとなってますが、後々作り直してblackboxになってます、でも名前はなんでもいいです)
- ポート: 9115
これらだけ設定し後はデフォルトで良いです。
(NLBで受け付けるサービスなどを増やす場合はこのリスナーポートも合わせて増やしていく必要があります。)
設定したら次へ次へとしてもらいNLBを作成してください。
サービスの登録
つづいてサービスの登録をしていきます。
先程作成したクラスタに「sample-webapp」というサービスがあったかと思いますが、それと同じように「blackbox」タスク定義もサービス化します。
サービス化することで、ECSクラスターに何個タスクを実行しておくか、起動したタスクがLBに紐づくかなどなど起動させるタスクの状態を設定しておけます。
サービスの登録はECSコンソールから行います。 最初に作成した「default」クラスターにサービスを登録するので、「default」クラスターの画面に入りサービスの「作成」から登録していきます。
サービスの登録画面では、どのサービスにどのタスク定義をどれだけ動かすかなど設定します。
今回は「default」クラスターの「blackbox:1」(:1はタスク定義のリビジョン番号なので今回は:1のはず)のタスク定義、そして実行するタスクの数を「1」としています。
入力できたら次に進んでいただきLBの設定をします。 先程NLBをつくったので「Network Load Balancer」を選択します。
NLBの利用を選ぶと項目が追加で現れますが、今回は自動で入力された項目を利用します。
負荷分散用のコンテナ欄の「ELBの追加」をクリックすると更に項目が増えます。
リスナーポートの部分でNLBで作成したターゲットグループ名+リスナーポートである「blackbox:9115」を選んでください。
以上で必要な設定は完了です。
確認
「default」クラスターのサービスを確認すると以下のように登録され、タスクも起動していることが確認できます。
サービスの詳細を見ると設定したNLBのターゲットグループ名が見えます。
クリックするとターゲットグループへ飛びECSクラスターのインスタンスがターゲットグループに登録されていることが確認できます。
ターゲットグループにインスタンスが登録されていない時は、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を適当につくりすぎてリスナーポートの事をすっかり忘れており、
ターゲットグループにインスタンス登録されないーって詰まってましたが一から作り治すとあっさり解決しました。
思った動作しなかったらはじめから作り直しなどしてもらったらと思います。
以上、コメント等あればお気軽にお願いします。
すずき