本投稿は、2023/2/1 時点で提供されている最新バージョンである次の組み合わせで発生した問題の暫定的な対処方法です。
- Azure Data Studio (ADS): v1.41.1
- Azure SQL Migration 拡張機能: v1.2.2
- セルフホスト統合ランタイム (SHIR): 5.26.8404.1
- SHIR は移行元とは異なる環境にインストールしている
私が使用している環境では、バージョンアップする前には動作していたはずなのですが、最新化したら動作しなくなったので…。
環境依存ではない問題のようには見えるので、そのうち修正されるような気がしますが、現時点では手動での対応が必要そうで、その時にどのような観点での調査が必要になるのかを思い出すためにも有用かと思い、情報を残しておきたいと思います。
Issue は上げてあるので想定しない動作なのであれば修正されるのではないでしょうか。
投稿後の追記
[SQL Migration][Hotfix] Remove parameter from IR validation で暗号化のオプション設定をデフォルト False にする修正の検討を進めていただけているようです。SQL Migration 拡張機能の 1.2.5 以降が提供されたタイミングで解消しているかもしません。
-> Insider に含まれている 1.3.0 で事象は発生しなくなっています。
[Hotfix][SQL Migration] Default encryptConnection in validation request body to false も合わせて確認をしておくと、本件についての理解を深めることができそうです。
発生している問題
Azure SQL Migration は Azure 上で実行されている SQL Server ベースの環境に SQL Server のデータベースを移行する際に活用できる ADS の拡張機能となります。
移行元となる SQL Server に接続を行い、Azure にデータベースの移行を行う機能となります。
この機能を使用して以降を行う際に、移行元の SQL Server への接続には次のような設定を使用しています。
SQL Server は自己署名を使用した暗号化接続がデフォルトで実行できるようになっていますが、この証明書を使用した接続では、信頼されていない証明書のため、信頼するという設定も合わせて有効化する必要があります。
今回は移行元の暗号化接続は自己署名の環境となるため、暗号化接続をするためには証明書の信頼も有効にする必要があります。
この設定で接続はできた後、Azure SQL への移行のための設定ウィザードを進め、「ステップ 5: データソースの構成」で「検証の実行」(Run Validation) を実行する必要が出てきた場合に本投稿の事象が発生する可能性があります。(検証の実行は選択したオプション / 拡張機能のバージョンによっては表示されないこともありますので、表示されないオプションの組み合わせの場合は本事象は発生しません)
「検証の実行」を実施するといくつかの検証が実行されますが、その中の「ソースデータベースの接続性」で次のようなエラーが発生します。
この事象は、暗号化接続を False / False の組み合わせで使用した場合も発生します。
問題が発生している原因
今回の問題は、移行元への接続に暗号化接続を使用している / 使用していないにかかわらず発生しているように見受けられました。
「検証の実行」が必要になるケースとしては「セルフホスト統合ランタイム (SHIR)」を使用した移行が必要になる場合があるようです。
SHIR から、移行元の SQL Server い接続を行おうとした際に本エラーが発生しているようです。
SHIR のエラーについては、イベントログの「Connectors – Integration Runtime」に出力されています。
今回のエラーであれば、次のようなエラーが出力されていることが確認できます。
SHIR から SQL Server への接続で「暗号が有効 (Encrypt=True)」 になっているが、「証明書の信頼が無効 (TrustServerCertificate=False)」の状態で接続を行っているようなエラーですね。
これは、ADS で移行元の接続で暗号化を使用する / 使用しないの設定にかかわらず、上記の設定で接続が行われているように見受けられました。
そのため、信頼された証明書を使用した暗号化接続が有効になっていない SQL Server 以外では、ソースデータベースの接続性のエラーを回避することはできないようでした。
「検証の実行」が表示される UI は ADS 1.40 以降でサポートされる拡張機能となるのですが、ADS 1.40 では、次のような変更が実施されました。
ADS 1.40 以降は は暗号化接続はデフォルトで有効化されているようで、この対応の一環で、検証実行時の接続も暗号化が有効かナ状態がデフォルトとなったのでしょうかね…。
現状、移行元の接続に使用した暗号化オプションの設定は、検証実行時には引き継がれていないようで、次の組み合わせの接続に UI から変更するということはできなさそうでした。
- Encrypt = True / TrustServerCertificate=True
- Encrypt = False
機能検証のため暫定対応で暗号化を外す
そうはいっても、検証するためには機能を動かさないといけませんので、暫定でパッチを当てます。
拡張機能のソースを眺めていると、暗号化の接続に関係しそうな個所が何か所か見つかります。
「encryptConnection=True」と固定化されている箇所がありそうですので、これを外します。
ADS でインストールした拡張期右派「%USERPROFILE%\.azuredatastudio\extensions」に格納されており、今回の拡張機能であれば、このディレクトリ内の「microsoft.sql-migration-1.2.2\dist\main.js」が拡張機能のソースとなります。
このファイルをテキストエディタで開き「encryptConnection:!0」を「encryptConnection:!1」としてすべて置換し、ADS を再起動します。
これにより暗号化接続が使用されないようになり、検証のソースデータベースの接続性のエラーを回避することが可能となります。
今回は、特定の動作が実行できれば良いので、「Encyprt=False」を全体に設定してしまっており、設定変更の影響が厳密には確認できていません。
あくまでも「特定機能を動作させるための暫定的な対応」となりますが、機能の検証を実施しなくてはならない場合には、このような方法で回避してしまうこともできるのではないでしょうか。