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

先日、さくらのクラウドのマネージドRDBである、[データベースアプライアンス](http://cloud-news.sakura.ad.jp/database/)がリリースされました。

これに対応して[Terraform for さくらのクラウド](https://github.com/yamamoto-febc/terraform-provider-sakuracloud)にデータベースアプライアンス用のリソース(`sakuracloud_database`)を追加しています。

今回はデータベースリソース + Terraformの組み込みプロバイダである[PostgreSQLプロバイダ](https://www.terraform.io/docs/providers/postgresql/index.html)の組み合わせ方をメモしておきます。

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

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

```tfファイル(データベース定義)
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:データベースアプライアンス](https://github.com/yamamoto-febc/terraform-provider-sakuracloud/blob/master/docs/configuration/resources/database.md)を参照ください。

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

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

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

```tfファイル(PostfreSQLプロバイダ)
# 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`で適用しようとすると、以下のようなエラーが出ることがあります。

```terraform_DB作成時エラー表示
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モジュール](https://github.com/terraform-for-sakuracloud-modules/postgresql-mini-shared)

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

```tfファイル(データベース定義)
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にも対応予定のようです。
期待して待ちましょう！