LoginSignup
2

More than 5 years have passed since last update.

Terraform + さくらのクラウド データベースアプライアンス

Last updated at Posted at 2016-08-23

先日、さくらのクラウドのマネージドRDBである、データベースアプライアンスがリリースされました。

これに対応してTerraform for さくらのクラウドにデータベースアプライアンス用のリソース(sakuracloud_database)を追加しています。

今回はデータベースリソース + Terraformの組み込みプロバイダであるPostgreSQLプロバイダの組み合わせ方をメモしておきます。

データベースの定義ファイル

定義は以下のようになります。

resource "sakuracloud_database" "db" {

    # 管理者(postgres)パスワード
    admin_password = "put_your_postgres_password"

    # デフォルトで作成されるユーザーの名前
    user_name = "put_default_user_name"

    # デフォルトで作成されるユーザーのパスワード
    user_password = "put_your_default_user_password"

    # 接続元ネットワークの制限を行う場合は以下のように記載します
    #allow_networks = ["192.168.0.0/24" , "192.168.1.1"] 

    # ポート番号(省略した場合5432が使われる)
    port = 5432

    # バックアップ世代数(1〜8)
    backup_rotate = 8
    # バックアップ開始時間
    backup_time = "00:00"

    # さくらのクラウド上でのリソース名称
    name = "database_name"
}

定義ファイル(tfファイル)の各項目についての詳細はGithub:データベースアプライアンスを参照ください。

[おまけ]PostgreSQLのユーザー、データベースを追加したい場合

さくらのクラウドでのデータベースアプライアンスでは、データベース作成時に指定したデフォルトユーザー名と同名のデータベースが作成されます。

デフォルトで作成されるものに加えてユーザーやデータベースを作成したい場合は以下のように
postgresqlプロバイダを用いると良いでしょう。

# postgresへの接続方法を定義
provider "postgresql" {
  host = "${sakuracloud_database.db.ipaddress1}" # ホスト名 or IPアドレス
  port = "${sakuracloud_database.db.port}"
  username = "postgres"
  password = "${sakuracloud_database.db.admin_password}"
  ssl_mode = "disable"
}

# ユーザー(ロール)定義
resource "postgresql_role" "myuser" {
  name = "myuser"
  login = true
  password = "put_your_user_password"
  encrypted = true
}

# データベース定義
resource "postgresql_database" "myuser" {
   name = "myuser"
   owner = "${postgresql_role.myuser.name}"
}

なお、ssl_modeについてですが、現状さくらのクラウドではPostgreSQLへのSSLでのクライアント接続には対応していないようですので、disabledを指定する必要がありました。
そのうち対応してくれると嬉しいですね!

[参考]データベース作成時にエラーが出る場合

これらの定義をterraform applyで適用しようとすると、以下のようなエラーが出ることがあります。

Error applying plan:

2 error(s) occurred:

* postgresql_database.myuser: Error granting membership: dial tcp ***.***.***.***:5432: getsockopt: connection refused
* postgresql_role.myuser: Error creating role: dial tcp ***.***.***.***:5432: getsockopt: connection refused

Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.

このエラーは、PostgreSQLサーバー側で接続準備ができていないために発生しているようです。
すこし時間を置いて実行すると上手くいきます。(通常は数分で接続可能になります)

[追記:Terraformモジュールを利用する場合]

GitHub上にデータベースアプライアンス用のTerraformモジュールを用意しました。

GitHub:データベースアプライアンス用Terraformモジュール

このモジュールを用いると、定義が以下のように書けます。
非常に簡潔に書けますね:bangbang:

module "db" {
    source = "github.com/terraform-for-sakuracloud-modules/postgresql-mini-shared"

    # 管理者(postgres)パスワード
    admin_password = "put_your_postgres_password"

    # デフォルトで作成されるユーザーの名前/パスワード
    user_name = "put_default_user_name"
    user_password = "put_your_default_user_password"
}

おわりに

現在はPostgreSQLしか利用できませんが、MariaDBにも対応予定のようです。
期待して待ちましょう!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2