このドキュメントでは、GKE と Cloud SQL に Apache Guacamole をデプロイする方法について説明します。
この手順は、GKE と Cloud SQL で Guacamole をホストするサーバー管理者とエンジニアを対象としています。このドキュメントは、読者が Kubernetes と Cloud SQL for MySQL へのワークロードのデプロイに精通していることを前提としています。また、Identity and Access Management と Google Compute Engine についてもよく理解しておくことをおすすめします。
アーキテクチャ
次の図は、Google Cloud ロードバランサが IAP で構成され、これにより GKE で実行されている Guacamole クライアントのインスタンスが保護される仕組みを示しています。
Guacamole クライアントは、guacd バックエンド サービスに接続します。これは、1 つ以上の Compute Engine VM へのリモート デスクトップ接続を仲介します。また、このスクリプトでは、Guacamole の構成データを管理する Cloud SQL インスタンスもデプロイします。
詳細については、GKE および Cloud SQL の Apache Guacamole をご覧ください。
目標
- Terraform を使用してインフラストラクチャをデプロイします。
- Cloud SQL で Guacamole データベースを作成します。
- Skaffold を使用して Guacamole を GKE クラスタにデプロイします。
- Guacamole を介した VM への接続をテストします。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Resource Manager, Service Usage, Artifact Registry, and Compute Engine APIs.
-
In the Google Cloud console, activate Cloud Shell.
インフラストラクチャをデプロイする
このセクションでは、Terraform を使用して次のリソースをデプロイします。
- Virtual Private Cloud
- ファイアウォール ルール
- GKE クラスタ
- Artifact Registry リポジトリ
- Cloud SQL for MySQL
- MySQL データベースを管理するための VM
- サービス アカウント
Terraform 構成を使用すると、プロジェクトで IAP を使用できるようになります。
Cloud Shell で GitHub リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/guacamole-on-gcp.git
Terraform を使用して、必要なインフラストラクチャをデプロイします。
cd guacamole-on-gcp/tf-infra unset GOOGLE_CLOUD_QUOTA_PROJECT terraform init -upgrade terraform apply
手順に沿って Google Cloud プロジェクト ID を入力します。
Terraform のプロジェクトに対するリソースのデプロイ リクエストを承認するには、「
yes
」と入力します。すべてのリソースのデプロイの完了までには数分かかります。
Guacamole データベースをデプロイする
このセクションでは、Cloud SQL for MySQL で Guacamole データベースとテーブルを作成し、データベースに管理者ユーザー情報を入力します。
Cloud Shell で環境変数を設定し、データベースの root パスワードを確認します。
cd .. source bin/read-tf-output.sh
データベースの root パスワードをメモしておきます。これは次のステップで必要になります。
このスクリプトにより、Terraform の実行から出力変数を読み取ることができ、この手順全体で使用される次の環境変数を設定できます。
CLOUD_SQL_INSTANCE ZONE REGION DB_MGMT_VM PROJECT_ID GKE_CLUSTER GUACAMOLE_URL SUBNET
create-schema.sql
スクリプト ファイルとinsert-admin-user.sql
スクリプト ファイルをデータベース管理 VM にコピーしてから、VM に接続します。gcloud compute scp \ --tunnel-through-iap \ --zone=$ZONE \ create-schema.sql \ insert-admin-user.sql \ $DB_MGMT_VM: gcloud compute ssh $DB_MGMT_VM \ --zone=$ZONE \ --tunnel-through-iap
これにより、Cloud Shell を介したデータベース管理 VM へのコンソール セッションが確立されます。
MySQL クライアント ツールをインストールします。
sudo apt-get update sudo apt-get install -y mariadb-client
Cloud SQL に接続してデータベースを作成します。パスワードの入力を求められたら、このセクションで先ほどメモした root パスワードを入力します。
export CLOUD_SQL_PRIVATE_IP=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/cloud_sql_ip -H "Metadata-Flavor: Google") mysql -h $CLOUD_SQL_PRIVATE_IP -u root -p
新しく作成されたデータベースに対するデータベース ユーザー権限を付与します。
CREATE DATABASE guacamole; USE guacamole; GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole.* TO 'guac-db-user'; FLUSH PRIVILEGES; SOURCE create-schema.sql; SOURCE insert-admin-user.sql; quit
MySQL コマンドの実行が完了したら、VM SSH セッションを終了します。
exit
Skaffold を使用して Guacamole を GKE にデプロイする
このセクションでは、Skaffold を使用して、Guacamole アプリケーションを GKE クラスタにデプロイします。Skaffold は、Guacamole イメージのビルド、push、GKE クラスタへのデプロイのワークフローを処理します。
Cloud Shell で、Terraform を使用して GKE 構成をデプロイします。
cd tf-k8s terraform init -upgrade terraform apply -parallelism=1
GKE クラスタの認証情報を取得します。
gcloud container clusters get-credentials \ --region $REGION $GKE_CLUSTER
作成した git リポジトリのクローンの root から Skaffold を実行します。
cd .. skaffold --default-repo $REGION-docker.pkg.dev/$PROJECT_ID/guac-repo run
Skaffold ツールは、Google Cloud Build を使用して Guacamole のコンテナ イメージをビルドします(コマンドラインには、イメージを push するリポジトリを指定するフラグが含まれています)。また、このツールは kustomize ステップを実施し、Terraform 実行の出力に基づいて Kubernetes ConfigMap と Secret を生成します。
証明書がプロビジョニングされていることを確認します。
kubectl get -w managedcertificates/guacamole-client-cert \ -n guacamole \ -o jsonpath="{.spec.domains[0]} is {.status.domainStatus[0].status}"
証明書のプロビジョニングが完了するまでに、最長で 60 分ほどかかります。
証明書がプロビジョニングされたら、ブラウザで URL にアクセスできます。
Terraform output から URL を表示します。
echo $GUACAMOLE_URL
ブラウザ ウィンドウで、前の手順で取得した URL を入力します。
IAP のプロンプトが表示されたら、Google の認証情報でログインします。
ログイン後、前の手順で実行した
insert-admin-user.sql
スクリプトに基づいて、管理者権限で Guacamole にログインします。
Guacamole のユーザー インターフェースから、メールアドレスに基づいてユーザーを追加できるようになりました。詳細については、Guacamole ドキュメントの管理をご覧ください。これらの追加ユーザーには、Google IAM による権限と IAP-secured Web App User
ロールも必要です。
VM への接続をテストする
Guacamole をデプロイして構成し、ログインに成功したら、Windows VM を作成し、Guacamole を介して新しく作成された VM に接続できます。
VM を作成する
Cloud Shell で、Windows VM を作成して以下の接続をテストします。
export TEST_VM=windows-vm gcloud compute instances create $TEST_VM \ --project=$PROJECT_ID \ --zone=$ZONE \ --machine-type=n1-standard-1 \ --subnet=$SUBNET \ --no-address \ --image-family=windows-2019 \ --image-project=windows-cloud \ --boot-disk-size=50GB \ --boot-disk-type=pd-standard \ —-shielded-secure-boot
コマンドを実行した後、次のステップに進むには、Windows の初期化が完了するまで数分待つ必要がある場合があります。
作成した VM の Windows パスワードを再設定します。
gcloud compute reset-windows-password $TEST_VM \ --user=admin \ --zone=$ZONE
VM に新しい接続を追加する
- ブラウザ ウィンドウで、Skaffold を使用して Guacamole を GKE にデプロイするの Guacamole インスタンスの URL を入力し、IAP を介してログインします。
- Guacamole UI で、ユーザー名をクリックしてから [設定] をクリックします。
- [接続] タブで、[新しい接続] をクリックします。
- [名前] フィールドに、接続の名前を入力します。
- [ロケーション] フィールドに、接続のロケーションを入力します。
- [プロトコル] プルダウン リストから [RDP] を選択します。
[ネットワーク] の [ホスト名] フィールドに、作成した VM の名前(
windows-vm
)を入力します。プロジェクトの DNS は、このホスト名をインスタンスの内部 IP アドレスに解決します。
[認証] で、次のフィールドを設定します。
- ユーザー名:
admin
- パスワード: VM のパスワードを再設定したときに取得したパスワード
- セキュリティ モード:
NLA
(ネットワーク レベルの認証) サーバー証明書を無視する: チェックボックスをオンにします。
Compute Engine Windows VM にはリモート デスクトップ サービスの自己署名証明書がプロビジョニングされるため、証明書の検証の問題を無視するように Guacamole に指示する必要があります。
- ユーザー名:
[保存] をクリックします。
ユーザー名をクリックし、[ホーム] を選択します。
作成した接続をクリックして接続性をテストします。数秒後、VM インスタンスのデスクトップが表示されます。
Guacamole の構成の詳細については、Apache Guacamole のマニュアルをご覧ください。
クリーンアップ
この手順で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
新しいリソースを削除する
プロジェクト全体を削除する代わりに、この手順で作成した個々のリソースを削除することもできます。OAuth 同意画面の構成は、プロジェクトから削除することはできませんが、変更することはできます。
Cloud Shell で、Terraform を使用してリソースを削除します。
cd ~/guacamole-on-gcp/tf-k8s terraform destroy cd ~/guacamole-on-gcp/tf-infra terraform destroy gcloud compute instances delete $TEST_VM –-zone=$ZONE
次のステップ
- クラスタのセキュリティの強化に関する GKE のガイダンスを確認する。
- アプリケーション レイヤで Secret を暗号化するにより、データベース認証情報や OAuth 認証情報などの Secret のセキュリティを強化する方法を確認する。
- IAM Conditions で、Gacamole へのユーザー アクセスをより詳細に制御する方法を確認する。
- IAP インテグレーションの仕組みについて、GitHub リポジトリにあるカスタム認証プロバイダを確認する。
- Cloud アーキテクチャ センターで、リファレンス アーキテクチャ、図、ベスト プラクティスを確認する。