趣旨
今回はエラー対処したメモとして記事を書きます
エラー内容
Magick::ImageMagickError: cache resources exhausted
原因:画像変換時のキャッシュリソースの不足でエラー
環境
- Heroku
- マイクロサービスアーキテクチャー
- api(Rails)
- front
背景
Herokuアプリで本番運用始めたらエラー発生!
Sentryを入れてたおかげで気づけた Magick::ImageMagickError
のエラーが発生している
(本番運用の実際の大きいデータを入れてみて気づきました。。。)
エラーを調べるとpolicy.xmlを修正したら良さそう。。
けどローカルでの修正方法のみで、viで直に修正しろとか書いてました(Heroku上ではできない)
imagemagickの公式ドキュメント
Heroku側の設定方法
対応方法
①Herokuのセッションを開始
heroku ps:exec -a あなたのアプリ名
②現在のpolicyを確認
$ convert -list policy
実際の結果
Path: /etc/ImageMagick-6/policy.xml
Policy: Resource
name: disk
value: 1GiB
Policy: Resource
name: map
value: 512MiB
Policy: Resource
name: memory
value: 256MiB
Policy: Resource
name: area
value: 128MB
Policy: Resource
name: height
value: 16KP
Policy: Resource
name: width
value: 16KP
Policy: Delegate
rights: None
ファイルを作成する必要があるので、現在のファイルを見に行く
$ cat /etc/ImageMagick-6/policy.xml
③Herokuのオーバーライト用の設定ファイルを作成
api配下に .magick/policy.xml
を作成
<policymap>
<!-- memoryエラー対象用として1GiBにアップデート -->
<policy domain="resource" name="memory" value="1GiB"/>
<policy domain="resource" name="map" value="512MiB"/>
<policy domain="resource" name="width" value="16KP"/>
<policy domain="resource" name="height" value="16KP"/>
<policy domain="resource" name="area" value="128MB"/>
<policy domain="resource" name="disk" value="1GiB"/>
<policy domain="delegate" rights="none" pattern="URL" />
<policy domain="delegate" rights="none" pattern="HTTPS" />
<policy domain="delegate" rights="none" pattern="HTTP" />
<policy domain="path" rights="none" pattern="@*"/>
<policy domain="cache" name="shared-secret" value="passphrase" stealth="true"/>
</policymap>
④環境変数の設定
heroku config:set MAGICK_CONFIGURE_PATH=/api/.magick -a あなたのアプリ名
apiを設定したのは、マイクロサービスアーキテクチャーに対応し
api配下にファイルを置いたことに対応するため。
終わりに
対応は難しくなかったけども
こんな記事が2時間前にあればもっと困らなかった。。
僕のように時間を費やす人を少なくするため、ここにメモします!