きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

プロキシ環境下 × ECS × X-RAY Daemon設定ではまったこと

Topic

プロキシ環境下でX-RAYを利用したときにはまったポイント

環境

  • インターネットと通信する場合は、社内Proxyを経由する必要がある
  • ECS (FARGATE)を利用
  • アプリコンテナと、X-RAY Daemonを一つのサービスに登録(サイドカー的な)
  • VPCは、プライベートVPCのみ利用ができ、NAT GW, IGWはない

はまりポイント1:X-RAY に接続できない

事象詳細

X-RAYに接続ができない

原因:ネットワーク構成

X-RAYへのアクセスにPublicなネットワークを経由しないといけないことを認識していなかった。

対応1: VPCエンドポイントを設定し、プライベート接続する

VPC エンドポイントで AWS X-Ray を使用する
これを設定することで、パブリックインターネットを経由せずにX-RAYと通信をすることができる。

対応2:環境変数にProxyの設定をする

安直だが、タスク定義-コンテナの設定で、環境変数に、プロキシサーバーの設定を入れることで、対応ができる。
これをすることで、ECS→社内Proxy→パブリックインターネット→X-RAYという流れで通信ができる。しかし、これは許容されるのか…?

対応3:Daemonの引数にProxyの設定をする

X-ray daemonのコマンドラインオプションに、-p,--proxy-addressがある。これをタスク定義で定義してやれば、Proxyを経由した方法で通信を実行できる。こちらの方法も、パブリックインターネットを経由することになる。

はまりポイント2:NoCredentialProviders: no valid providers in chain.エラー

事象詳細

Sending segment batch failed with: NoCredentialProviders: no valid provider #5でも紹介されているのと同じエラー。

原因と対応1:適切なロールがタスクロールに適用されていない

原因

コンテナ実行時に、適切なIAMロールを取得できていない。もしくは、取得できていても、IAMロールに、適切な権限が足りていない。

対応

X-RAYDaemon間で通信をする場合、X-RAYに対する権限をDaemonに与える必要がある。権限を付与するために、ここに書かれている内容に従いロールを設定する。AWSXRayDaemonWriteAccess がタスクロールに割り当てられたIAMロールに適用されていたら良いみたい。

原因と対応2:ECSメタデータにアクセスできない

原因

ECSで利用するIAMロールを適切に取得できていないため、↑と同じように、権限がないエラーが発生していた。 ※ECSでは、タスクメタデータエンドポイントから、コンテナに関する情報を取得して、IAMロールの設定などを行う。EC2でいうところのインスタンスメタデータのようなもの。

対応

タスクメタデータは、169.254.170.2/v2/metadataのようなAPIエンドポイントを持っている。参考)タスクメタデータエンドポイントバージョン 2。外部通信を必要としているコンテナの場合、環境変数にProxy設定を入れることになる。プロキシを設定してしまうと、169.254.170.2への通信も、プロキシに行ってしまい適切なレスポンスを受け取ることができない。そのため、IAMロールが期待通りに設定されず、エラーを発生させてしまう。   これの対応として、環境変数に、NO_PROXY=169.254.170.2を設定する。これでメタデータにもアクセスでき、外部通信も実行できる。

その他戸惑ったこと、TIPSなど

タスクロールと、タスク実行ロール

タスクロールは、ECSで、コンテナが実行されたとき、コンテナ自身が利用するロール。
タスク実行ロールは、コンテナを実行するために利用されるロール。

awsvpc で起動された複数のコンテナたちの通信

同じタスク定義で、起動されるコンテナたちは、localhost:portで通信ができる。そのため、プロキシを設定する場合は、localhostや、127.0.0.1についてもNo_proxy設定に含める必要がある。

X-RAY Daemonのバージョン

バージョンが古いと、はまりポイント2のエラーが発生することがあるらしい。最新は3.3.3なので、それを使えば問題ないはず。

daemonのログレベル

-l,--log-levelコマンドライン引数で変更可能。devレベルを指定して環境を作り始めるのがいいと思った。