Slide 1

Slide 1 text

ECS x Mackerel JAWS-UG コンテナ支部 2017.07.21 ~ 動的ポートマッピングに対応したタスクのメトリクスを取得する ~

Slide 2

Slide 2 text

吉田 慶章 @kakakakakku - Makuake : CyberAgent Crowd Funding, Inc. - DevOps エンジニア & サーバサイドエンジニア - エンジニアリングマネージャー - 趣味 : ブログ更新 - http://kakakakakku.hatenablog.com/ - 副業 : プログラミング講師

Slide 3

Slide 3 text

7/5 は「Aurora 事例祭り」に登壇 http://kakakakakku.hatenablog.com/entry/2017/07/05/214133

Slide 4

Slide 4 text

最近使い始めた ECS の話 まだ本番投入はしてない ( ゚д゚)

Slide 5

Slide 5 text

モチベーション - 運用面を考えると, メトリクスの取得は重要 - コンテナインスタンスだけじゃなくて, タスクも対象にしたい - やっぱり「動的ポートマッピング」も使いたい - ポートが増減する環境で, どのようにメトリクスを取得する? - 既に導入済の Mackerel を使いたい

Slide 6

Slide 6 text

Mackerel で
 「動的ポートマッピング」に対応した
 タスクのメトリクスを取得する方法を考えてみた ちなみに Datadog なら ECS Integration がある ( ゚д゚)!!!

Slide 7

Slide 7 text

アーキテクチャ

Slide 8

Slide 8 text

Docker Container Instance ALB ECS Alarm Instance Auto Scaling Service Auto Scaling ( Dynamic Port Mapping ) Service ( AZ Balanced Spread ) Docker Container Instance

Slide 9

Slide 9 text

ポイント - コンテナインスタンスに mackerel-agent をインストールする - 「カスタムメトリクス取得スクリプト」を配置する - cloud-init (User Data) 経由

Slide 10

Slide 10 text

カスタムメトリクス取得スクリプト #!/bin/sh if [ "${MACKEREL_AGENT_PLUGIN_META}" != "1" ];then for PORT in $(docker ps —format=‘{{.Ports}}' --filter name=xxxxx | cut -f1 -d- | cut -f2 -d:); do /usr/bin/mackerel-plugin-gostats -port ${PORT} -path=/stats -metric-key-prefix=gostats.${PORT} done else /usr/bin/mackerel-plugin-gostats -metric-key-prefix=gostats.# fi ( 今回は mackerel-plugin-gostats をサンプルにした ) docker ps の結果からポートを取得する カスタムメトリクスの プレフィックスにポートを付与する メタ情報

Slide 11

Slide 11 text

タスク単位で取得できるようになった

Slide 12

Slide 12 text

次は, ダッシュボード化

Slide 13

Slide 13 text

ロールグラフだと
 ポート部分をワイルドカードにして
 グラフ表示をすることができない ( メトリクスはサンプル )

Slide 14

Slide 14 text

アドバンスクエリで頑張った role('service:role', 'custom.gostats.*.runtime.goroutine_num')

Slide 15

Slide 15 text

何となく良さそうな ダッシュボード化はできた

Slide 16

Slide 16 text

実は他にも検討した - mackerel-agent タスクを One Task Per Host で起動する - mackerel-agent タスクから, 同じコンテナインスタンスで
 動く他のタスクのメトリクスが取得できない - タスクと mackerel-agent タスクを link して起動する - 1 タスク 1 ホストで課金されると厳しい

Slide 17

Slide 17 text

まとめ - ECS を運用する場合, コンテナインスタンスだけじゃなくて,
 タスクのメトリクスも取得したい - Mackerel で「動的ポートマッピング」に対応した
 「カスタムメトリクス取得」と「ダッシュボード化」を考えた - もし Mackerel で正式に ECS 対応が入るなら不要になる - 引き続き ECS を使っていくぞ!