Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Aurora PostgreSQL のユーザー作成と 権限付与を Terraform で自動化する

Aurora PostgreSQL のユーザー作成と 権限付与を Terraform で自動化する

Platform Engineering LT会〜開発者体験を支える仕組みと実践〜
2026/10/22(木) 12:00 - 13:00

株式会社estie 技術戦略室 SRE
島田 健人(@hitsumabushi845)

Avatar for estie | エスティ

estie | エスティ

October 21, 2026

More Decks by estie | エスティ

Other Decks in Technology

Transcript

  1. 課題 Terraform を実行する Runner から DB に疎通しない GitHub Actions Runner

    Terraform を実行する 疎通しない VPC Private Subnet Aurora PostgreSQL DB と疎通できるネットワークに Self-hosted Runner を置けば届く しかし、初期設定のためだけに Runner を構築・運用するのは、さすがにコストが重すぎる © 2026 estie, Inc. 3
  2. Before クラスタを作った後の手作業があった 1 · Terraform 2 · 手作業 3 ·

    手作業 4 · 手作業 Aurora クラスタを作成す る ECS コンテナをプロキシ として作り、ローカルか ら接続 ユーザーの作成、権限付 与、データベースやスキ ーマの作成など 作成したユーザーのパス ワードをSSMやSecrets Manager へ保存 terraform apply プロキシ経由で接続 クエリを手で実行 パスワードを格納 プロダクトのインフラを追加するたびに毎回この作業が発生していた 工数 リスク © 2026 estie, Inc. プラットフォームチームの工数が(地味に)浪費される 手作業なので、設定漏れやオペレーションミスのリスクがある 4
  3. 今回やったこと terraform apply でユーザー作成と権限付与まで行う terraform apply モジュール側 terraform_data + local-exec

    apply 中にコマンドを実行 apply 時に、モジュールが用意した初期化 SQL を実行する © 2026 estie, Inc. RDS Data API (HTTPS) Aurora PostgreSQL 利用側 SQL ファイルを置くだけ。適切なユーザーで実行される 5
  4. 仕組み 1 RDS Data API は AWS の API 経由で

    SQL を実行できる AWS GitHub Actions Runner AWS の API を呼ぶ HTTPS RDS Data API VPC Private Subnet Aurora PostgreSQL DB そのものにネットワーク的な疎通がなくても、AWS の API を実行できれば SQL を流せる クラスタ側は enable_http_endpoint を有効にするだけ © 2026 estie, Inc. 6
  5. 仕組み 1 RDS Data API 経由で SQL を実行する terraform_data の

    local-exec が scripts/exec_sql.sh を呼び、スクリプトが SQL ファイルを 1 文ずつ aws rds-data execute-statement で実行する 認証には、SQL を実行するユーザーの認証情報を Secrets Manager から渡す(--secret-arn) (抜粋) main.tf scripts/exec_sql.sh resource "terraform_data" "db_master_setup" { provisioner "local-exec" { while IFS= read -r stmt; do aws rds-data execute-statement \ command = local.exec_sql_script environment = { --resource-arn "$DB_ARN" \ --secret-arn "$SECRET_ARN" \ SQL_FILE = local.master_init_sql_path # DB_ARN / SECRET_ARN } なども渡す --database "$DB_NAME" \ --sql "$stmt" ... done < <(split_sql "$SQL_FILE") } } © 2026 estie, Inc. 7
  6. 再実行 SQL ファイルか password_version が変わったら SQL を再実行する # terraform_data "db_master_setup"

    triggers_replace = { file = filesha1(local.master_init_sql_path) password_versions = local.password_versions } SQL ファイルを変えた ハッシュが変わり、SQL 全体を再実行する © 2026 estie, Inc. password_version を上げた パスワードを再生成し、ALTER USER で DB 側も更新する 8
  7. 仕組み 2 変更のたびに SQL 全体を流し直すので、冪等にする PostgreSQL の CREATE USER には

    IF NOT EXISTS がない。 → 同じ動きをする関数を CREATE OR REPLACE で定義し、CREATE USER IF NOT EXISTS の代わりに使う CREATE OR REPLACE FUNCTION create_user_with_password(p_user text, p_pass text) 表示用に改行。実ファイルは 1 行 RETURNS void LANGUAGE plpgsql AS $fn$ BEGIN EXECUTE format($q$CREATE USER %I LOGIN PASSWORD %L$q$, p_user, p_pass); EXCEPTION WHEN duplicate_object THEN EXECUTE format($q$ALTER USER %I PASSWORD %L$q$, p_user, p_pass); END; $fn$; ユーザー なければ作成、あればパスワード更新 © 2026 estie, Inc. ロール create_role: あれば何もしない 拡張 CREATE EXTENSION IF NOT EXISTS 9
  8. 利用側 利用側は SQL ファイルを置くだけ sql/master_init.sql SELECT create_user_with_password( 'myapp_app', :app_password); GRANT

    USAGE, CREATE ON SCHEMA public TO myapp_app; SELECT create_user_with_password( 'myapp_migration', :migration_password); © 2026 estie, Inc. パスワードの流れ ephemeral の random_password で生成する ephemeral: 値を plan や state に保存しない Terraform の 仕組み SSM Parameter Store に書き込み専用属性で保存 する Data API の --parameters で :<ユーザー名 >_password として渡す 10
  9. ハマりどころ SQL の書き方とインスタンスタイプに制約がある SQL は 1 文ずつ送る 行末の「;」で文を区切り、execute-statement を 1

    文ずつ呼ぶ。$$ で囲む関数本体の途中に行末 ; を置けないので、 関数定義は 1 行で書く db.t 系のインスタンスでは Data API が使えない 初期構築だけ db.t 系以外で行い、構築後は db.t 系に下げてコストを抑えられる 注意: 下げた後に SQL を変えたり password_version を上げたりすると、apply が失敗する。 再度 SQL を流すには一時的に db.t 系以外へ戻して apply すればよい。 © 2026 estie, Inc. 11
  10. まとめ ユーザー作成と権限付与まで terraform apply で完結する仕組み RDS Data API: 接続経路なしで、apply から

    SQL を実行する 冪等な SQL: 何度再実行しても同じ状態に収束させる 12
  11. Appendix 参考文献 How to run SQL scripts against the RDS

    Data API with Terraform Advanced Web Machinery / 2022-06-29 https://advancedweb.hu/how-to-run-sql-scripts-against-the-rds-data-api-with-terraform/ Terraform + Aurora Data APIでDBユーザー作成をIaC化した話 Timee Product Team Blog / 2026-03-30 https://tech.timee.co.jp/entry/2026/03/30/155108 © 2026 estie, Inc.