ようへいの日々精進XP

よかろうもん

ECS と Datadog の Terraform 炒めに AWS Integration と CloudWatch で ECS メトリクスのとろろあんかけ

自分メモ。

tl;dr

Datadog から届くサービスの紹介メールに記載されていた...

f:id:inokara:20150901083226p:plain

Datadog AgentとAWS APIの両方から情報を収集します。

上記のくだりについて、これは CloudWatch で取得出来る ECS の情報も何らかの方法で取得出来るのかな...ということで、Datadog の公式ドキュメントに ECS Integration について記載されていたので、ドキュメントに沿って Terraform のテンプレートを作って試してみることにした。

ECS のコンテナを Datadog でモニタリングする方法として以下の三つの方法が取れる。

  • ECS インスタンスにログインして Datadog Agent をインストールして Docker Integration を有効にする
  • Datadog Agent 入りコンテナを手動で docker run する
  • ECS の task として登録しておいて、インスタンス起動時に start-task させる

今回のドキュメントに紹介されている方法は三点目の方法。task 登録を行った上で rc.local に仕込まれた aws ecs start-task でコンテナを起動させているが、更に AWS Integration を設定することで ECS の CloudWatch メトリクスも取得出来るようになったようだ。


僕が作った Terraform テンプレート

以下、僕が作った Terraform テンプレート。

terraform apply するとモニタリングが開始する。

f:id:inokara:20150901082254p:plain

詳細は README にて。


そして AWS Integration で ECS メトリクスを取得する

AWS Integration の設定

ということで CloudWatch の API を叩いてメトリクスを取得する為には AWS Integration を設定する。

f:id:inokara:20150901090125p:plain

からの...

f:id:inokara:20150901090140p:plain

で。

AWS Integration で ECS 監視を有効にすることで ECS のメトリクスや ECS クラスタ名が取得出来るようになり、クラスタ毎の CPU 使用率等が取得出来るようになる。

f:id:inokara:20150901104603p:plain

以下は Datadog Agent で取得出来る項目。

  • docker.containers.running
  • docker.containers.stopped
  • docker.cpu.system
  • docker.cpu.user
  • docker.mem.cache
  • docker.mem.rss
  • docker.mem.swap

そして、AWS Integration だと...

  • aws.ecs.cpuutilization
  • aws.ecs.memory_utilization

がメトリクスとして追加される。

尚...

こちらのドキュメントに従って ECS クラスタを構成した場合に IAM ロールの権限が不足している為に AWS Integration にて ECS のメトリクスが取得出来ないので注意されたし。

ドキュメント通りに IAM ロールの権限を設定することで AWS Integration にて ECS のメトリクスが取得することが可能。

$ git diff oreno_tf_ecs_iam.tf
diff --git a/oreno_tf_ecs_iam.tf b/oreno_tf_ecs_iam.tf
index 7c92854..3734e62 100644
--- a/oreno_tf_ecs_iam.tf
+++ b/oreno_tf_ecs_iam.tf
@@ -45,7 +45,8 @@ resource "aws_iam_role_policy" "ecs_iam_role" {
          "ecs:DiscoverPollEndpoint",
          "ecs:Submit*",
          "ecs:Poll",
-         "ecs:StartTask"
+         "ecs:StartTask",
+         "ecs:StartTelemetrySession"
       ],
       "Effect": "Allow",
       "Resource": "*"

ECS のドキュメントには...

Your Amazon ECS container instances also require ecs:StartTelemetrySession permission on the IAM role that you launch your container instances with. If you created your Amazon ECS container instance role before CloudWatch metrics were available for Amazon ECS, then you might need to add this permission. For information on checking your Amazon ECS container instance role and attaching the managed IAM policy for container instances, see To check for the ecsInstanceRole in the IAM console.

とあり、ecs:StartTelemetrySession をロールに付ける必要がある。

仮に ecs:StartTelemetrySession の定義が無い場合でも ECS Agent コンテナは起動するが以下のようなログが出力されて ECS のメトリクスは収集されない。

2015-08-30T13:40:54Z [ERROR] Error connecting to TCS: {"AccessDeniedException":"Forbidden"}, websocket: bad handshake module="tcs handler"
2015-08-30T13:40:54Z [INFO] Error from tcs; backing off module="tcs handler" err="{"AccessDeniedException":"Forbidden"}, websocket: bad handshake"

以下の記事が参考になる。

https://forums.aws.amazon.com/thread.jspa?messageID=673017


以上、ごちそうさまでした。