📚

AIイラストサーチ:インフラ編

2022/07/24に公開

はじめに

以前、AIイラストサーチというものを作ったという記事を投稿しました
https://zenn.dev/sugasuga/articles/83a1ff1c62aa53

今回の記事は、インフラ周りをいじっている際に、自分が頭の中で考えていたことを、文字として残すために書いています。(ので、ほぼ個人用のメモ。参考にならない可能性あり)

やったこと

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