AWS RDSでSQL Serverインスタンスを実行しています。これは2017年の例だと思います。 SQL Serverを実行しているLinux EC2インスタンスもいくつかあります(バージョンは不明ですが、2017年と想定しています)
私たちのRDSインスタンスには、両方のLinuxインスタンスにリンクサーバーが設定されています。私が見つけたのは、リンクサーバーを作成した後、それらにクエリを実行して、問題なく動作することです。
これはQA環境であり、費用を節約するために、すべてのサーバーを夜間に停止します。その後、オンデマンドで開始されます。私が目にしている問題は、サーバーが復旧すると、リンクサーバーにクエリを実行しようとすると、次のエラーが発生することです。
System.Data.SqlClient.SqlException(0x80131904):復号化中にエラーが発生しました。
私の推測では、RDSインスタンスが復旧すると、ハードウェアが異なるように見え、そのハードウェアに基づく復号化キーがあると思いますか?
私は可能性を排除するためにいくつかのことをテストしました:
Linuxインスタンスをそのままにして、RDSインスタンスを停止/開始する(再起動しない)ことをテストしました。これは問題を再現しているようです。私はまだ逆を試していません(RDSを実行したままにして、Linuxインスタンスを停止/開始します)。
このエラーが発生したときに、リンクサーバーを削除して再作成してみました。これで問題が解決したようです。
理論的には、これまで読んでいたこのsp_procoptionプロシージャを使用して、サーバーの起動時にクエリを実行し、リンクされたすべてのサーバーを削除して再作成できると思います。しかし、それはこれを修正する間違った方法のようです。
私たちのサーバーは24時間365日稼働したままにすることもできますが、予算はかなり少ないので、そうではありません。さらに、RDSインスタンスを停止または開始する他の理由がある場合でも、この問題が発生します。
サーバーの起動時にリンクサーバーでドロップ/作成スクリプトを実行する以外に、これを機能させる方法はありますか?
ホストの交換が発生した場合、RDS SQL Serverはサービスマスターキーを復元しません。つまり、パスワードが設定されたリンクサーバーでは、リンクサーバーを使用しようとすると、「復号化中にエラーが発生しました」というエラーが発生します。残念ながら、現在、ホスト交換の通知はありません。最も近いのは、SNSイベントを介して再起動とフェイルオーバーを監視することです。これらのイベントのサブスクライブの詳細については、Amazon RDSイベント通知の使用を参照してください。再起動またはフェイルオーバーが発生した場合は、リンクサーバーのログインパスワードを手動で再追加する必要があります。これは、RDS SQL Serverの将来のアップデートで、ホストの交換後にサービスマスターキーを復元することでこれに対処するまでの一時的な回避策です。