1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Lighthouse】schema.graphqlがキャッシュされて更新できない時の対処法【Laravel + GraphQL + Redis】

Posted at

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

発生したこと

  1. LighthouseResolverを使用してスキーマを実装し、GitHubからAWSのCode兄弟を使ってECSにデプロイ。
  2. ローカルでは元気に動いていたプログラムがECS上では全く動かない。
  3. デバッグログ仕込みまくって調べてみたらschema.graphqlのファイルの更新が反映されてない。
  4. ECSで動いているimageを確認してもちゃんと新しいschema.graphqlが入っている。
  5. キャッシュか?でもデプロイのたびにコンテナ作り直しているからそれはないよなぁ……
  6. 原因がわからなくて詰む。

原因

やっぱりキャッシュでした。

config/lighthouse.phpにキャッシュの設定があります。

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に書いてある通り、.envAPP_ENVを参照しlocal以外だったら自動でキャッシュを有効化します。

これによりGraphQLの全てのスキーマが一つのデータとしてキャッシュされます。

、このキャッシュはどこに保存されるかというと、メモリではなく.envCACHE_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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?