AIイラストサーチ:インフラ編
はじめに
以前、AIイラストサーチというものを作ったという記事を投稿しました
今回の記事は、インフラ周りをいじっている際に、自分が頭の中で考えていたことを、文字として残すために書いています。(ので、ほぼ個人用のメモ。参考にならない可能性あり)
やったこと
GKEを使用したGCPでの本番環境構築
考えていたこと
開発環境は何にした?
docker-composeで開発を行った。
ローカル環境をマウントし、即時変更を反映させながら作業をサクサク進められるから。
本番環境は何にした?
GKEを本番環境として使用した。
もともとk8sは趣味で勉強してたが、実際にGKE等でアプリケーションを作成してみたくなったのがきっかけ。
個人の小規模なアプリであれば、GKEは使う必要はなさそう
ただし、実際の機械学習を用いたサービスとして使われる場合、
-
Cloud Runなどはportチェックのみをしており、healthチェックができない(コンテナは立ち上がったが、機械学習のモデルのロード中でアプリが立ち上がっていない。なのに、リクエストを受け取るので処理を行えず500系エラーを吐く)
-
GAEのFlexibleはhealthチェックがある。が、複数コンテナを使う際は面倒くさそう。
-
Vertex AI Endpointは、未知数。またGCPに完全にロックインされる。
などを考慮すると、GKEが選ばれそう。
webサーバーとアプリケーションサーバーの通信どうしてる?
podの中に、webサーバー(nginx)のコンテナとアプリケーションサーバー(fastAPI)のコンテナを両方詰めた。これはサイドカーパターンと呼ばれるらしい。
このパターンを採用することにより、webサーバーとアプリケーションサーバーが、localhost で通信することができるようになった。(CORSの設定をするのが楽になった)
ビルドされたreactのファイルは、webサーバー(nginx)の特定ディレクトリ以下に配置している。
Cloud Armorを使用した理由は?
GKEのingress(中身はGCLB)を使えば、静的IPアドレスを固定して、インターネット上からアクセスできる。
しかし、DDOSなどの攻撃から無防備になる。そのため、Cloud ArmorをGKE ingressにアタッチした。
また、身内内で公開するために、Cloud Armorに外部から内部への通信(ingress)のIP制限の設定を行った。特定のIP以外からはアクセスできない状態にした。
Cloud DNS周りの設定
お名前.comでドメイン名を取得してきて、諸々の設定を行った
Cloud Domainからドメイン名を取得しても良かったが、無料のものはなかったので採用を見送った。実際のサービスで運用する際は、GCPで完結させるために、Cloud Domainを使うべきだと思う。
その他
インフラ管理はterraformで行った。
Dockerは、マルチステージビルドを採用。ビルドのスピードが上がった & けっこう容量が減ったので、開発スピードが上がった。
最初は、1つのDockerfileに、開発用のイメージと本番用のイメージがあるので両方ビルドされるかもと思っていた。が、開発時には本番用イメージののビルドが走らないので、杞憂だった。
Discussion