DeploymentManagerを利用したCloud SQLの作成
サマリー
やりたいこと
- GCPのDeploymentManager を使ってCloudSQLも一連の自動化の処理として作成したい。(別にgcloudコマンドやRESTでも別にいいんですが)
結論
- DeploymentManagerを利用してCloudSQLの作成/削除ができるようになった
ハマったこと
- YAMLの例が少ない
- ユーザの権限情報を作成しないとdeploymentManagerで削除できない
- インスタンス名がすぐには使いまわせない
手順
前提
CloudSQLとしての対象は
- Cloud SQL for MySQL : MySQLベース
-
Cloud SQL for PostgreSQL : PostgreSQLベース
がありますが、前者のMySQLベースを対象とします。
また、Cloud SQL for MySQL内でも第1世代と第2世代の違いがあります。
基本的に性能がよいとされる第2世代を対象とします。
また以下の条件を満たしているものとします。
- GCP上にプロジェクトがある
- プロジェクトでCloudSQLが作成できる権限がある(課金設定など)
まだの場合は公式のクイックスタートの手順に従って構築します。 - 操作端末には
gcloud
コマンドが導入されている
GCPコンソールからのインスタンスの作成方法(確認)
ここでは事前準備がきちんとされているかをGCPコンソールからCloudSQLを作成することで確認します。確認ができているのであれば飛ばして構いません。
- インスタンス作成ページへ移動
- プロジェクトを選択し、
続行
をクリックします。 -
インスタンスを作成
をクリックします。 - エンジンの選択で、MySQLの
第 2 世代
を選択された状態でMySQLを選択
をクリックします。 - ユースケースの選択で(検証目的なので)
MySQLの開発の設定
をクリックします。 - MySQLの設定を実施します。
- インスタンスID※
- rootパスワード
- リージョン
- asia-northeast1(なんとなく日本)
- マシンタイプとストレージ
- SSD -> HDD(貧乏性なので…)
-
作成
をクリック
※簡単に作れて、簡単に消せますが、なぜかインスタンス名は最長1週間は使いまわせないとのことなので、本番用の名前は最後まで取っておきましょう。
DeploymentManageでのインスタンスの作成方法
ここから本題。deployment-managerでも作れます。
まず下記のcloudsql.yml
とcloudsql.jinja
を作成し、同一ディレクトリに保存します。
念のために書いておきますが、ファイル名は任意です。ただし、jinjaはymlが参照するのでそこは注意しましょう。
# cloudsql.yml
imports:
- path: cloudsql.jinja
resources:
- name: mysql5-6
type: cloudsql.jinja
properties:
instanceName: mysql5-6
region: asia-northeast1
tier: db-n1-standard-1
databaseVersion: MYSQL_5_6
dataDiskType: PD_HDD
dataDiskSizeGb: 70
userName: <DB接続ユーザ名>
password: <DB接続パスワード>
# cloudsql.jinja
resources:
- name: {{ properties["instanceName"] }}
type: sqladmin.v1beta4.instance
properties:
backendType: SECOND_GEN
region: {{ properties["region"] }}
databaseVersion: {{ properties["databaseVersion"] }}
instanceType: CLOUD_SQL_INSTANCE
settings:
tier: {{ properties["tier"] }}
dataDiskType: {{ properties["dataDiskType"] }}
dataDiskSizeGb: {{ properties["dataDiskSizeGb"] }}
- name: {{ properties["userName"] }}
type: sqladmin.v1beta4.user
properties:
instance: $(ref.{{ properties["instanceName"] }}.name)
password: {{ properties["password"] }}
host: "cloudsqlproxy~%"
設定ファイルの準備ができたら下記のようにDeploymentManagerを実行します。
$ gcloud deployment-manager deployments create <deploymentManager上の名前> --config cloudsql.yml
以上!
ちなみに削除したい場合は以下。コンソールからも削除できます。
$ gcloud deployment-manager deployments delete <deploymentManager上の名前> -q
最後の-q
オプションは削除確認しないためのものです。
ハマったこと
YAMLの例が見つからない
探し方が悪いのだろうけど見つけられなかった。
GoogleのResourceの例を参照しながら試行錯誤。
あれ、REST用のJSONの例なので試行錯誤。
できたのが↑のYAML。他にも色々パラメータはあるので必要に応じて設定しましょう。
ユーザの権限情報を作成しないとdeploymentManagerで削除できない
どうもdeploymentManagerでの操作時に必要なパラメータが揃っているかをチェックされるみたいなのですが、ユーザの権限情報についてなしでも作成できるのに削除時にはユーザの権限情報が必須と怒られる。
ここでのユーザはあくまでdeploymentManagerの構成情報としてのものなので、後からCloudSQLのコンソールから追加しても関係ない。バグじゃないのか
ということで
host: "cloudsqlproxy~%"
を忘れないようにしましょう。
インスタンス名がすぐには使いまわせない
試行錯誤のために作っては削除し、ってやりたかったんですがインスタンス名がそのままだと既に使われている旨のエラーが出ます。
公式ページによると
削除したインスタンスのインスタンス名は、削除してから最大 1 週間は再利用できません。
とのことで、即座に使える保証はないとのことです。
「本番はこの名前で!」とか決まっているのであればちゃんと動作検証終わるまでは使わないようにした方がいいかもです。