MySQL(RDS)で運用していたシステムを、
AWSのAuroraに移行してエラーになった点があったのでノートを残しておきます。

ECサイトなどで、商品マスタなどを日次バッチ処理で切り替える時。
実体のテーブルは日ごとのテーブルを用意して、
サイト側のクエリにはviewを参照させることはよくあると思います。

SQLで書くと以下のような感じ。

2月13日のテーブル切り替え:

create table products_20160213(id integer, name varchar(255));
create or replace view products as select * from products_20160213;
drop table products_20160213;

2月14日のテーブル切り替え:

create table products_20160214(id integer, name varchar(255));
create or replace view products as select * from products_20160214;
drop table products_20160213;

このような処理をMySQL(マスター→リードレプリカ構成)で行っていたのものを、
Aurora(マスター/リードレプリカ構成)に置き換えたら、
テーブル切り替えのタイミングで以下のようなエラーが出るようになってしまいました。

Table 'products_20160213' doesn't exist

Auroraの説明を読むと、
『Amazon Aurora レプリカはソースインスタンスと基盤となるストレージを共有』
と書かれているので。

参考:
https://aws.amazon.com/jp/rds/aurora/

恐らく、

MySQLの場合:

  1. 変更前(products→products_20160213)
  2. マスターでビューを変更(products→products_20160214)
  3. マスターでテーブルを削除(products_20160213)
  4. (マスターから同期)リードレプリカでビューを変更(products→products_20160214)
  5. (マスターから同期)リードレプリカでテーブルを削除(products_20160213)

Auroraの場合:

  1. 変更前(products→products_20160213)
  2. マスターでビューを変更(products→products_20160214)
  3. マスターでテーブルを削除(products_20160213)
    = 共有しているストレージから削除
    = リードレプリカ側からも見えなくなる
  4. (マスターから同期)リードレプリカでビューを変更(products→products_20160214)

ということが起こっていて、
3〜4の間にビューが参照するテーブルが見つからなくなっているのだと思われます。

対処としては、
直前のテーブルではなく2世代前のテーブルをdropするよう変更すれば良いわけですが。
MySQLと同じように使えるとは言うものの、
どうしても、こういう微妙な違いはあるなぁと思いました。