Lighthouseを使っている時にローカルで実装して動作確認した後、AWS環境(+Redis)にデプロイしてECS確認したらschema.graphql
の更新が全く反映されず、めっちゃハマりました。
この記事ではその解決策と簡単な解説をしていきたいと思います。
結論
.env
または環境変数にLIGHTHOUSE_CACHE_ENABLE=false
を設定するか、以下のコマンドを実行する。
ただし本番環境で上記の環境変数を設定するのは非推奨なので注意が必要。
php artisan lighthouse:clear-cache
環境
Docker 19.03.8
PHP 7.3.16
Laravel 6.18.3
Lighthouse 4.11
発生したこと
-
Lighthouse
でResolverを使用してスキーマを実装し、GitHubからAWSのCode兄弟を使ってECSにデプロイ。 - ローカルでは元気に動いていたプログラムがECS上では全く動かない。
- デバッグログ仕込みまくって調べてみたら
schema.graphql
のファイルの更新が反映されてない。 - ECSで動いているimageを確認してもちゃんと新しい
schema.graphql
が入っている。 - キャッシュか?でもデプロイのたびにコンテナ作り直しているからそれはないよなぁ……
- 原因がわからなくて詰む。
原因
やっぱりキャッシュでした。
config/lighthouse.php
にキャッシュの設定があります。
'cache' => [
'enable' => env('LIGHTHOUSE_CACHE_ENABLE', env('APP_ENV') !== 'local'),
'key' => env('LIGHTHOUSE_CACHE_KEY', 'lighthouse-schema'),
'ttl' => env('LIGHTHOUSE_CACHE_TTL', null),
],
enable
に書いてある通り、.env
のAPP_ENV
を参照しlocal
以外だったら自動でキャッシュを有効化します。
これによりGraphQLの全てのスキーマが一つのデータとしてキャッシュされます。
で、このキャッシュはどこに保存されるかというと、メモリではなく.env
のCACHE_DRIVER
で設定されているストレージに保存されます。
(詳細な実装はこちらに書いてあります。)
今回はRedisを使用してたので、そこに保存されることになります。
ローカルならDockerコンテナでRedisを管理しているので、コンテナを落とせば自然とリセットされますがAWSでの開発環境ではRedisを落とすことはほぼありません。
そのため永遠にキャッシュが残ることになってしまったのです。
最後に
注意点としてconfig/lighthouse.php
に書いてある通り、キャッシュをオフにするとパフォーマンスに影響がでます。
なので本番環境ではキャッシュを切らないように気をつけましょう。
/*
|--------------------------------------------------------------------------
| Schema Cache
|--------------------------------------------------------------------------
|
| A large part of schema generation consists of parsing and AST manipulation.
| This operation is very expensive, so it is highly recommended to enable
| caching of the final schema to optimize performance of large schemas.
|
*/
ECSを使用している場合はいちいちコンテナに入るのも大変なので、Dockerfileにコマンドを追加したり直接Redis上のキャッシュを削除するようにしましょう。
参考文献
Schema caching
GraphQL Server Cannot Be Reached Status Code 500
nuwave/lighthouse