Heroku-20 スタック
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年04月24日(水)
この記事では、Ubuntu 20.04 をベースとした Heroku-20 スタックについて説明します。スタックとは
新機能
現在、このスタックのベースは Ubuntu 20.04 であり、Heroku-18 スタックで使用されていた Ubuntu 18.04 とは異なります。
Python 2 がサポート終了ステータスに達したため、python
コマンドは Python バージョン 3 を実行するようになります。Python 2 は python2
コマンドでまだ使用できますが、ビルド時に限られ、アプリ実行時には使用できなくなりました。ユーザーは、python3
を呼び出すことにより、Python 3 を明示的に使用することもできます。
python
コマンドの使用可能性は、python2
および python3
エイリアスのみを提供する Ubuntu 20.04 の標準インストールからの変更です。python-is-python3
パッケージは、python
を実行する既存のソフトウェアが実行できることを保証しますが、これには、呼び出された Python コードが Python バージョン 3 と互換性がある必要があります。
python
のこのデフォルトの変更は、アプリの起動時やビルド時のスクリプトなどの補助的な目的で Python を使用するお客様にのみ影響します。公式の Heroku Python のサポートを使用する (Python buildpack) を介して) Python アプリは、アプリのコードベースで指定された正確な Python バージョンを常に受け取ります。これは、オペレーティングシステムレベルで提供される python
コマンドよりも優先されます。
使用可能なソフトウェア
Heroku のすべてのスタックは、さまざまなオペレーティングシステムパッケージと言語ランタイムバージョンをサポートしています。このサポートは通常、スタックが最初にリリースされた時点でそれぞれの保守担当主体によって活発に開発されていたソフトウェアに限定されています。
言語ランタイム
サポートされている言語ランタイムのバージョンについての最も正確な情報は、個々の言語のページを確認してください。
buildpack | ショートハンド | ランタイムのバージョン |
---|---|---|
Ruby | heroku/ruby |
ランタイムのバージョン |
Node.js | heroku/nodejs |
ランタイムのバージョン |
Python | heroku/python |
ランタイムのバージョン |
Java | heroku/java |
ランタイムのバージョン |
PHP | heroku/php |
ランタイムのバージョン |
Go | heroku/go |
ランタイムのバージョン |
オペレーティングシステムパッケージ
Heroku-20 で使用可能なすべてのオペレーティングシステムパッケージの一覧は、「Heroku スタックの Ubuntu パッケージ」の記事を参照してください。
サポート期間
Heroku-20 は Ubuntu 20.04 をベースとしています。サポートは、2025 年 4 月までです。Heroku のスタックアップデートポリシーの詳細を確認してください。
Heroku-20 の使用
アプリの作成時にスタックを指定できます。
$ heroku create --stack heroku-20
既存のアプリのスタックを変更できます。新しいスタックは、次に実行されるビルドから使用されます。
$ heroku stack:set heroku-20
app.json
を使用している場合、レビューアプリと Heroku CI の実行で同じスタックが使用されるよう、このファイルでもスタックを指定する必要があります。
{
"stack": "heroku-20"
}
既存のアプリのスタックは app.json
を使用して変更できません。指定されたスタックは、レビューアプリである新しく作成されたアプリ、Heroku CI テスト実行アプリ、または Heroku Button を使用して作成されたアプリにのみ適用されます。
Heroku-20 へのアップグレード
新しいスタックにアップグレードするときに実行する手順を理解するには、スタックアップグレードガイドを参照してください。
新しいスタックにアプリを移行した後は、アプリケーションを入念に監視して、正常に実行されていることを確認するようお勧めします。
アップグレードに関する注意事項
python
プログラムは Python 3 を指すようになりました
ビルド中や実行時のスクリプトの目的で、アプリケーションのコードが python
プログラムを呼び出す場合、これにより Python 3 が実行されるようになるため、この方法で実行するコードは Python 3 と互換性がある必要があります。または、python2
プログラムを使用して Python 2 を一時的に使用することもできますが、このバージョンの Python はサポートが終了しており、保守されていないことに注意してください。
python
のこのデフォルトの変更は、アプリの起動時やビルド時のスクリプトなどの補助的な目的で Python を使用するお客様にのみ影響します。公式の Heroku Python のサポートを使用する Python アプリは、アプリのコードベースで指定された正確な Python バージョンを常に受け取ります。これは、オペレーティングシステムレベルで提供される python
プログラムよりも優先されます。
デフォルトの OpenSSL 設定では、新しい TLS プロトコルと暗号の使用が必要になりました
デフォルトの Ubuntu 20.04 openssl
設定では、TLS プロトコルの最小バージョン v1.2 が設定されるようになりました。つまり、TLS v1.0 および v1.1 は、OpenSSL を使用してアウトバウンドリクエストを行うクライアントによってサポートされなくなりました。これは、クライアントが古いプロトコルバージョンをハードコーディングしている場合、またはサーバーが TLS v1.2 以降をサポートしていない場合、OpenSSL の「no protocols available
」エラーの形で現れる可能性があります。Python を使用しているアプリでは、「no protocols available
」エラーの代わりに「[SSL] internal error
」エラーが表示される場合があります。
さらに、デフォルトの OpenSSL セキュリティレベル (SECLEVEL
) がレベル 1 からレベル 2 に変更されました。これにより、OpenSSL が安全でない暗号やキーを使用しないようになります。古いソフトウェアやバグのあるソフトウェアを実行しているサーバー、または安全でない設定のサーバーに接続するときは、「sslv3 alert handshake failure
」、「wrong signature type
」、または「dh key too small
」エラーが発生する可能性があります。
OpenSSL 設定のこの変更は、アプリケーションによって行われたアウトバウンドリクエストにのみ影響します。インバウンドリクエストの TLS ターミネーションは、アプリで使用されるスタックの影響を受けない Heroku ルーターによって処理されます。
OpenSSL 関連のエラーが発生した場合は、サードパーティのクライアントの問題を除外するために、最初に curl
を使用して再現できるかどうかを確認してください。次に例を示します。
$ heroku run curl -I --ciphers DEFAULT@SECLEVEL=2 <URL>
curl コマンドでエラーが再現されなかった場合は、古い TLS プロトコルバージョンをハードコーディングしているといった、アプリケーションからの接続に使用されているクライアントやライブラリに問題がある可能性があります。問題を修正するアプリケーション依存関係の新しいバージョンがあるかどうかを確認し、ない場合は、ライブラリの作成者に問題を報告してください。次の依存関係には互換性がないことがわかっています。
- v0.7.0 より前の
keen
Python クライアント (KeenClient-Python#161) - v1.21.3 より前の
postmark
Ruby クライアント (postmark-gem#86)
上記の curl コマンドでエラーが再現された場合は、アプリケーションで使用されている特定のクライアントやライブラリに問題がないことを示しています。次に、OpenSSL のセキュリティレベルの設定を 1 に戻してみて、デフォルトのセキュリティレベルの変更が原因であるかどうかを確認します。
$ heroku run curl -I --ciphers DEFAULT@SECLEVEL=1 <URL>
これが成功した場合は、サーバーが、キーや暗号のネゴシエーションを正しく実行しない古いソフトウェアまたは誤って設定されたソフトウェアを実行していることを意味している可能性があります。サードパーティのサーバー所有者に連絡して、修正を依頼してください。
Datadog buildpack の互換性
「Package 'libsensors4' has no installation candidate
」や「Unable to locate package libsnmp30
」などのビルドエラーが発生し、Datadog buildpack を使用している場合は、アプリが古い Datadog buildpack バージョンに固定されているため、Heroku-20 に対応した互換性の修正がない可能性があります。詳細は、heroku-buildpack-datadog#216 を参照してください。
Heroku-20 の Docker イメージ
Heroku-20 は、次の 2 つの Docker イメージとして入手できます。
- ランタイムイメージ (
heroku/heroku:20
) は、ほとんどのワークロードの場合に、ビルドイメージよりもお勧めします。 - ビルドイメージ (
heroku/heroku:20-build
) は、開発用ヘッダーとツールチェーンを含んでいるため、サイズが大きくなっています。そのため、ソースコードまたは依存関係をコンパイルする必要があるお客様にのみお勧めします。
Heroku-20 をベースイメージとして使用するには、Dockerfile
で次のコマンドを使用します。
FROM heroku/heroku:20
Docker イメージのデプロイについての詳細は、Heroku Container Registry および Runtimeのドキュメントを参照してください。