コネヒト開発者ブログ

コネヒト開発者ブログ

AWS Step FunctionsのRestoreDBClusterFromSnapshotだけではクラスタに紐づくインスタンスは作成されない

こんにちは、インフラエンジニアのささしゅう(@sasashuuu)です。

本日は、Step Functionsを用いてデータの同期更新システムを構築した際に少しだけハマったポイントについてご紹介です。

Step Functionsとは

Step FunctionsとはAWSの各種サービスを組み合わせた一連の処理の自動化などがローコードで行えるAWSのサービスです。

aws.amazon.com

弊社でも過去にいくつかStep Functionsを使用した導入事例を記事にしているので、もしご興味があればご覧ください。いくつかピックアップしておきます。

tech.connehito.com tech.connehito.com tech.connehito.com

やりたかったこと

前述したように、Step Functionsのワークフローを用いてデータの同期更新をするシステムを構築していました。その過程で同期元のRDSのスナップショットからAuroraクラスタおよびそれに紐づくインスタンスを復元しようとワークフローを組んでいました。

以下はそのフローの一部分です。

ここでは、DescribeDBClusterSnapshotsのステートで処理を実行し、取得したスナップショットの識別子を元にRestoreDBClusterFromSnapshotのステートでクラスターおよびクラスタに紐づくインスタンスを復元しようとしていました。

しかし、待てど暮らせどインスタンスは現れてくれません…。

以前検証のためにコンソールからスナップショットを使用して、クラスターの復元をおこなったことがありました。その際は対象のスナップショットの画面から「アクション」>「スナップショットを復元」>「DBクラスターを復元」で「えいっ、ポチッ」とやればインスタンスも丸っと綺麗に復元できたんだけどな…。(※以下、オペレーション時のイメージのキャプチャ)

今回Step Functions上で同じようなことを再現したかったのですが、どうもうまくいきません。

何が起こっていたか

結論、叩くAPIが足りていませんでした。

Step Functions上でRDSのスナップショットからの復元という要件を満たすには、RestoreDBClusterFromSnapshotとはまた別のステートでインスタンス作成を行う処理が必要でした。

前述したAWSコンソールからの実行時の例では「DBクラスターを復元」というsubmitボタンを押下した後、裏でよしなにクラスターの作成とインスタンスの作成のAPIの実行が両方走っていたのです。コンソールから「DBクラスターを復元」を実行した際に実行されるAPIは次の通りです。

この辺りは実行後、Cloud Trailのログなどを見るとよくわかります。

やらなければいけなかったこと

下記のようにワークフローを修正すれば良いです。

CreateDBInstanceのステートを追加しました。

これで晴れて、クラスターおよびインスタンスを含めスナップショットからの復元を行うことができます。

補足

上記の挙動は公式ドキュメントにも明記されていました。

コンソールを使用して DB クラスターを復元する場合、Amazon RDS は自動的に使用する DB クラスターのプライマリインスタンス (ライター) を作成します。RDS API を使用して DB クラスターを復元する場合は、DB クラスターのプライマリインスタンスを明示的に作成する必要があります。

docs.aws.amazon.com

現時点では、コンソールを使用したオペレーション時のみプライマリインスタンスを作成する挙動となっているようです。

今回はStep Functionsを用いたスナップショットからのRDS復元時に少しだけハマったポイントについてご紹介しました。また、ハマりポイントの小ネタなどがあれば更新しようと思います