FargateとX-Rayとの連携でハマった話

TL;DR

  • FargateとX-Rayとの連携でハマってしまった。
  • ロールの設定を見直して解消した。

何が起きたのか?

現在、Fargateを使ってマイクロサービス化を進めていますが、マイクロサービス間のログを取りたくて、今回試験的にX-Rayの導入を進めてみました。

構成としてはサイドカーパターンを使ってアプリケーションのタスク定義の中にX-Rayのコンテナを同梱するようにしました。

しかし、実際にデプロイしてみるとX-Rayにデータが反映されません。調査の結果、アプリケーションへのX-Ray SDKの組み込みには問題はありませんでした。

一方、X-Rayのコンテナのログを確認したところ、以下のエラーが出ていました。

[Error] Sending segment batch failed with: NoCredentialProviders: no valid providers in chain. Deprecated.

この情報をヒントに解決してみます。

どうやって解決したのか?

先のログから、今回の事象はX-RayのコンテナからX-Rayにデータ送信するための認証情報が無いために発生していることがわかります。

色々調べた結果、ECSのタスクロール(タスク実行ロールとは別物)にX-Rayへの書き込み権限があるポリシーを設定する必要がありました。(公式サイト

早い段階からロールが怪しいのでは無いかと目星は付いていましたが、タスク実行ロールしか頭の中に無く、タスクロールの設定が必要ということに気付くのにちょっと時間がかかってしまいました。

最終的にタスクロールにX-Rayへの書き込み権限があるポリシー(AWSXRayDaemonWriteAccess)を割り当てて、無事X-Rayにデータ送信することができました!

タスク実行ロール?タスクロール?

名前が紛らわしいので整理します。

タスク実行ロールECSコンテナエージェントで使用されるIAMロール
タスクロールコンテナで使用されるIAMロール

どのレイヤで使用されるかの違いのようです。

例えば、今回のようなX-Rayへのデータ送信はコンテナの話なのでタスクロールが関係していました。一方、パラメータストアから環境変数用のパラメータを取得するのはコンテナエージェントの話なのでタスク実行ロールが関係してきます。

知らないとハマるポイントですので、少しでも参考になれば!