Techioz Blog

新しいデータベース列を使用した Blue-Green デプロイ中に「ActiveModel::UnknownAttributeError」を処理する方法は?

概要

Blue-Green デプロイメントを使用しています。これは、リリース中に古いコードと新しいコードを含むコンテナーが数秒ではなく 1 ~ 10 分間一時的に共存することを意味します。

リリース中には、既存のテーブルに新しい列を追加するための移行が含まれています。これにより、古いコンテナ内で実行されるコードでエラーが発生します。

attributes = MyTable.find(X).attributes
MyTable.create!(attributes)
=> ActiveModel::UnknownAttributeError unknown attribute 'xxx' for MyTable

古いコンテナーのスキーマ キャッシュには、新しく追加された列に関する情報が含まれていません。このコードは、属性メソッドを使用するときに、スキーマ キャッシュではなくデータベースから情報を取得します。この情報には新しい情報が含まれます。

Blue-Green デプロイメントを維持しながら ActiveModel::UnknownAttributeError を回避する方法はありますか?このソリューションは、null 以外の列を追加する場合でも機能するはずです。申請手続きや解除手続きの変更はどちらも受け付けます。

解決策

Rails は、サーバーの起動時にデータベース スキーマとそのテーブル定義を読み込みます。つまり、新しく追加された列を使用するコードをデプロイする前に、データベースを移行する必要があります。

デプロイメント設定に応じて、最も安全な方法は、最初にデータベース移行をデプロイし、次に新しいモデルをデプロイすることです。または、アプリサーバーが新しいコードで起動される前にデータベースの移行が実行されるようにする必要があります。