タダです.
前回 Amazon Linux2 の上で FastAPI のコードに X-Ray を仕込みました.今回は ECS Fargate 上で動作する FastAPI のコードから X-Ray にトレースした情報を送る時に設定する内容をさらったので整理してきます.
ECS Fargate から X-Ray にトレース情報を送る設定
FastAPI のコードで X-Ray のセグメントを指定する部分は前回と変わらないため,割愛して ECS Fargate から X-Ray にトレース情報を送る部分にフォーカスしていきます.なお,ECS Fargate はプライベートサブネットに展開され,X-Ray にデータを送るために NAT Gateway を経由するような構成で確認しています.
1, X-Ray のコンテナをサイドカーとしてタスク定義する
EC2 同様に ECS Fargate でも X-Ray にデータを送る,X-Ray デーモンが必要です.そのためのサイドカーをタスク定義にいれます.まず,ECR に登録するコンテナの Dockerfile はドキュメントに沿って作りました.このコンテナを ECR に登録します.
FROM amazonlinux RUN yum install -y unzip RUN curl -o daemon.zip https://s3.dualstack.us-east-2.amazonaws.com/aws-xray-assets.us-east-2/xray-daemon/aws-xray-daemon-linux-2.x.zip RUN unzip daemon.zip && cp xray /usr/bin/xray ENTRYPOINT ["/usr/bin/xray", "-b", "0.0.0.0:2000"] EXPOSE 2000/udp
次にタスク定義ですが,次のようにしました.ドキュメントにはログ出力の定義がありませんでしたが,動作状況を確認できるようCloudWatch Logs に出力する定義を追加しています.この設定でタスク定義に登録します.
{ "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/XXXXXXXXXXXX", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" } }, "portMappings": [ { "protocol": "udp", "containerPort": 2000 } ], "cpu": 32, "memoryReservation": 256, "image": "XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/XXXXXXXXXXXX:latest", "name": "xray-daemon" }
参考情報
2, ECS のタスク実行ロールに権限を付与する
タスク定義が終わったら次はタスク実行ロールの設定が必要です.今回は AWS 管理ポリシーであるAWSXRayDaemonWriteAccess
を使いました.ポリシーの中身は次のようになってます.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "xray:PutTraceSegments", "xray:PutTelemetryRecords", "xray:GetSamplingRules", "xray:GetSamplingTargets", "xray:GetSamplingStatisticSummaries" ], "Resource": [ "*" ] } ] }
3, X-Ray でのトレース結果の確認
1,2の設定を終えた後タスクを起動して動作確認してみました.タスクを起動させてところ画像のようにサイドカーで起動してきます.ログをみてみると,コンテナの起動ログとは別に [Info] Successfully sent batch of 1 segments
というメッセージが出力されました.
X-Ray の画面で確認してみたところトレースした情報が表示されました.
まとめ
ECS Fargate 上で動作する FastAPI のコードに X-Ray を仕込んでトレース情報を収集するための設定を ECS Fargate 周りにフォーカスして整理しました.ここまでで単一のコードに対する X-Ray の設定はできましたが,他サービスとの統合や他のコードへの展開も考えていかなければならないため整理ができたら記事にしていきます.