Cloud Workstations で構築する SQL 100本ノック環境 🏏

こんにちは。Enabling team の山本です。

みなさんは花粉症対策されていますか🌲？

「フラクトオリゴ糖」が花粉症に効果があると業務委託メンバーに聞き、自分の体を利用した実験を始めました。
次回の記事で、「フラクトオリゴ糖」の経過を書きたいと思います。
現時点では、キマってるような気がします 🤩✨

まえおきはこのくらいにして、今回は [Cloud Workstations（Workstations）](https://cloud.google.com/workstations?hl=ja)について書きます。

ご存じのとおり、Workstations は、Cloud 上に開発環境を構築できるサービスです。（記事作成時点では **Preview** です）
4月から始まる「新入社員研修の開発環境（SQL 100本ノック環境）」を構築するため、Workstations の設定を見ていきます。

## 新入社員研修の開発環境（SQL 100本ノック環境）
- 小売の現場を変革するためには、データを利用した意思決定が不可欠です。データの利活用の第１歩として、SQL の使い手になってもらう必要があります。
- 弊社の Engineer の端末は、Mac と Windows が混在しています。
Windows は、ソフトウェアのインストールが統制されており、自由にソフトウェアをインストールすることができません。

こういった理由から、Engineer の端末環境に依存しない開発環境を必要としていました。

要件は、以下のとおりです。
- 再現性。データが壊れても何度でも作り直せる。
- 期間限定。研修後は必要なくなる。
- セキュリティ。リモートワークで研修を進める期間があるためリーモートでログインできる。

## Cloud Workstations
Workstations は、Cluster 上の Node に IDE が preinstall されたサービスです。
- 使わない時は、停止できる。
- 一定時間未使用の場合は自動で停止される。
- 状態は Disk に保持される。
例えるなら Kubernetes の Deployment に remote でログインし操作するような環境です。
そこが Google の Security で保護されている。

今回、Workstations を新入社員研修の開発環境として運用してみることにしました。

## 課題１：Devcontainer（Remote Container）はどうする？
環境を構築し始めて、問題点に気づきました。
それは、Devcontainer が使えないことです。
SQL の研修として、Devcontainer の Docker（PostgreSQL）を使用するつもりでした。
しかし、Workstations で Devcontainer を使用できないようです。
そこで改めて Docs を読むと、こう書いてあります。
> VPC 内の実際の環境でコードを実行する
Cloud Workstations は VPC 内で実行可能なため、コードをプライベート ネットワークとステージング環境で開発して実行でき、サービスをエミュレートする必要はありません。

要するに、VPC に接続されているものであれば、Workstations から接続できる。
これを利用できれば、Devcontainer のようなことができます。
実際に、Code-OSS の Terminal から Compute Engine Instance に Ping してみると、以下のとおり通信できることがわかります。
```
user@workstation-danny:~/sitemap-submit$ ping 10.128.0.4
PING 10.128.0.4 (10.128.0.4): 56 data bytes
64 bytes from 10.128.0.4: icmp_seq=0 ttl=63 time=3.905 ms
64 bytes from 10.128.0.4: icmp_seq=1 ttl=63 time=0.430 ms
64 bytes from 10.128.0.4: icmp_seq=2 ttl=63 time=0.444 ms
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.430/1.593/3.905/1.635 ms
user@workstation-danny:~/sitemap-submit$ 
```

## 検証1
Workstations の PostgerSQL Tool で接続できるかを検証します。
今回は、Compute Engine に PostgreSQL をインストールします。

1. Compute Engine で Instance を起動する。
   ```
    yamamoto_daisuke@instance-1:~$ sudo apt update
   ```
1. PostgreSQL を Install する。
   ```
    yamamoto_daisuke@instance-1:~$ sudo apt install postgresql
    yamamoto_daisuke@instance-1:~$ psql --version
    psql (PostgreSQL) 13.9 (Debian 13.9-0+deb11u1)
   ```
1. PostgreSQL の User/Password を設定する。
   ```
    yamamoto_daisuke@instance-1:~$ sudo passwd postgres
    yamamoto_daisuke@instance-1:~$ su - postgres
    postgres@instance-1:~$ createuser --pwprompt --interactive sample1
    postgres@instance-1:~$ vi /etc/postgresql/13/main/postgresql.conf
    postgres@instance-1:~$ vim /etc/postgresql/13/main/pg_hba.conf
    postgres@instance-1:~$ exit
    yamamoto_daisuke@instance-1:~$ sudo systemctl restart postgresql
    yamamoto_daisuke@instance-1:~$ systemctl status postgresql
   ```
1. Code-OSS に PostgreSQL Tool の extension を追加する。
1. Code-OSS から PostgreSQL に接続する。
1. 接続成功❗️❗️❗️
![スクリーンショット 2023-03-14 6.38.34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569971/9d155fb7-15eb-4afb-376d-243d74bc84ad.jpeg)


## まとめ
Cloud Workstations について書きました。

途中、Devcontainer 問題で行き詰まりかけて焦りました 💦

ちなみに、僕が新入社員研修に関わるのは、今年が初めてです。

新入社員研修は、彼ら・会社・僕たちの未来に関わることですので、本気で向き合う必要があると思っています。

やれることは、100％取り組んで、また、来年の新入社員研修に活かせればと思います。