リソースコストの最適化
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年01月19日(金)
Table of Contents
Heroku では、使用したリソースのすべてのコストが秒単位で課金されます。この記事では、さまざまなユースケースについて Heroku リソースを最適化し、コストを最小限に抑えるためのガイダンスを提供します。
プロトタイプまたは Heroku Buttons のための最適化
プロトタイプを構築してアプリの試験を行う場合は、利用可能なプランのうち最も安価なものを使用します。たとえば、Eco dyno はアイドル状態が 30 分続くとスリープし、スリープ中は時間を消費しません。
個人アプリのみが Eco dyno を使用できます。個人アプリとは、Heroku Team や Enterprise Team の一部ではないアプリのことです。
app.json
に依存してデプロイするアプリがある場合 (Heroku Buttons を通じてデプロイされるアプリや、Platform API でセットアップされるアプリなど)、app.json
内で適切なプランを指定します。Heroku Buttons はデフォルトで利用可能なプランのうち最も安価なものを使用します。
{
"formation": {
"web": {
"quantity": 1,
"size": "basic"
}
}
}
プロトタイプの試験が完了したら、必ず次のことを行ってください。
- dynos をスケールダウンして、実行されたままにならないようにします
- 使用中でないすべてのデータベースリソースを除去または削除します。保持したい Heroku Postgres データをエクスポートすることができます。
- サードパーティのアドオンをアプリからダウングレードまたは削除します。
レビューアプリと CI アプリのための最適化
レビューアプリはデフォルトで、利用可能な dyno のうち最も安価なものを使用します。レビューアプリのコストは、次のようにして最適化できます。
- アイドル状態が 1 日、2 日、5 日、14 日、30 日続いたら自動的に破棄されるようにレビューアプリを設定する
- テストが終わったらすぐにレビューアプリを手動で削除する
- Heroku CI 用の Heroku Data for Redis および Heroku Postgres に対して In-Dyno データベースを使用する。In-Dyno データベースはテスト実行の dyno 内部で実行し、一時的なものであるため、CI ワークフローのテスト実行に対して優れた柔軟性とスピードを提供します。
app.json
にアドオンの低コストプランを指定する。レビューアプリまたは CI が app.json ファイルを無視しているような場合は、Heroku サポートにご連絡ください。
ステージングアプリのための最適化
ステージングアプリは、本番環境にプロモートする前に本番環境に似た設定で変更をテストするために使用されます。テスト中はリソースを調整して、必要以上に使用しないようにすることが重要です。
以下を行うときは、必要に応じて大規模なリソースプランにアップグレードします。
- 大幅なコード変更のテスト
- データベース移行の実行
ステージングアプリには、使用したリソースのコストが発生します。以下のようにしてステージングアプリのリソースを最適化します。
- 負荷テストを行って、実際のトラフィックの下でどのように実行されるかを確認する。これらの結果を使用すると、本番アプリの適切なスケーリングを決定するのに役立ちます。
- テストが完了したら dyno をスケールダウンする
- Elements marketplace からのサードパーティのアドオンを使用して、dyno がアイドル状態になったときに休眠状態にする
- Heroku Scheduler を使用して one-off dyno をスケジュールされた間隔で実行する。タスクが完了すると、dyno は自動的にオフになります。
本番アプリのための最適化
dyno の最適化
dyno の使用量を最適化して、使用可能なリソースをアプリが最も効率的に使用できるようにすることを検討します。アプリで使用する CPU やメモリの量などの要因によって、最適な dyno タイプも異なります。
使用量を最適化するためにアプリおよびデータベースを監視することをお勧めします。New Relic や Librato などのアプリケーションパフォーマンス監視 (APM) アドオンを追加すると、リソース使用量を監視し、長期にわたるメトリクスを収集することができます。
不要になったら以下の方法で dyno をスケールダウンします。
- Heroku Dashboard または CLI を使用して、アプリの dyno を手動スケーリングする
- dyno のパフォーマンスを最適化した後で、Performance、Private、および Shield dyno の自動スケーリングを有効化する
- Elements Marketplace のサードパーティアドオンを使用する
Heroku Postgres の最適化
可用性や稼働時間に対するアプリの使用と要件に基づいて、適切な Heroku Postgres プランを選択します。適切なプランは、月次ベースでアプリが許容できるダウンタイムの程度に依存します。Terraform を使用して、リソースを無駄にすることなくアプリをオンデマンドで作成して削除することも検討できます。
具体的なワークロードを理解し、パフォーマンスチューニングを行うことによって、Heroku Postgres データベースのパフォーマンスをさらに向上させることができます。WAL 圧縮を有効にすることも検討できます。この機能を有効にすると、ログ先行書き込み (WAL) の量を減らす代わりに CPU 使用量が若干増加するという犠牲を払うことに留意してください。
データベースのパフォーマンスを最適化する手順は次のようになります。
- アプリケーションのログのシステムメトリクスを追跡する
- データベースへの接続数を制御し、接続プールを適宜使用して接続制限およびメモリ不足エラーを回避する。
- 最適化されていないクエリを特定する
- データベースのロックを監視する
- データベース内の使用されなくなった行を定期的にクリーンアップする
- 個別のキャッシングを検討する
- heroku
pg:diagnose
コマンドを実行して一般的な問題を見つける
詳細は、「Heroku Postgres データベースのチューニング」を参照してください。
使用量とコストを追跡する方法
- Heroku Enterprise Account でない場合、アカウントの Billing tab で現在の使用量とコストを追跡します。
- Enterprise Account の場合、Enterprise Team ページの Usage tab で現在の使用量とコストを追跡します。