AmazonLinux2で運用しているdotnet core3.1環境をアップデートしたら502エラーになった症状と対策の備忘録

不具合の発生状況

  • .NET core 3.1環境で運用しているWebシステムを.NET6対応にパッケージをアップデートすると、再起動後に502エラーになってしまった。

不具合発生時の影響

  • パッケージアップデート以外にシステム設定に変更なし
  • nginx にもエラーなし
  • パッケージアップデート後も再起動までは正常に動作していた
  • ログを調査してもdotnetを呼び出すサービスが失敗しているだけで「502エラー」以外に不具合がない

不具合の原因と対処方法

原因

  • systemdでデーモン化していたので、その起動コマンドが失敗していた
  • 古いバージョンは /usr/bin/dotnet コマンドだったのだが、
    新しいバージョンは /usr/local/bin/dotnet にコマンドのパスが変わっている
  • 通常のコマンド実行ではPATH環境変数に含まれるので問題は起きないが、
    デーモン化している場合はフルパスでコマンドを指定する必要があるため、パス環境が変わっているとコケる

対処方法

  • systemdのサービスの dotnetコマンドのパスを変更する
  • もしくは、/usr/bin/dotnet にシンボリックリンクを作成する

※後者は恒久的にシステムに影響するので、できるかぎり前者対応したほうがいい。

調査した類似の不具合

ありえそうな事例なのに、stackoverflowを探しても同じ事例が見つからなかった。

1つ参考になったのは「.NET coreをLinuxに構築したのだが、ブラウズしようとすると502 Bad gateawayと表示される」という質問に対して

Forbidden - Stack Exchange

「コンソールで立ち上げてみて動作するかどうか確認してはどうか?」
という回答

dotnet run --urls http://0.0.0.0:5000

上の例は単純にdotnetコマンドを設定していなかったエラーなのだが、結果的に参考になった。

.NET以外でもsystemdでデーモン化したファイルがシステムアップデートでPATHが変わると影響するので、今後の備忘録として役に立てば幸いです。