継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

ECS Fargate で動作する FastAPI のコードを X-Ray でトレースする

タダです.

前回 Amazon Linux2 の上で FastAPI のコードに X-Ray を仕込みました.今回は ECS Fargate 上で動作する FastAPI のコードから X-Ray にトレースした情報を送る時に設定する内容をさらったので整理してきます.

sadayoshi-tada.hatenablog.com

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"
    }

参考情報

docs.aws.amazon.com

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 というメッセージが出力されました.

f:id:sadayoshi_tada:20210502235804p:plain f:id:sadayoshi_tada:20210502234903p:plain

X-Ray の画面で確認してみたところトレースした情報が表示されました.

f:id:sadayoshi_tada:20210502235031p:plain

まとめ

ECS Fargate 上で動作する FastAPI のコードに X-Ray を仕込んでトレース情報を収集するための設定を ECS Fargate 周りにフォーカスして整理しました.ここまでで単一のコードに対する X-Ray の設定はできましたが,他サービスとの統合や他のコードへの展開も考えていかなければならないため整理ができたら記事にしていきます.