Cloud Workstationsを踏み台サーバとして使ってみよう（前編）

# はじめに
2023年5月にGoogle Cloudの[Cloud Workstations](https://cloud.google.com/workstations)がGAとなりました。クラウド上のマネージドなIDEとして注目を集めていますが、踏み台サーバとしても利用できるのではないでしょうか。従来、踏み台サーバはVMを立てて用意してきました。Cloud Workstationsを使えば、マネージドな踏み台サーバとして利用でき、**管理や構築の負担の低下、そしてコストの低下**も期待できるかもしれません。このブログでは、それらの可能性を見ていきます。

# 対象読者
企業向けにクラウドを利用しているなど、セキュリティが求められるクラウドを担当している方を想定しています。

# 結論
Cloud Workstationsを踏み台サーバとして<INS>利用することができます</INS>。従来のVMサーバで踏み台サーバを構成していた課題に対しては、管理や構築の負担は<INS>下がります</INS>。しかし、コストはケースバイケースで<INS>上下します</INS>。そのため、コストについてTCOの観点も含めて利用ケースに合うことを確認してから利用を検討しましょう。

# 目次
1. [踏み台サーバの必要性と管理負担の課題](#1-踏み台サーバの必要性と管理負担の課題)
2. [Cloud Workstationsを踏み台サーバとして使ってみる](#2-cloudworkstationsを踏み台として使ってみる)
3. [後編へつづく](#3-後編へつづく)

# 1. 踏み台サーバの必要性と管理負担の課題
セキュリティ要件の高いシステムでは、データベースなど、外部接続させないサーバの構築やメンテナンスに踏み台サーバが必要になりますね。Google Cloudでは、GCE、GKE、Cloud SQLをVPC上に<INS>プライベートに配置した場合（Public IPを付与しない場合）</INS>に踏み台サーバが必要になります。
![bastion_server_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/a4aaf43c-b16e-06d3-8d7a-740ca6aea22b.png "踏み台サーバのイメージ図")
具体的には次のような操作を行うための操作元として必要になります。
|操作対象|操作内容|
|:-|:-|
|プライベートなGCE|VM上のアプリやパッケージなどの操作|
|プライベートなGKE|kubectlによるK8Sの操作|
|プライベートなCloud SQL|SQL接続しテーブル作成、データ投入などの操作|


クラウドサービスは日々便利に進化しており、より管理負担が少なく、コストも抑えたマネージドサービスやサーバーレスを使ったクラウドネイティブな活用が進んでいます。そのような状況で、踏み台サーバは依然としてVMで用意する必要があったため、<INS>OS管理の負担</INS>、<INS>コスト削減の頭打ち</INS>、そして、<INS>安全なアクセス管理を用意する負担</INS>から解放されないでいたと思います。Cloud Workstationsをマネージドな踏み台サーバとして利用することができれば、これらの負担から解放されることが期待できそうです。

# 2. CloudWorkstationsを踏み台として使ってみる
まず最初に、そもそもCloud Workstationsが踏み台サーバとして使えるのか検証してみましょう。今回は、プライベートなCloud SQLへsql接続するための踏み台サーバをCloud Workstationsで用意してみます（ここでは、Cloud SQLのデータベースエンジンにMySQLを選択します）。
![Workstation_cloudsql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/3007df1b-74a0-063e-9a7c-0cecabdd0458.png "Cloud WorkstaionsからCloud SQLへ接続イメージ図")

## 2.1. カスタムコンテナイメージの作成
Workstation用にデフォルトで用意されているコンテナイメージには、MySQLクライアントが入っていません。そのため、デフォルトのイメージをベースに、MySQLクライアントをインストールしたカスタムコンテナイメージを作成します。作り方はとても簡単です。

### 2.1.1. Artifact Registryを用意
まず、Cloud Workstationsで使うカスタムイメージを登録するためのArtifact Registryを用意します。

Artifact Registryの形式はDockerを選んで作成します。このブログでは以下のコマンドで作成しています（[参考元](https://cloud.google.com/artifact-registry/docs/repositories/create-repos )）。
```:Artifact Registryを作成
gcloud artifacts repositories create cloud-workstations-customized-image-repo \
    --repository-format=docker \
    --location=asia-northeast1 \
    --async
```
出来上がったArtifact Registry
![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/d322436b-b1f4-294e-56d2-4a5622c4a3ad.png)

### 2.1.2. Dockerfileを作成
次の内容でDockerfileを作成します。
```:Dockerfile
FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest

RUN apt update && apt install -y \
    mariadb-client-core-10.3 \
 && rm -rf /var/lib/apt/lists/*
```
ベースイメージは、Google Cloudで[事前構成されたベースイメージ](https://cloud.google.com/workstations/docs/preconfigured-base-images "事前構成されたベースイメージ")から、Cloud Workstationsのデフォルトイメージを選択しています。ベースイメージのあとに、MySQLクライアントを追加でインストールしています。

### 2.1.3. Dockerイメージを作成
Dockerファイルを置いている場所で、作成したArtifact Registryに対するターゲットイメージパスを指定し、docker buildを実行してイメージを作成します（[参考元](https://cloud.google.com/workstations/docs/customize-container-images?hl=ja#build_a_custom_container_image "カスタム コンテナ イメージを構築する")）。
```:Dockerイメージ作成
# dockerコマンド書式 docker build [Dockerファイルを配置したフォルダ] -t [ターゲットイメージのパス:タグ]
docker build . -t asia-northeast1-docker.pkg.dev/t004-cloudworkstations-trial/cloud-workstations-customized-image-repo/ws-bastion-server:latest
```

### 2.1.4. Dockerイメージを登録
作成したDockerイメージをArtifact Registryへプッシュします（プッシュする前にArtifact Registryに対するdockerの認証設定をしています（[詳細はこちら](https://cloud.google.com/artifact-registry/docs/docker/store-docker-container-images#auth)））。
```:Dockerイメージの登録
# docker push [ターゲットイメージのパス:タグ] 
docker push asia-northeast1-docker.pkg.dev/t004-cloudworkstations-trial/cloud-workstations-customized-image-repo/ws-bastion-server:latest
```
登録されたDockerイメージ
![workstation_artifactregistry.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/408f252f-a279-a4f7-f473-e2b200f2b49b.png)


## 2.2. Workstation Clusterの作成
ここからWorkstationを作って行きます。コンソール画面とコマンドのどちらからも作ることができますが、今回はコマンドで作成します（[コマンドリファレンス](https://cloud.google.com/sdk/gcloud/reference/beta/workstations)）。最初にWorkstation Clusterを作成します。これは、Workstationの土台になるもので、リージョン、ネットワーク、パブリック/プライベートなどを選択して作成します。ここでは、今回の目的「踏み台としてCloud SQLにアクセスする」に絞って作成します（ネットワークはデフォルトのVPCとサブネット、Workstationへのアクセスはパブリックにします）。
※20分程度作成に時間がかかります
```:Workstation Clusterの作成
gcloud workstations clusters create bastion-ws-cluster --region=asia-northeast1
```
出来上がったWorkstation Cluster
![workstation_cluster.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/c1e2cfd0-e437-2872-37f7-3e7c6c77de44.png)

## 2.3. Workstation Configurationの作成
続いて、Workstation Configurationを作ります。ConfigurationはWorkstationのテンプレートです。WorkstationはマネージドなVM上で稼働するコンテナとして提供されます。Configurationは、そのVMの設定、コンテナイメージの指定などを行います。こちらも今回の目的にそって必要なオプションのみ設定します。
```:Workstation Configurationの作成
gcloud workstations configs \
    create bastion-ws-config \
    --machine-type e2-standard-2 \
    --region asia-northeast1 \
    --cluster bastion-ws-cluster \
    --container-custom-image \
    asia-northeast1-docker.pkg.dev/t004-cloudworkstations-trial/cloud-workstations-customized-image-repo/ws-bastion-server:latest
```
出来上がったWorkstation Configuration
![workstation_configuration.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/3b47216a-2097-2b28-3691-af115bdcacec.png)

## 2.4. カスタムイメージへのアクセス権を付与
Cloud WorkstationsのConfigurationに対してカスタムイメージへのアクセス権を付与します。Configurationにサービスアカウントが設定されています。デフォルトでは<foo>service-[プロジェクト番号]</foo>@gcp-sa-workstationsvm.iam.gserviceaccount.comというアカウントです。任意で変更できるため、用途に応じたサービスアカウントを作り、Workstationの権限を管理することができます。今回はデフォルトのアカウントを使います。
![workstation_configuration_serviceaccount_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/63cfa560-ac35-6f90-8b3a-2301e9e73a51.png)

カスタムイメージを配置したArtifact Registryのレポジトリで、Workstationのサービスアカウントに対して読み取り権限を設定します。
```:Artifact RegistryのIAM設定
gcloud artifacts repositories add-iam-policy-binding \
    cloud-workstations-customized-image-repo \
    --location='asia-northeast1' \
    --member='serviceAccount:service-888620181761@gcp-sa-workstationsvm.iam.gserviceaccount.com' \
    --role='roles/artifactregistry.reader'
```
権限付与したArtifactRegistry
![workstation_artifactregistry_authentication_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/c9bce09e-4db0-e171-ae80-f75cc1e397d5.png)

## 2.5. Workstationの作成
最後にWorkstationを作成して起動します。
```:Workstationの作成
gcloud workstations create \
    bastion-ws --region \
    asia-northeast1 --cluster \
    bastion-ws-cluster --config \
    bastion-ws-config
```
出来上がったWorkstation
![workstation.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/ac0bea90-4970-7802-4456-995a78c53fd7.png)
「START」をクリックしてWorkStationを起動します。

## 2.6. WorkstationからCloud SQLへアクセス
Workstationが起動したらLaunchをクリックし、Workstationへブラウザでアクセスします（gcloudコマンドを使ってsshで接続もできます）。
![workstation_launch.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/b26ff25a-0b9f-c11b-5a06-397dd9063d03.png)

Workstationへ接続したらターミナルを開きます。
![workstation_terminal_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/9980b5f2-1a5a-48d7-9888-57f355999b94.png)

カスタムイメージで作られたコンテナなので、mysqlクライアントが入っています。Cloud SQLのPrivate IPを確認して接続します。
![workstation_mysql_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534891/81794157-8022-e939-62d8-bdca322afc86.png)
Cloud SQLのデータベースに接続できました。今回はプライベートなCloud SQLへの接続を検証しましたが、同じ要領でプライベートなGCE、プライベートなGKEにもVPCネットワークの中でプライベートに接続することができます。

# 3. 後編へつづく
前編では、Cloud Workstationsを**踏み台サーバとして利用できる**ことが分かりました。後編では、VMで踏み台サーバを構成していた時の課題が解決されるかを見ていきます。

[「Cloud Workstationsを踏み台サーバとしても使ってみよう（後編）」へのリンク](https://qiita.com/tkhn/items/bb8a8f099927e5109c63)