はじめに
.NET 6.0 のプログラムの修正が大体終わり、さて AWS の実行環境にデプロイしようかなというところで、2 つほどハマったのでメモしておきます。
移行前 | 移行後 | 備考 | |
---|---|---|---|
ベースイメージ | Alpine 3.11 | Alpine 3.14 | |
.NET | .NET Core 3.1 | .NET 6.0 | |
データベース AWS Aurora MySQL |
2.x | 2.x | 変更なし |
データベースアダプター Pomelo.EntityFrameworkCore.MySql |
3.2.4 | 6.0.1 |
Alpine 3.14 から Aurora MySQL 2.x に接続できない
Windows で実行している分には問題ないのですが、Alpine Linux から実行したら下記の例外が発生しました。
OS 側でサポートする TLS と Aurora 側でサポートする TLS のバージョンの差から発生する問題ですね。
An error occurred using the connection to database '' on server 'aurora-xxxxx-xxxxx.xxxxxxxxxx'.
System.InvalidOperationException: An exception has been raised that is likely due to a transient failure. Consider enabling transient error resiliency by adding 'EnableRetryOnFailure()' to the 'UseMySql' call.
---> MySqlConnector.MySqlException (0x80004005): SSL Authentication Error
---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception.
---> Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
---> Interop+Crypto+OpenSslCryptographicException: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
--- End of inner exception stack trace ---
at Interop.OpenSsl.DoSslHandshake(SafeSslHandle context, ReadOnlySpan`1 input, Byte[]& sendBuf, Int32& sendCount)
at System.Net.Security.SslStreamPal.HandshakeInternal(SafeFreeCredentials credential, SafeDeleteSslContext& context, ReadOnlySpan`1 inputBuffer, Byte[]& outputBuffer, SslAuthenticationOptions sslAuthenticationOptions)
以前、Debian でも同様のエラーが出たことがあるのでこれは下記の投稿と同じ方法で解決しました。
最も簡単な方法は、ConnectionString に SSL Mode=None
を設定することです。
一度閉じたコネクションを開くと動作が止まる
ローカルの開発時は Docker で起動した MySQL 5.7 に接続しているので気づかなかったのですが、2 回以上データベースにクエリを発行すると 2 回目のクエリの結果が返ってこない問題に遭遇しました。
Pomelo.EntityFrameworkCore.MySql が 6.0.1 で足回りに利用している MySqlConnector の最低バージョンを 2.1.2 に更新した事が影響している用です。
下記のドキュメントにあるように Aurora MySQL 2.x(MySQL 5.7) 系では MySQL の Pipeline に正しく対応していない事が問題らしく、ConnectionString に Pipelining=False
を設定する必要があります。
この問題は Aurora 3.x(MySQL 8.0) 系では発生しないようです。
そのほか、MySqlConnector の接続文字列のオプションは下記のようなものがあります。
おわりに
両方とも ConnectionString の調整で対応できるレベルで良かったです。
.NET 6.0 自体の更新はそれほど大変ではないのですが、OS 周りを含めて確認するとそれなりにハマりポイントがありますね。
皆さん更新はこれからだと思いますが、何かの役に立てたら幸いです。