こんにちは。フューチャーアドベントカレンダーの15日目のエントリーです。昨日は、javasparrowさんのpygame2で1からゲームUIを作る!でした。この記事を書くにあたり、何個かネタ選びをしましたが、なんだかんだ腑に落ちたことを書いていきます。
Cloud SQLとGCEインスタンスを接続する方法
Cloud SQL Proxyを使うとき、こちらの公式ドキュメントにあるような方法が検索すると多く使われているようです。こちらの方法を簡単にまとめると
- Cloud SQL Proxy専用のサービスアカウントを払い出す
- サービスアカウントの秘密鍵をJSONで発行する
- Cloud SQL Proxyを動かすインスタンスに上記で生成した秘密鍵を埋め込む
となります。今回、Cloud SQL Proxyの設定をAnsibleで行おうと上記設定を参考にしていました。しかし、こちらの方法だと秘密鍵の保存に困ります。スマートな方法があるのかもしれませんが、複数人で管理するのであれば、Gitで管理することも考えないといけなくなってしまいます。そもそも鍵をGit管理するあまりセキュアではありませんし、Ansible化するにあたりここは避けたいところです。
ここでは公式でも示されているサービスアカウントの秘密鍵を使わなくても、Cloud SQL Proxyを介してCloud SQLと接続する方法を紹介していきます。
今回のイメージ
今回のイメージは以下の赤枠部分を想定しています。が、Appレイヤーのことはひとまず考えていないので別のインスタンスにAppが存在していても大丈夫です。(きっとその方がいい)
秘密鍵を作らないで接続する
今回は秘密鍵の作成を行わずにCloud SQL Proxyの設定を進めていきます。秘密鍵を作成する方法と比較できるようにステップを分けながら説明していきます。
サービスアカウントの扱い
秘密鍵を作成する方法ではサービスアカウントはほとんど使っていませんでしたが、今回の方法ではProxyを使うインスタンスに対して作成したサービスアカウントをアタッチします。このサービスアカウントのロールは公式にもある
- [Cloud SQL] > [Cloud SQL クライアント]
- [Cloud SQL] > [Cloud SQL 編集者]
- [Cloud SQL] > [Cloud SQL 管理者]
のいずれかを選択し、さらに今回は[プロジェクト] > [編集者]
を付与します。(権限が広すぎると公式では言われていますが、ここでは気にしないことにします。)GCEにデフォルトでアタッチされるサービスアカウントのロールに明示的にCloud SQLのロールを足すイメージになります。
鍵を使わないCloud SQL Proxyの設定
基本的には公式に沿った方法になりますが、一部変わるので一通り書いてきます。
あとは、公式に沿ったような作成方法になりますが、若干記述内容が変わるので、こちらも順をおって書いていきます。
- Cloud SQL Proxyのインストール
# cd /root
# wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy >> /root/
# chmod +x /root/cloud_sql_proxy
# chown root:root /root/cloud_sql_proxy
# mv /root/cloud_sql_proxy /usr/bin/
- ソケットになるディレクトリを作成する
# mkdir /cloud_sql
# chown root:root /cloud_sql
# chmod 777 /cloud_sql
- Cloud SQL Proxyの起動
<instance_connection_name>
はCloud SQLのインスタンス接続名を入力してください。
# cloud_sql_proxy -dir=/cloudsql -instances=<instance_connection_name> &
- Cloud SQL ProxyのSystemd化
[Unit]
Description = Cloud SQL Proxy Daemon
After = network.target
[Service]
ExecStart = /bin/cloud_sql_proxy -dir=/cloudsql -instances=<instance_connection_name>
ExecStop = /bin/kill ${MAINPID}
ExecReload = /bin/kill -HUP ${MAINPID}
Restart = always
Type = simple
LimitNOFILE=65536
[Install]
WantedBy = multi-user.target
- 自動起動設定
# systemctl start cloud_sql_proxy.service
# systemctl enable cloud_sql_proxy.service
以上の設定でCloud SQL Proxyのプロセスも起動して接続できるようになります。
まとめ
IaCを徹底したいためにTerraformやAnsibleを使っていますが、セキュリティ的鍵に当たるものはGit管理したくないですし、一方で秘密鍵だけ自分でインスタンスに置いたとしても冪等性は担保できなくなるし、といった思いでやりました。個人的には秘密鍵を使うよりシンプルじゃん?とか思っています。
今回書いたものをAnsible化させて、さらにサービスアカウントの作成やインスタンスへのアタッチをTerraformでできたら自動化も冪等性も担保できます。
明日のアドベントカレンダー
明日のアドベントカレンダーはSinclairさんの記事です!お楽しみに!