Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

初手謝罪 初手謝罪 原因はAWSではありませんでした. . . 。 原因はAWSではありませんでした. . . 。 NW-JAWSなのにすみません。 NW-JAWSなのにすみません。

Slide 3

Slide 3 text

 名 前 Yu Otsubo  所 属 KDDIアジャイル開発センター(KAG)  職種 ゆるふわエンジニア  SNS @meitante1conan  その他 妻と二人暮らしでしたが 最近犬をお迎えしました! なので最近はエンジニアリングのつぶやき少なめ 自 己 紹 介 00 00

Slide 4

Slide 4 text

ど ん な 問 題 が 発 生 し た の ? 1 . C l o u d F r o n t が 返 す 謎 の エ ラ ー 2 . C l o u d W a t c h A p p l i c a t i o n S i g n a l s で ボ ト ル ネ ッ ク を 調 べ る 3 . ご ん . . . お ま え だ っ た の か 🦊 4 . 最 後 に 5 . 本 日 の ア ジ ェ ン ダ

Slide 5

Slide 5 text

ど ん な 問 題 が 発 生 ど ん な 問 題 が 発 生 し た の ? し た の ? ファイルのアップロードに失敗するよ. . . . ? 01 01

Slide 6

Slide 6 text

ど ん な ア プ リ を 開 発 し て い る の ? PDFとかパワポのファイルをアップロードして 、 非常に重たい処理並列で実行、結果を画面に表示させる 業務アプリケーションです。 ど ん な 問 題 が 発 生 し た の ? 01 01 この場で詳細話せないのが悔しい. . . 。

Slide 7

Slide 7 text

フ ァ イ ル ア ッ プ ロ ー ド が 待 っ て も 完 了 し な い よ ! 開発チームで確認したところ確かにAWS環境で再現。 ただし、ローカルでは発生しない 。 「ペロッこれはインフラ起因!」 ど ん な 問 題 が 発 生 し た の ? 01 01

Slide 8

Slide 8 text

01 01 簡 単 な 構 成 を お さ ら い し ま し ょ う ど ん な 問 題 が 発 生 し た の ? ちょっと複雑な構成ですが、追って行きましょう! みなさんもどこが原因か想像しながらお聞きください!

Slide 9

Slide 9 text

01 01 ど ん な 問 題 が 発 生 し た の ? CloudFront Cl oudFrontでフロントエンドアプリケーションを配信 ビヘイビアでバックエンドAPI にルーティングしている

Slide 10

Slide 10 text

01 01 ど ん な 問 題 が 発 生 し た の ? フロントはReact フロントエンドはReactで作成。 SPAで動きます。

Slide 11

Slide 11 text

01 01 ど ん な 問 題 が 発 生 し た の ? S3でホスティング Cl oudFront + S3のよくある構成

Slide 12

Slide 12 text

01 01 ど ん な 問 題 が 発 生 し た の ? ALB FastAPI へのアクセスのフロント面です。 カスタムヘッダー+ マネージドプレフィックスリストでセキュアに

Slide 13

Slide 13 text

01 01 ど ん な 問 題 が 発 生 し た の ? バックエンドは FastAPI FastAPI はルーティングを主に実施。 Uvi corn のお陰で軽量爆速! 重たい処理は後段のWorkerが実施します。

Slide 14

Slide 14 text

01 01 ど ん な 問 題 が 発 生 し た の ? ECS Fargate 特に取り立てて話すことなし

Slide 15

Slide 15 text

01 01 ど ん な 問 題 が 発 生 し た の ? RedisでWorkerへ Job登録 Cel eryのBroker/Resul t Backendとして利用しています。 Resul t Backendを兼ねることができるので地味に便利。

Slide 16

Slide 16 text

01 01 ど ん な 問 題 が 発 生 し た の ? CeleryでWorker構築 重たい処理はこちらで Cel eryのコーディング体験半端なくいいですよ!!! 普通のPython書いたら即Worker化できます。おすすめ。 一つあたりのWorker処理はとても小さいのでThread Pool を Gevent で設定

Slide 17

Slide 17 text

CloudFrontが返す謎の CloudFrontが返す謎の エラー エラー どうやらCl oudFrontのバックエンドがタイムアウトし ているらしい. . . 。つまり. . . ? 02 02

Slide 18

Slide 18 text

フ ァ イ ル が 重 た い か ら . . . ? コ ン テ ナ が 小 さ い か ら . . . ? Devtool sでAPI のレスポンスを見てみよう. . . 「ん!?」 C l o u d F r o n t が 返 す 謎 の エ ラ ー 02 02

Slide 19

Slide 19 text

Cl oudFr ont が返す 謎のエラー Cl oudFrontがエラーを吐いている! 02 02 Error from cloudfrontが出ている!!!!

Slide 20

Slide 20 text

Cl oudFr ont が返す 謎のエラー Cl oudFrontがエラーを吐いている! 02 02 でも特にアプリのログにエラーは出てない。。。 なにかタイムアウトに引っかかっている? インフラ臭いですね。

Slide 21

Slide 21 text

02 02 C l o u d F r o n t が 返 す 謎 の エ ラ ー CloudFront Cl o u d F r o n t にはバックエンドの タイムアウトがある。 最大60秒 これですね. . . . 。

Slide 22

Slide 22 text

Cl oudFr ont が返す 謎のエラー ALBの設定を見直してみる 02 02 ALB 一方、AL Bにもタイムアウトはあるが、 最大4 0 0 0 秒 に伸ばしても変わらず。 AL Bのヘルスチェックも問題ない. . .

Slide 23

Slide 23 text

何かがとても遅くて 何かがとても遅くて C l o u d F r o n t で 6 0 秒 タ イ ム ア ウ ト C l o u d F r o n t で 6 0 秒 タ イ ム ア ウ ト ボトルネック調査!! ボトルネック調査!! Cl oudFr ont が返す 謎のエラー 02 02 私はストレートネック 私はストレートネック

Slide 24

Slide 24 text

CloudWatch CloudWatch Application Signalsで Application Signalsで ボトルネックを調べる ボトルネックを調べる おや. . . ?他のAPI も遅いぞ. . . ? つまり. . . ? 03 03

Slide 25

Slide 25 text

Cl oudWat c h Appl i c at i on Si gnal s でボトルネックを調べる 03 03 アプリケーション全体のトレース するときに便利 OpenTel emetry(OTEL) を活用してAWSのアプリケーションモニタリングを自動化する 新しいサービス Pythonは自動計装に対応!

Slide 26

Slide 26 text

ア ッ プ ロ ー ド だ け が タ イ ム ア ウ ト す る と 思 っ た ら 全 A P I が 遅 い . . . ! ! ! C l o u d W a t c h A p p l i c a t i o n S i g n a l s で ボ ト ル ネ ッ ク を 調 べ る 03 03 単純なstatusしか返さない heal thcheckのAPI ですら数秒 かかっている。 明らかに遅い。

Slide 27

Slide 27 text

逆 に r e d i s / w o r k e r の ス ピ ー ド は 早 い 。 ということは被疑箇所はFastAPI だ! こうして調査の旅はアプリケーション内部へ進んだ. . . C l o u d W a t c h A p p l i c a t i o n S i g n a l s で ボ ト ル ネ ッ ク を 調 べ る 03 03

Slide 28

Slide 28 text

ごん...おまえだったのか 🦊 ごん...おまえだったのか 🦊 私のごんは栗を持ってこず、バグを持ってきました。 04 04

Slide 29

Slide 29 text

改めて謝罪 改めて謝罪 原因はAWSではありませんでした. . . 。 原因はAWSではありませんでした. . . 。 NW-JAWSなのにすみません。 NW-JAWSなのにすみません。

Slide 30

Slide 30 text

ごん. . . おまえだったのか 🦊 Gevent、お前だったのか Gevent、お前だったのか 04 04 ジーイベント ジーイベント

Slide 31

Slide 31 text

G e v e n t と は な に か ? Geventは、Pythonで非同期プログラミングを実現するためのネットワークライブラリで、 Greenl etという軽量な協調的マルチスレッド(コルーチン)を使用します。 ごん. . . おまえだったのか 🦊 04 04 I /O待ちの多い処理では効率的に処理をこなせます。(CPU負荷の低いやつ) GeventはCel eryのスレッドプールで選択可能です。 ジーイベント

Slide 32

Slide 32 text

G e v e n t と は な に か ? geventは、Pythonで非同期プログラミングを実現するためのネットワークライブラリで、 greenl etという軽量な協調的マルチスレッド(コルーチン)を使用します。 ごん. . . おまえだったのか 🦊 04 04 要は小さい処理なら Celery Workerを高密度にできますよ というもの

Slide 33

Slide 33 text

G e v e n t と は な に か ? geventは、Pythonで非同期プログラミングを実現するためのネットワークライブラリで、 greenl etという軽量な協調的マルチスレッド(コルーチン)を使用します。 ごん. . . おまえだったのか 🦊 04 04 要は小さい処理なら Celery Workerを高密度にできますよ というもの コスト削減のため コスト削減のため 導入してました 導入してました

Slide 34

Slide 34 text

ご ん . . . お ま え だ っ た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent

Slide 35

Slide 35 text

ご ん . . . お ま え だ っ た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもpi pでGeventインストール

Slide 36

Slide 36 text

ご ん . . . お ま え だ っ た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもpi pでGeventインストール Geventのmonkey. patch_al l がライブラリ起因で適用 非同期・Threadi ngの標準ライブラリがgreenl et処理に置き換え

Slide 37

Slide 37 text

ご ん . . . お ま え だ っ た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもpi pでGeventインストール Geventのmonkey. patch_al l がライブラリ起因で適用 非同期・Threadi ngの標準ライブラリがgreenl et処理に置き換え Uvi cornと競合!! イベントループに変な形で割り込み! 💦 🧨

Slide 38

Slide 38 text

ご ん . . . お ま え だ っ た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもpi pでGeventインストール Geventのmonkey. patch_al l がライブラリ起因で適用 非同期・Threadi ngの標準ライブラリがgreenl et処理に置き換え Uvi cornと競合!! イベントループに変な形で割り込み! Issueも上がっていました。

Slide 39

Slide 39 text

ご ん . . . お ま え だ っ た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもGeventのpi pでインストール Geventのmonkey. patch_al l がライブラリ起因で適用 非同期・Threadi ngの標準ライブラリがgreenl et処理に置き換え Uvi cornと競合!! イベントループに変な形で割り込み!

Slide 40

Slide 40 text

ごん...おまえだったのか 🦊 04 04

Slide 41

Slide 41 text

ごん...おまえだったのか 🦊 04 04

Slide 42

Slide 42 text

解 決 方 法 Dockerfil eを2つに分けて それぞれ geventあり geventなし で作成した。 たったこれだけ. ..。 ごん...おまえだったのか 🦊 04 04 ※細かい話ですが、MacだとGreenl etの動きがまたちょっと動きが違うようで、ローカルだと再現しなかったようです。

Slide 43

Slide 43 text

原 因 わ か ら ず 夢 で デ バ ッ グ 夜遅くまで調査して、 それでもわからなくて、 悔しくて、 寝ながらデバッグして、 朝起きてperpl exityに聞いて 解決。 ごん...おまえだったのか 🦊 04 04 喜びすぎて変なタイポしてますね。 喜びすぎて変なタイポしてますね。

Slide 44

Slide 44 text

最 後 に 05 05 難しいトラブルシュートは、アプリインフラ両方を 行ったり来たりして調べるべし。 それぞれに原因がありそうで、調査投げてしまうと 時間がかかってしまう!!

Slide 45

Slide 45 text

最 後 に 05 05 難しいトラブルシュートは、アプリインフラ両方を 行ったり来たりして調べるべし。 それぞれに原因がありそうで、調査投げてしまうと 時間がかかってしまう!!

Slide 46

Slide 46 text

最 後 に 05 05 難しいトラブルシュートは、アプリインフラ両方を 行ったり来たりして調べるべし。 それぞれに原因がありそうで、調査投げてしまうと 時間がかかってしまう!! なろう!フルスタックエンジニア なろう!フルスタックエンジニア なろう!フルスタックエンジニア 私も精進します。。。

Slide 47

Slide 47 text

最 後 に 05 05

Slide 48

Slide 48 text

最 後 に 05 05 ちょっと ちょっと ちょっと だいぶ 多少

Slide 49

Slide 49 text

T H A N K Y O U T H A N K Y O U ご清聴ありがとうございました。 ご清聴ありがとうございました。