Google App Engine は Google Cloud Platform 上で提供されるサービスの一つでウェブアプリケーションを公開できます。単に公開するだけならば、無料同然に済みやすく十分にセキュリティも保てます。多数のアクセスを受けるウェブサイトを公開し高速なレスポンスを保つならばお値段もそれなりにかかりますが、この値段や規模の変更も設定を変更して再公開するのみで済むのは楽です。
App Engine アプリケーション プラットフォーム | Google Cloud
便利な Google App Engine ですが、雑にモノリスなファイル構成でデプロイすると次のエラーメッセージに出会いやすいです。
ERROR: (gcloud.app.deploy) INVALID_ARGUMENT: This deployment has too many files. New versions are limited to 10000 files for this app.
- '@type': type.googleapis.com/google.rpc.BadRequest
fieldViolations:
- description: This deployment has too many files. New versions are limited to 10000
files for this app.
field: version.deployment.files[...]
デプロイするファイルが多すぎるというエラーです。Google App Engine にファイルをアップロードする際はライブラリの細かいファイルもアップロードするため意外にあっさりひっかかります。
この制約の詳しいことは次から辿れます。
割り当て | App Engine ドキュメント | Google Cloud#デプロイ
サービスの分割など色々対処法があり、ベストプラクティスもありそうなのですが .gcloudignore というアップロードしないファイルを定める設定ファイルで解決する方法もあります。そもそも 10000 ファイル必要でないサービスならば 10000 ファイルアップロードしない様にする、という解決方法です。この解決方法を採る際、一々デプロイして上限に達しているかいないかをチェックするのは面倒です。次の様にスクリプトを作るのが楽です。
<?php
// コマンドを構築して格納する変数
$command = "";
// 無視するファイルの指定形式をリスト化
$ignores = trim(shell_exec('cat .gcloudignore'));
foreach(explode("\n", $ignores) as $i){
// 無視するファイルの指定は行に1つなので行で分割
if(strpos('#', $i) === 0){
// # で始まる行はコメント行なのでスキップ
continue;
}
// ファイル指定形式は ! による否定を使わない分には
// おおよそ grep と同じ形式なので
// ざっくばらんに grep -v で指定した形式を含まないというフィルタリングをする
$command .= "grep -v \"$i\" |";
}
// 末尾のパイプは邪魔なので rtrim で除去
$command = rtrim($command, '|');
// find コマンドでプロジェクト配下のファイルとディレクトリを全てパスにして grep で絞り込む
$files = shell_exec('find . | '.$command);
// 結果残った行数がファイル数。これが 10000 未満なら多分 GAE にアップロード可能
echo count(explode("\n", trim($files))). "\n";
すごいアバウトな上、シェルスクリプトを PHP 形式で書き下した様なコードですが、おおまかなファイル数がわかります(当初ワンライナーのコマンドでやろうとしましたが諦めました)。これが 2万、3万とかなら別方向から解決すべきですが、1万少々ならば .gcloudignore で不要なライブラリの部分などを細かく指定し、都度スクリプトでチェックすることによってデプロイのエラーを比較的早く解消することができます。