AWS DynamoDB の Blue Green デプロイメント

2025/01/19に公開

こんにちは🐦

株式会社 Tsuzucle SPRING 開発事業部にフリーランスインフラエンジニアとして参画している はらしゅん です。

今回は案件で AWS DynamoDB の Blue/Green デプロイメントを用いた更新方法を実装しました。
その更新方法を採用するに至った過程と方法について、ご紹介したいと思います。

要件

約6万件もの住所マスター情報を DynamoDB に保持し、Shopify が Lambda を介して参照するというアーキテクチャでした。

この約6万件の住所マスター情報は、不定期に大元の情報が更新され、CSV 連携されてきます。
新規追加される住所情報もあれば、更新される住所情報、削除される住所情報もあります。

そして、ポイントは変化の無い住所情報も含んできます。

つまり、変化の有無を問わず、約6万件の住所マスター情報が毎回連携されます。

最初の案「Insert 方式」

約6万件の新住所マスター情報 CSV が S3 に Put されたことをトリガーに、
Lambda が発火し、DynamoDB 上の情報を新規追加/更新/削除させれば良いと考えました。

「Insert 方式」の問題点

しかしながら、試作をしてみて、以下の3つの問題に直面し、採用することはリスキーだと感じました。

問題1:Lambda の稼働制限時間15分内に DB 更新処理が間に合わないリスク

問題2:DynamoDB の読み込み/書き込み負荷が急激にスパイクしてしまう

問題3:更新処理中は新旧の情報が混在することになる

そのため、我々は別の案を模索することにしました。

2番目の案「インプレースアップデート方式」

約6万件の新住所マスター情報が S3 に Put されたことをトリガーに、
Lambda が発火し、[既存 DynamoDB 削除] -> [新 DynamoDB 作成] -> [データ挿入(bulk insert)]という処理を試作してみたところ、最初の案よりは、短い時間で新 DynamoDB をデプロイしることができました。

「インプレースアップデート方式」の問題点

しかしながら、[既存 DynamoDB 削除] -> [新 DynamoDB 作成] -> [データ挿入(bulk insert)]というこの一連の処理に5分前後かかり、運悪くその間にアプリケーション側で DynamoDB 上の住所情報を参照しようとすると・・当然エラーとなってしまいます。

メンテナンスウィンドウを設ければ良いではないか、と思われた方もいるかもしれませんが、

・この大元からの更新情報 CSV は不定期に送られてくる
・メンテナンスウィンドウを告知、解除する手間を省きたい(なるべく自動的に更新してほしい)

ため、メンテナンスウィンドウを設けたくはなく、この案も不採用にしました。

最終的に採用した案「Blue/Green 方式」

そして我々が最終的に採用した案は、Blue/Green 2種類の DynamoDB を用意し、

・住所情報参照 Lambda
・次期 DynamoDB 作成 Lambda

は、それぞれ AWS System Manager Parameter Store 上のフラグを見て、

『自分がいま住所情報を参照すべき DynamoDB はどちらなのか』
『自分が次のアップデート時に、情報更新する DynamoDB はどちらなのか』

を判断させるようにしました。

次回更新情報 CSV が連携されてきた際には、
Green 系に次期住所データ情報が挿入され、

データ更新処理が完了後、

・「アプリケーションが使用する DynamoDB を指定する」フラグ
  と
・「次期更新情報が挿入される待機系 DynamoDB を指定する」フラグ

を入れ替える

というアーキテクチャにしました。

そしてこのフラグには AWS System Manager Parameter Store を使用しました。

AWS System Manager Parameter Store は、それまでアプリケーションの設定データ(データベース接続文字列, API エンドポイント, 環境変数, アプリケーション設定パラメータ etc ..)としてしか利用したことがなく、フラグとして利用するのは初挑戦だったのですが、これまでのところ問題なく稼働しており、今後も採用できそうな場面があれば選択肢の1つとしたいと思いました。

最終的にこの案を採用したことにより、当初検討していた案1および案2で懸念されていた『更新時のダウンタイム発生』という課題を解消することができました。

株式会社Tsuzucle Tech Blog

Discussion