Terraform Cloud SQLの作成

2019.10.20 (日)

Cloud SQLはVMインスタンスなどとちょっと勝手が違うので備忘録的なメモ。
TerraformのAPIのDocumentはこちら。
google_sql_database_instance

正しい書き方にも関わらず以下のようなエラーが出るときがあります。

Error: Error, failed to create instance master-instance: googleapi: Error 403: Cloud SQL Admin API has not been used in project xxxxxxxxxxxx before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview?project=493947604288 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry., accessNotConfigured

プロジェクトxxxxxxxxxxxxでCloud SQL Admin APIが使用されていないか、無効になっています。 https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview?project=xxxxxxxxxxxxにアクセスして有効にしてから再試行してください。 このAPIを最近有効にした場合は、アクションがシステムに反映されるまで数分待ってから再試行してください。

ということで、Cloud SQL Admin APIにアクセスして、認証情報を取得します。おそらくDBなので、GCPのプロジェクトアクセスのクレデンシャルとは別にDB専用のクレデンシャル情報がないとダメだってことですね。


認証情報の手続きは特に何もなく「有効にする」ボタンを押すだけで、完了です。認証情報も以下のような簡素なものになります。

名前: Cloud SQL Admin API
提供者: Google
サービス名: sqladmin.googleapis.com
概要: API for Cloud SQL database instance management
有効化のステータス: 有効

cloudsql.tfを書く

これでもう一度terraformを実行してみます。実行する内容は以下のようになります。最もミニマムなもの。(ここでは、クレデンシャル情報などの
設定は先に済ませてあること前提になってます。)
今回はPostgreSQLを作成しています。

# cloudsql.tf
resource "google_sql_database_instance" "master" {
  name = "master-instance"
  database_version = "POSTGRES_9_6"
  region = "us-central1"

  settings {
    # Second-generation instance tiers are based on the machine
    # type. See argument reference below.
    tier = "db-f1-micro"
  }
}

terraform planまたはterraform applyを実行してください。
データベース作成に20分近くかかったのだけど、大丈夫だろうかというぐらい時間がかかります。

パラメータ

database_version

Default: MYSQL_5_6
MYSQL_5_7
POSTGRES_9_6
POSTGRES_11
MYSQL_5_5

lockの解決方法

稀にロックされることがあります。

Error: Error locking state: Error acquiring the state lock: resource temporarily unavailable
Lock Info:
  ID:        xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  Path:      terraform.tfstate.d/product/terraform.tfstate
  Operation: OperationTypeApply
  Who:       username@F001-000xx.local
  Version:   0.12.9
  Created:   2019-10-20 16:41:26.659291 +0000 UTC
  Info:      


Terraform acquires a state lock to protect the state from being written
by multiple users at the same time. Please resolve the issue above and try
again. For most commands, you can disable locking with the "-lock=false"
flag, but this is not recommended.

巷の情報ではforce-unlockを使って実行すればロックが解除されるとあるのですが、私の場合は以下のようなエラーで解除できませんでした。

$ terraform force-unlock xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Local state cannot be unlocked by another process

本番環境などを運用中に際しては実用的ではありませんが、作成したDBをいったん削除してから上記コマンドを実行します。そうするとなんか治る。