💰

【実体験】Next.js × Cloud Runデプロイで遭遇した地雷と回避策

に公開

はじめに

先日、自作のWebアプリである「TechNexus」をCloud Run上にデプロイし、無事β版のリリースが完了しました!
https://technexus-35620106389.asia-northeast1.run.app/
(まだドメインも取ってないのでCloud Runの初期URLのまま)

この記事ではプロダクトについての説明ではなく、Cloud Runのデプロイ方法と注意点を備忘として残します!
プロダクトが気になる方は是非(こちら)からアクセスして見て下さい!(めっちゃシンプルなつくりなので疑問点はないはず)

プロジェクト概要

  • アプリ名: TechNexus
  • 目的: RSSから技術記事を集約し、カテゴリ別に閲覧できる情報ハブを構築
  • 環境: macOS (Apple Silicon) + Docker + Google Cloud Platform

Step 1.Google Cloud SDKのセットアップ

基本的にCLI上で作業を行います(一部コンソールでも操作しますが)。
まずはgcloudコマンドを使える状態にします。

curl https://sdk.cloud.google.com | bash
source ~/.zshrc
gcloud auth login --no-launch-browser

この時、gcloud auth login実行後にURLが出力されるので、ブラウザに貼ってログインを実施。
その後、認証コードが表示されるのでCLIに貼り付けてログイン完了です。

Step 2. プロジェクトとAPI設定

Cloud Runデプロイ用のGoogle Cloudプロジェクトを作成します。

gcloud projects create {app-name} --name="{app-name}"
gcloud config set project {project-name}
gcloud services enable run.googleapis.com cloudbuild.googleapis.com

3行目のenableコマンドはこのままやると失敗します(多分)
作成したプロジェクトと請求アカウントを紐付けましょう。

プロジェクト画面の「課金」から請求アカウントを紐付け

紐付け後にコマンド実行すると通るはず。

Step 3. Next.js設定と環境変数

Cloud Runではstandaloneビルドが推奨されています。

// next.config.ts
const nextConfig = { output: 'standalone' };

また、APIキーなどの値は環境変数で設定。
普通に.envに設定でいいでしょう。

この時、NEXT_PUBLIC_プレフィックスをつけると、クライアントサイドでも利用可能になるらしい。

NEXT_PUBLIC_API_BASE_URL="https://xxxx.amazonaws.com/prod"
NEXT_PUBLIC_API_KEY="your_api_key"

Step 4. Dockerビルドの壁 ― Apple Siliconの罠

Apple Silicon MacでDockerをビルドすると、デフォルトでARM64イメージが作られます。
しかし、Cloud RunはAMD64アーキテクチャで動作。

# ARM64ビルド(失敗)
docker build -t gcr.io/{app-name}/{service-name} .

# AMD64指定ビルド(成功)
docker build --platform linux/amd64 -t gcr.io/{app-name}/{service-name} .

最初ARM64指定をせずデプロイをして失敗しました。こんなのやってみなとわからんね。

Step 5. デプロイと認証

Docker認証を設定し、Cloud Runへプッシュ&デプロイします。

gcloud auth configure-docker
docker push gcr.io/{app-name}/{service-name}
gcloud run deploy {service-name} \
  --image gcr.io/{app-name}/{service-name} \
  --platform managed \
  --region asia-northeast1 \
  --allow-unauthenticated \
  --port 3000

結果

Service [{service-name}] revision [technexus-00002-qmr] has been deployed.
URL: https://technexus-35620106389.asia-northeast1.run.app

Step 6. 請求の設定

これは全ての人に言うことですが、

  • 絶対にアラート設定はしましょう
  • 絶対にアラート設定はしましょう
  • 絶対にアラート設定はしましょう

(こちらの記事)ではAWSについて記載していますが、新卒の頃に10万爆弾を会社のアカウントで食らった身です。3分で設定できます。絶対にしましょう。

請求アカウントの予算アラートから設定

Step 7. Cloud Runの注意点

Cloud Runは手軽にWebサービスのリリーができ、無料枠もかなり大きい素晴らしいサービスです。
ただし、IPをネットワークに公開してしまうということを忘れないでください。
つまり、いつ・どのタイミングでDDos攻撃をくらい青天井のクラウド費用を請求されてもおかしくないということです。

実際、特に設定をしなければCloud Runは無制限のスケールになっているはず?です。
必ず上限設定を行いましょう。

gcloud run services update {service-name} --region asia-northeast1 --max-instances=3
gcloud run services update {service-name} --region asia-northeast1 --concurrency=50
gcloud run services update {service-name} --region asia-northeast1 --cpu-throttling

これにより最大インスタンス数が3、同時に処理できるリクエスト数が50となったので、同時に処理できるのは150件/sなはず(これでもオーバースペックかも)

処理数の条件設定により、いったんは過剰なアクセスを食らったとしても無限に請求が増えていくことは無くなりました。

もしさらに対策をしたいのであれば、Cloud ArmorもしくはCloudflareを用いたDDos対策を行いましょう。
Cloud Armorを使う場合、Cloud Load Balancingの使用が必須です。

以上となります!
もし記事が面白いと思った場合はいいねやXアカウントのフォローお願いします〜〜!

Discussion