https://d226lax1qjow5r.cloudfront.net/blog/blogposts/using-terraform-for-database-management/terraform_database-management_1200x600.png

データベース管理にTerraformを使う

最終更新日 May 26, 2021

所要時間:1 分

私たちがVonageで取り組んでいる最も重要な旅のひとつは、サイト信頼性エンジニアリング(SRE)の原則を用いたアジャイル・エンジニアリング組織への変革です。そしてそれは、私たちがほとんど 労力.

労働とは、手作業で、反復的で、自動化可能で、戦術的で、永続的な価値を持たず、サービスの成長に伴って直線的に拡大する傾向がある。

私たちは、オートメーションを使って、通常の労作をよりプロセス指向にする方法を常に模索している。

問題

私たちが定期的に行っている労務活動のひとつに、データベースの変更(スキーマの変更、問題解決のためのレコードのアドホックな変更、グラント管理など)があります。SREは、自動化のない世界では、データベースに直接関わるさまざまなエンジニアリングチームに対して、これらの変更に影響を与えるゲートキーパーだった。SREがボトルネックとなり、チームが十分に速く動くことができないこと、そしてデータベース上で実際に実行されたクエリの監査証跡がほとんどないことです。

このような問題を解決するために、私たちは次のような自動化を考え出す必要があった。

  • エンジニアがデータベース上で実行したいSQLを指定し、実行する(私たちはこれをプッシュプランと呼んでいます。)

  • 提出されたプッシュプランをチェックし、安全でない/悪意のある変更を阻止する。

  • 正規のソース(できればバージョン管理システム(VCS))で何が起きているかの監査証跡を維持する。

アプローチ

テラフォームは、私たちのクラウドインフラを管理するためにすでに大規模に稼働させていたので、私たちにとって素晴らしい選択でした。Terraformのよく見落とされがちな側面の1つは、ステートの管理に優れていることです。この機能を使い、私たちはエンジニアが宣言的でべき等な方法で必要な変更を指定し、自動化に任せたいと考えました。

もう一つの問題は、データへのアクセスだった。コンプライアンス上の理由から、Vonageのエンジニアはデータベースの認証情報をすぐに入手することはできません。私たちはすべての認証情報を、暗号化された方法で AWS SecretsManager.そのため、エンジニアはこれらにアクセスすることはできませんが、私たちのオートメーションは認証情報にアクセスすることができました。

最後に、エンジニアが指定したプッシュプランを安全に実行するためのランナーが必要だった。実際のチェックとプッシュプランの実行には、私たちのツールの多くが広く使われているPythonを使うことにしました。そして、パッケージ全体がJenkins上で実行され、データベースの変更を実行するためのアクセスをエンジニアリング組織全体に安全に民主化することができました。

An image as an overview of the lifecycle of a pushplan

コード

SQLプッシュプラン

実際のSQLプッシュプランには、古き良きYAMLを使った。誰かがDBに変更を加えたい場合、データベースクラスタの名前と実行したいSQLをこのように指定するだけだ:

---
cluster: dblocal_wdc4
sql: |
    USE config;
    ALTER TABLE mt_routing ADD COLUMN routeToRoutingGroupId VARCHAR(50) NULL DEFAULT NULL AFTER routeToTargetGroupId;

Terraformの のlocal-exec機能を使ってデータベースの変更を行うPythonスクリプトを実行しました:

resource "null_resource" "db_pushplan" {
  # This will rerun the pushplan if the file contents have been changed
  triggers = {
    hash = filebase64(var.pushplan_file)
  }

  provisioner "local-exec" {
    command = "pipenv run python ${path.module}/pushplan_executor.py -d ${var.db_host} -p ${var.db_port} -f ${var.pushplan_file}"

    environment = {
      db_username = var.db_username
      db_password = var.db_password
    }
  }
}

注意ログやbashの履歴に漏れないように、認証情報を環境変数としてスクリプトに渡すことが重要である。

パイソン

実際のプッシュプランの実行に使用したパイソン・スクリプトは、単に実行するだけではない。最初に、一連のチェックを行います:

  • プッシュプランで指定されたクラスタが有効であることを確認する

  • Pythonの sqlparseライブラリを使って、指定されたSQLが有効かどうかをチェックします。

  • SQLに許可されていないアクション(SELECT、GRANT、SHOW)が含まれている場合、その理由をユーザーに通知する前に失敗します。

  • 実際の SQL 文を安全に実行する:

    • 複数の更新がある場合、データベースに過負荷をかけないように、連続したステートメントの間はスリープする。

    • ALTERがある場合は gh-ostを使います。

結論

このツールには、まだいくつかの改良点がある。例えば

  • 使用方法 TerraformのMySQLプロバイダを使ってグラント管理を行う。このプロバイダを使うことで、エンジニアはアプリケーションごとに異なるデータベースユーザをより速く作成し、使うことができる。

  • 組み込み フライウェイをツールに組み込み、これがすべてのスキーマの正統な真実のソースとなるようにした。

  • エンジニアが、まず非プロダクトでの変更をカナリア/テストできるような、プロモ ーションメカニズムを構築する。正常に実行されていることが確認されれば、エンジニアはその変更をprodに昇格させることができる。

そして、もっとたくさんあるだろう。しかし、ベースとなるメカニズムセットを使って、この自動化をデータベース管理の他のすべての側面に拡張するための、良い土台ができた。

シェア:

https://a.storyblok.com/f/270183/400x405/8e68618392/avadhut-phatarpekar.png
Avadhut Phatarpekarヴォネージの卒業生