Auroraの負荷検証、S3 ReplicationでFirehose出力を複製するだけで足りた

  • AWS
  • Aurora
  • S3
  • Firehose

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

Auroraにインデックスやパーティションを追加するとき、本番相当のデータ量で負荷を確認したくなることがある。でも本番環境には触りたくないし、Firehoseの設定もアプリの実装も変えたくない。

今のデータフロー

flowchart TD
  A[API Gateway] --> B[Firehose] --> C["S3(CSV)"] --> D[Lambda] --> E[Aurora]

  classDef gateway fill:#E8EAF6,stroke:#3F51B5,color:#1A237E
  classDef ingest fill:#E3F2FD,stroke:#1976D2,color:#0D47A1
  classDef storage fill:#E8F5E9,stroke:#388E3C,color:#1B5E20
  classDef compute fill:#FFF3E0,stroke:#F57C00,color:#E65100
  classDef database fill:#FCE4EC,stroke:#C2185B,color:#880E4F

  class A gateway
  class B ingest
  class C storage
  class D compute
  class E database

課題

  • 本番環境に影響を与えたくない
  • Firehoseの設定は変更したくない
  • アプリ側の実装変更も避けたい

この制約の中でAuroraだけを検証対象にする方法を考えた。

採用した方式:S3 Replication

FirehoseがCSVを吐き出すS3バケットに対してS3 Replicationを設定して、検証環境のバケットに複製する。複製先には別のLambdaとAuroraを用意して、同じS3 → Lambda → Auroraのパイプラインを再現するだけ。

flowchart TD
  subgraph Prod["本番"]
    direction TD
    A[API GW] --> B[Firehose] --> C["S3(Prod)"]
  end

  subgraph Shadow["検証"]
    direction TD
    D["S3(Shadow)"] --> E["Lambda(Shadow)"] --> F["Aurora(Shadow)"]
  end

  C -->|S3 Replication| D

  classDef gateway fill:#E8EAF6,stroke:#3F51B5,color:#1A237E
  classDef ingest fill:#E3F2FD,stroke:#1976D2,color:#0D47A1
  classDef storage fill:#E8F5E9,stroke:#388E3C,color:#1B5E20
  classDef storageShadow fill:#E0F2F1,stroke:#00796B,color:#004D40
  classDef compute fill:#FFF3E0,stroke:#F57C00,color:#E65100
  classDef database fill:#FCE4EC,stroke:#C2185B,color:#880E4F
  classDef prodBox fill:#F5F7FF,stroke:#3F51B5,color:#1A237E
  classDef shadowBox fill:#F1FAF9,stroke:#00796B,color:#004D40

  class A gateway
  class B ingest
  class C storage
  class D storageShadow
  class E compute
  class F database
  class Prod prodBox
  class Shadow shadowBox

API GatewayやFirehoseの挙動は経路に含まれないので、Aurora単体の性能だけを見れる。ファイルサイズやレコード数、データ分布も本番のFirehoseが生成したものそのままなので、本番相当のデータで検証できる。

運用

Replication RuleはデフォルトDisabledにしておいて、検証したいときだけEnabledにする。終わったらまたDisabledに戻す。ルール自体は消さずに残しておけば、次回もすぐ使い回せる。

注意点

  • Disabledの間に作られたオブジェクトは、再度Enabledにしても自動では複製されない。過去分が必要ならバッチコピーとかで別途持ってくる必要がある
  • 検証用Auroraは本番とは完全に別クラスターにする。インデックス追加やパーティション変更みたいな負荷の高い試験を安全にやるため

結論

Auroraの負荷検証がしたいだけなら、APIレベルでShadow Trafficを流す必要はなかった。S3 ReplicationでFirehoseの出力結果を複製環境に流し込んで、S3 → Lambda → Auroraを再実行するだけで十分だった。