1. はじめに
この記事では、
- DescribeConnectionsとTestConnectionの違い
- DescribeConnectionsだけでは接続状態が更新されない理由
- Step Functionsでのおすすめの接続監視方法
について紹介します。
2. 結論
DescribeConnectionsは、DMSが保持している現在の接続状態を取得するAPIです。
そのため、接続状態がfailedだった場合、DescribeConnectionsを何度実行しても接続状態は更新されません。
接続状態をリフレッシュさせたい場合、TestConnectionを実行して、Connection Statusをリフレッシュさせてあげる必要があります。
今回の接続障害に適応させた最終的な構成は以下のようになりました。
3. 前提
今回の構成では、Step FunctionsからDMSを利用し、データベースのデータをS3へ連携しています。
処理の流れは以下のようになっています。
DMSタスク開始前には、
- DMSレプリケーションインスタンス
- DMSエンドポイント
の接続状態を確認しています。
両方ともsuccessfulであることを確認できた場合のみ、DMSタスクを開始する構成なんです。
4. DescribeConnectionsだけでは接続状態は更新されない
DescribeConnectionsは、現在DMSが保持している接続状態を取得するAPIです。
つまり、DescribeConnectionsを実行しても、新たに接続テストが行われるわけではありません💦
例えば接続状態がfailedになっている場合、
このように、何度実行しても保持しているfailedを取得し続けます。
つまり、DescribeConnectionsは「状態を見るAPI」であり、「状態を更新するAPI」ではありません。
ちなみに私は、ここを勘違いしていました。
5. TestConnectionとは
TestConnectionは、DMSレプリケーションインスタンスからエンドポイントへ実際に接続テストを行うAPIです。
TestConnectionを実行すると、接続状態は一度testingとなり、その後、
successful-
failed
のどちらかへ更新されます。
イメージすると以下のようになります。
なので、接続状態を最新の状態へ更新したい場合は、TestConnectionを実行する必要があります。
6. Step Functionsでの構成例
DescribeConnectionsで状態を確認し、接続に問題がなければそのままDMSタスクを開始します。
一方で、接続状態がfailedだった場合は、TestConnectionを実行して接続テストをやり直します。
このように、DescribeConnectionsで状態を確認し、必要に応じてTestConnectionで状態を更新するという構成にすることで、より正しく接続状態を判断できます。
7. リトライ回数を持たせる
接続先DBが停止しているなどの理由で接続できない場合、TestConnectionを無制限に実行すると、Step Functionsが終了しなくなってしまいます。
そのため、リトライ回数を設けることをおすすめします。
一定回数接続できなかった場合は、異常終了とすることで不要なループを防ぐことができます。
8. まとめ
DescribeConnectionsとTestConnectionは似ていますが、役割は大きく異なります。
| API | 役割 |
|---|---|
| DescribeConnections | 現在保持している接続状態を取得する |
| TestConnection | 実際に接続テストを実行し、接続状態を更新する |
なので、
- DescribeConnections = 状態を見るAPI
-
TestConnection = 状態を更新するAPI
です。
そのため、Step FunctionsでDMS接続状態を監視する場合は、DescribeConnectionsだけを繰り返し実行するのではなく、必要に応じてTestConnectionを実行する構成が望ましいと考えています。
今回のケースでは、以下の流れが最もシンプルで分かりやすい構成になりました。
これにより、DMSが保持している古い接続状態に依存することなく、最新の接続状態を確認したうえでDMSタスクを開始できるようになったというわけです!