Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

先日、さくらのクラウドのマネージド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にも対応予定のようです。
期待して待ちましょう!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした