Slide 1

Slide 1 text

意外と難しい? DBエンジンアップグレードとIaCの両立 Thursday, March 21, 2024 Haruka Sakihara JAWS-UG SRE支部 #8 春のAurora祭り

Slide 2

Slide 2 text

自己紹介 Haruka Sakihara <主な取得資格> • ネットワークスペシャリスト試験(IPA) • AWS Certified 全12資格 <所属> • アクセンチュア株式会社 テクノロジー コンサル ティング本部 (2021年新卒入社) • クラウドの部署にいます <趣味> • Go言語が好きです • フィギュアスケートとサンリオも好きです <その他表彰> • 2023 Japan AWS Jr.Champion 選出

Slide 3

Slide 3 text

メジャーバージョンアップグレードなんて簡単? ダウンタイム発生に伴うメンテナンス期間周知や、アプリ側でのクエリ改修など事前準備で考慮する 必要のある箇所はたくさんありますが、データベースのバージョンを上げる作業自体はコマンド実行 だけで済むから簡単では?と思う方もいるかもしれません。 バージョンアップ 担当者 DB (例) PostgreSQL コマンド打つだけでできるなんて 簡単じゃん! $ aws rds modify-db-instance ¥ --db-instance-identifier myDBInstance ¥ --engine-version 15.5 ¥ --allow-major-version-upgrade ¥ --apply-immediately

Slide 4

Slide 4 text

Q. IaCコードを置き去りにしないためにはどうする? しかし、多くの商用環境ではインフラ構成をIaC化していることがほとんどかと思います。 IaCを使って構築していたDBに対してaws rdsコマンドを使ってメジャーバージョンアップデートを してしまうと、IaCコード定義記載のDBバージョンと実際のDBバージョンでずれが生じてしまいま す。 バージョンアップ 担当者 !!!! $ aws rds modify-db-instance ¥ --db-instance-identifier myDBInstance ¥ --engine-version 15.5 ¥ --allow-major-version-upgrade ¥ --apply-immediately version 15.5 (new) version 12.11 (old) IaCコード 実物とIaCの間で バージョン乖離が発生 DB (例) PostgreSQL

Slide 5

Slide 5 text

作業開始前の状態 作業開始前の状態として、DBがIaCコードの管理化にあることとします。 このときのIaCコードのインフラ構成の定義には、旧バージョンのDBインスタンスと旧バージョン用 のパラメータグループが含まれています。 バージョンアップ 担当者 DB • DB instance (version 12.11, old) • DB parameter group (for version 12.11, old) IaCコード version 12.11 (old)

Slide 6

Slide 6 text

手順1: DBインスタンスをIaC管理化から外す まずは、DBインスタンスをIaCコードの管理化から外します。 実物のインスタンスは残したままIaC離脱を行うためには、CFnの場合はDeletion Policy: Retainを 付けてデプロイ・Terraformの場合はstate rmを行うこととなります。 バージョンアップ 担当者 DB • DB instance (version 12.11, old) • DB parameter group (for version 12.11, old) IaCコード version 12.11 (old) • CFnの場合: Deletion Policy: Retainでのデプロイ • Terraformの場合: terraform state rmの実行

Slide 7

Slide 7 text

手順2: 新バージョンのパラメータグループの作成 次に、新バージョンのデータベースに利用するパラメータグループをIaC管理化のもと作成します。 バージョンアップ 担当者 DB • DB parameter group (for version 12.11, old) • DB parameter group (for version 15.5, new) IaCコード version 12.11 (old) Deploy

Slide 8

Slide 8 text

手順3: CLIでのバージョンアップデート実施 パラメータグループができたところで、バージョンアップデートに必要なリソースがそろいます。 CLIの引数で新パラメータグループの利用を指定しながら、メジャーバージョンアップデートを実施 します。DBにアクセスするアプリ側の動確もこのタイミングで行うことになります。 バージョンアップ 担当者 DB • DB parameter group (for version 12.11, old) • DB parameter group (for version 15.5, new) IaCコード $ aws rds modify-db-instance ¥ --db-instance-identifier myDBInstance ¥ --engine-version 15.5 ¥ --db-parameter-group-name new_group_name ¥ --allow-major-version-upgrade ¥ --apply-immediately version 15.5 (new)

Slide 9

Slide 9 text

手順4:新バージョンDBをIaC管理下に戻す DBバージョンアップデートができた段階で、IaCコード側に新バージョンのDB定義を書き加えます。 ただし、今回は新しいDBインスタンス実体を作りたいわけではないので、このIaCコードをそのまま デプロイすることはできません。既存リソースをIaC管理下に戻すという動作のため、リソースイン ポート作業を行うこととなります。 バージョンアップ 担当者 DB • DB instance (version 15.5, new) • DB parameter group (for version 12.11, old) • DB parameter group (for version 15.5, new) IaCコード • CFnの場合: CloudFormation Stack Importの実行 • Terraformの場合: terraform importの実行 Import version 15.5 (new)

Slide 10

Slide 10 text

手順5: 不要な旧パラメータグループを削除 最後に、バージョンアップに伴って不要になった旧パラメータグループを削除します。パラメータグ ループは一貫してIaC管理下にある状態なので、普通にデプロイを行うだけでOKです。 バージョンアップ 担当者 DB • DB instance (version 15.5, new) • DB parameter group (for version 12.11, old) • DB parameter group (for version 15.5, new) IaCコード Deploy version 15.5 (new)

Slide 11

Slide 11 text

作業完了 IaC管理下へのリソースインポートを駆使することによって、IaCコードと実際のDBの間でバージョ ン差異が生まれないようにアップデートをすることができました。 バージョンアップ 担当者 DB • DB instance (version 15.5, new) • DB parameter group (for version 15.5, new) IaCコード version 15.5 (new) 実物とIaCの間で バージョン一致

Slide 12

Slide 12 text

めでたしめでたし

Slide 13

Slide 13 text

めでたしめでたし ……ではない!

Slide 14

Slide 14 text

あなたの扱うDBはIaC importできますか? Terraformは比較的マイナーなリソースに対しても抜けなくimport手段が整備されているような印象 を受けますが、CFnの場合は一部Stack Importに対応していないリソースがあることも事実です。 IaCの機能評価では「自分たちが扱いたい種別のリソースデプロイに対応しているかどうか」に目が 行きがちですが、「既存リソースのimportができるかどうか」もよく見ておきましょう。 CloudFormation Stack Importの対応状況 • 対応済 • AWS::RDS::DBCluster • AWS::RDS::DBInstance • AWS::Redshift::Cluster • AWS::OpenSearchService::Domain • AWS::Neptune::DBCluster • (余談)昔import対応していないときのメジャーバージョンアップデートで苦労した思い出…… • AWS::MemoryDB::Cluster • 未対応 • AWS::ElastiCache::CacheCluster • AWS::DocDB::DBCluster 参考文献: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html

Slide 15

Slide 15 text

Thank You ご意見、ご質問ありましたらお気軽にご連絡下さい [email protected] Haruka Sakihara(崎原 晴香)